C# C-Sharp คือ ตอนที่ 13 : การทดสอบหน่วย (Unit Testing)

  1. ทำความเข้าใจเกี่ยวกับการทดสอบหน่วย (Unit Testing)
  2. ความสำคัญของ Unit Testing ในการทำแอพ
  3. การทดสอบหน่วย (Unit Testing) ใน C #
  4. แนวคิดขั้นสูงในการทดสอบหน่วย (Unit Testing)
  5. การรวมการทดสอบหน่วย (Unit Tests) ใน DevOps

ในขอบเขตของการทำแอพ คุณภาพคือทุกสิ่ง และตัวชี้วัดคุณภาพที่สำคัญประการหนึ่งสำหรับแอปพลิเคชันซอฟต์แวร์คือการไม่มีจุดบกพร่องหรือข้อบกพร่อง เพื่อให้มั่นใจว่าแอปพลิเคชันมีคุณภาพสูงและเชื่อถือได้ นักพัฒนาซอฟต์แวร์ต้องตรวจสอบการทำงานของโค้ดของตนตามที่คาดไว้ภายใต้เงื่อนไขที่หลากหลาย นี่คือจุดที่การทดสอบหน่วยกลายเป็นส่วนสำคัญของการทำแอพ

1. ทำความเข้าใจเกี่ยวกับการทดสอบหน่วย (Unit Testing)

การทดสอบหน่วย คือระดับของการทดสอบซอฟต์แวร์ที่มีการทดสอบส่วนประกอบแต่ละส่วนของซอฟต์แวร์ โดยหลักแล้วจะใช้เพื่อตรวจสอบว่าส่วนประกอบหรือหน่วยของซอฟต์แวร์แต่ละตัวทำงานได้ตามที่ออกแบบไว้ ในบริบทของ C# และ .NET หน่วยอาจเป็นเมธอดในคลาส โดยที่เมธอดและคลาสนั้นเป็นส่วนหนึ่งของแอปพลิเคชันที่ใหญ่กว่า เป้าหมายคือการแยกแต่ละส่วนของโปรแกรมและตรวจสอบความถูกต้องซึ่งอาจเป็นงานที่เป็นไปไม่ได้หากมีการตรวจสอบข้อผิดพลาดในบริบทของแอปพลิเคชันที่ใหญ่กว่าเท่านั้น

2. ความสำคัญของ Unit Testing ในการทำแอพ

การทดสอบที่ระดับหน่วยในระหว่างการทำแอพช่วยให้นักพัฒนาสามารถตรวจจับและแก้ไขจุดบกพร่องและปัญหาต่างๆ ได้ตั้งแต่เนิ่นๆ ของกระบวนการพัฒนา ช่วยประหยัดเวลา ความพยายาม และค่าใช้จ่ายในระยะยาว

การทดสอบหน่วยมีประโยชน์หลายประการในการทำแอพ รวมถึง:

  • ข้อเสนอแนะด่วน (Quick Feedback) : การทดสอบหน่วยจะให้ข้อเสนอแนะทันทีแก่นักพัฒนาเกี่ยวกับปัญหาที่อาจเกิดขึ้นในโค้ดของพวกเขา หากการทดสอบหน่วยล้มเหลว แสดงว่ามีบางอย่างผิดปกติกับโค้ดและจำเป็นต้องดำเนินการแก้ไขทันที
  • การบำรุงรักษาและการปรับโครงสร้างที่ง่ายขึ้น : ด้วยชุดการทดสอบหน่วยที่คุณมี คุณสามารถปรับโครงสร้างโค้ดหรือเพิ่มคุณสมบัติใหม่ได้อย่างมั่นใจ หากการเปลี่ยนแปลงมีบางอย่างผิดพลาด การทดสอบหน่วยของคุณจะชี้ให้เห็นอย่างรวดเร็วถึงสิ่งที่ผิดพลาด
  • การออกแบบที่ได้รับการปรับปรุง : การทดสอบหน่วยการเขียนมักจะบังคับให้นักพัฒนาคิดเกี่ยวกับการออกแบบโค้ดของตนและวิธีที่ส่วนประกอบต่างๆ โต้ตอบกัน ซึ่งจะนำไปสู่โค้ดที่มีโครงสร้างที่ดีขึ้นและสามารถบำรุงรักษาได้มากขึ้น
  • เอกสาร : การทดสอบหน่วยสามารถใช้เป็นรูปแบบหนึ่งของเอกสาร ซึ่งแสดงให้เห็นว่าเมธอดหรือฟังก์ชันมีไว้เพื่อใช้งานอย่างไร และคาดว่าจะได้ผลลัพธ์อย่างไร

3. การทดสอบหน่วย (Unit Testing) ใน C #

มีหลาย framework สำหรับการเขียน unit test ใน C# ที่ใช้กันมากที่สุดคือ MSTest, NUnit และ xUnit.net

สำหรับการสำรวจการทดสอบหน่วย เราจะใช้เฟรมเวิร์ก NUnit เนื่องจากใช้กันอย่างแพร่หลายในอุตสาหกรรม และมีการอัปเดตบ่อยครั้งเพื่อรวมคุณสมบัติและการปรับปรุงใหม่ๆ อย่างไรก็ตาม หลักการที่เรากล่าวถึงในที่นี้จะนำไปใช้กับกรอบการทดสอบหน่วยใดก็ได้

หากต้องการติดตั้ง NUnit และอะแดปเตอร์ทดสอบ NUnit (ซึ่งอนุญาตให้ Visual Studio ค้นพบการทดสอบ NUnit) คุณสามารถใช้ NuGet ซึ่งเป็นตัวจัดการแพ็คเกจสำหรับ .NET

เมื่อคุณเพิ่ม NUnit ในโครงการของคุณแล้ว คุณสามารถเริ่มเขียนการทดสอบหน่วยได้ การทดสอบหน่วยใน C# เป็นวิธีการในชั้นเรียน เมธอดประกอบด้วยการยืนยันที่ตรวจสอบพฤติกรรมของคอมโพเนนต์ที่คุณกำลังทดสอบ

ต่อไปนี้คือตัวอย่างลักษณะการทดสอบหน่วยอย่างง่ายใน C#:

[Test]
public void TestAddition()
{
    // Arrange
    var calculator = new Calculator();

    // Act
    var result = calculator.Add(2, 2);

    // Assert
    Assert.AreEqual(4, result);
}

ในการทดสอบนี้ เรากำลังทดสอบCalculatorคลาสสมมุติและAddวิธีการ ของมัน แอตทริบิวต์Testบอก NUnit ว่าวิธีนี้เป็นวิธีการทดสอบ เมธอด นี้Assert.AreEqualใช้เพื่อตรวจสอบว่าAddเมธอดส่งคืนผลลัพธ์ที่คาดไว้

รูปแบบ Arrange-Act-Assert (AAA) เป็นวิธีทั่วไปในการเขียนแบบทดสอบหน่วย ช่วยให้แยกสิ่งที่กำลังทดสอบได้อย่างชัดเจน:

  • Arrange : ตั้งค่าวัตถุและข้อมูลที่คุณต้องการสำหรับการทดสอบของคุณ
  • Act : เรียกใช้เมธอดหรือฟังก์ชันที่คุณกำลังทดสอบ
  • Assert : ตรวจสอบว่าเมธอดหรือฟังก์ชันทำงานตามที่คาดไว้

4. แนวคิดขั้นสูงในการทดสอบหน่วย (Unit Testing)

แม้ว่าการทดสอบข้างต้นจะเป็นเพียงตัวอย่างพื้นฐาน แต่การทดสอบหน่วยในโลกแห่งความเป็นจริงอาจซับซ้อนกว่ามาก ต่อไปนี้เป็นหัวข้อขั้นสูงอีกสองสามหัวข้อในการทดสอบหน่วย:

  • ทดสอบสองเท่า (Test Doubles) : ในบางครั้ง วิธีที่คุณกำลังทดสอบอาศัยส่วนประกอบอื่นๆ ที่ไม่ได้รับการทดสอบ ส่วนประกอบอื่นๆ เหล่านี้สามารถแทนที่ได้ด้วย “test doubles” ซึ่งเป็นตัวยึดตำแหน่งที่เลียนแบบลักษณะการทำงานของส่วนประกอบจริง
  • Mocking : ประเภทของการทดสอบสองเท่า การ Mocking สามารถตั้งโปรแกรมให้ทำงานในลักษณะบางอย่างได้ เช่น การส่งคืนค่าเฉพาะเมื่อเรียกใช้เมธอดหรือการโยนข้อยกเว้นในบางสถานการณ์ กรอบ Mocking เช่น Moq สามารถใช้เพื่อสร้างการ Mocking ได้อย่างง่ายดาย
  • การทดสอบที่ขับเคลื่อนด้วยข้อมูล : ในบางกรณี คุณอาจต้องการเรียกใช้การทดสอบเดียวกันหลายครั้งโดยใช้อินพุตที่แตกต่างกัน NUnit อนุญาตสิ่งนี้ด้วยคุณสมบัติเช่นแอตทริบิวต์ TestCase และ TestCaseSource
  • ความครอบคลุมของโค้ด : นี่คือเมตริกที่สามารถบอกคุณได้ว่าการทดสอบหน่วยครอบคลุมส่วนใดของโค้ดฐานของคุณ เครื่องมือเช่น DotCover สามารถสร้างรายงานการครอบคลุมโค้ดสำหรับแอปพลิเคชัน .NET

5. การรวมการทดสอบหน่วย (Unit Tests) ใน DevOps

การทำแอพสมัยใหม่แทบจะไม่เสร็จสมบูรณ์เลยหากไม่มีการผสานรวม DevOps บางรูปแบบ และการทดสอบหน่วยก็ไม่มีข้อยกเว้น ไปป์ไลน์การผสานรวมอย่างต่อเนื่อง/การปรับใช้อย่างต่อเนื่อง (CI/CD) สามารถกำหนดค่าให้รันการทดสอบหน่วยโดยอัตโนมัติ เมื่อใดก็ตามที่โค้ดถูกส่งไปยังที่เก็บ หรือในเวลาอื่นๆ ที่ระบุ ซึ่งช่วยให้มั่นใจได้ถึงการตรวจสอบคุณภาพอย่างต่อเนื่อง ช่วยลดโอกาสที่โค้ดจะบกพร่องในสภาพแวดล้อมการผลิตได้อย่างมาก


การทดสอบหน่วยเป็นองค์ประกอบสำคัญของการทำแอพ C# แบบมืออาชีพ ช่วยตรวจจับข้อบกพร่องในช่วงต้นของกระบวนการพัฒนา ทำให้การบำรุงรักษาโค้ดง่ายขึ้น และปรับปรุงคุณภาพโค้ดโดยทั่วไป การทดสอบหน่วยอาจดูเหมือนต้องใช้เงินลงทุนล่วงหน้า แต่ประโยชน์ที่ได้รับโดยเฉพาะอย่างยิ่งในโครงการขนาดใหญ่ที่ซับซ้อนนั้นมีค่ามาก ด้วยการทำความเข้าใจและใช้ Unit Testing ในโครงการ C# ของคุณอย่างเหมาะสม คุณจะสามารถเพิ่มความทนทานและความน่าเชื่อถือของแอปได้อย่างมาก ทำให้มั่นใจได้ว่าผู้ใช้ปลายทางจะได้รับประสบการณ์ที่ดี


C# C-Sharp คืออะไร

C# C-Sharp คือ ตอนที่ 12 : การเข้าถึงข้อมูลด้วย Entity Framework
C# C-Sharp คือ ตอนที่ 14 :.NET Core และ .NET 5/6 คืออะไร