เมื่อซอฟต์แวร์เติบโตขึ้นจนมีฟีเจอร์มากมาย การเขียนโค้ดโดยไม่มีการทดสอบอาจนำไปสู่ปัญหาที่ตรวจไม่พบจนกว่าจะเกิดความผิดพลาดขึ้นจริง การเขียน Test หรือ Unit Test จึงเป็นเครื่องมือสำคัญที่ช่วยให้โปรแกรมทำงานได้อย่างถูกต้องและลดเวลาในการแก้บั๊ก
Unit Test คืออะไร?
Unit Test คือการทดสอบฟังก์ชันหรือส่วนเล็ก ๆ ของโปรแกรมอย่างเฉพาะเจาะจง โดยจะทดสอบให้แน่ใจว่าส่วนย่อยนั้นทำงานตรงตามที่ออกแบบไว้ เช่น การทดสอบฟังก์ชันคำนวณภาษี, การตรวจสอบเงื่อนไข login หรือการแปลงข้อมูลสิ่งต่าง ๆ
ข้อดีของการเขียน Unit Test
- ช่วยลดโอกาสเกิดบั๊ก
- ทำให้การเปลี่ยนแปลงโค้ดในอนาคตทำได้มั่นใจมากขึ้น
- สะดวกในการ refactor โค้ด
- ทำให้โค้ดของคุณถูกออกแบบมาให้แยกส่วนและอ่านง่ายขึ้น
- ช่วยให้เข้าใจ business logic ได้ดีขึ้นเมื่อกลับมาอ่านโค้ดในอนาคต
พื้นฐานที่ควรรู้ก่อนเขียน Unit Test
ก่อนจะเริ่มเขียน Unit Test คุณควรเข้าใจโครงสร้างของโค้ดและแนวคิดของ test framework ที่คุณจะใช้ ตัวอย่างเช่นในภาษา Python มักนิยมใช้ unittest หรือ pytest ส่วนใน JavaScript มักนิยมใช้ Jest, และใน Java ก็มี JUnit
ทั่วไปของ Unit Test
- เตรียมข้อมูลเพื่อใช้ในการทดสอบ (Arrange)
- เรียกใช้ฟังก์ชันที่ต้องการทดสอบ (Act)
- ตรวจผลลัพธ์ว่าตรงตามที่คาดหรือไม่ (Assert)
ตัวอย่างการเขียน Unit Test แบบง่าย
ภาษา Python ด้วย unittest
def add(a, b):
return a + b
import unittest
class TestMathFunction(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
self.assertEqual(add(-1, 1), 0)
if __name__ == '__main__':
unittest.main()
ในตัวอย่างด้านบน เราเขียน test case สำหรับฟังก์ชัน add() โดยใช้ assertEqual เพื่อตรวจสอบผลลัพธ์ที่คาดหวัง
แนวปฏิบัติที่ดีในการเขียน Unit Test
- ตั้งชื่อ test case ให้สื่อความ เช่น
test_add_positive_numbers - แต่ละ test ควรทดสอบเพียงสิ่งเดียว
- หลีกเลี่ยงการเขียน test ที่ขึ้นกับค่า external เช่น API หรือฐานข้อมูล
- เมื่อพบข้อผิดพลาด ให้เขียน test ก่อนแก้ เพื่อป้องกันการพลาดส่วนอื่น ๆ (TDD – Test Driven Development)
เครื่องมือและ Framework ยอดนิยม
| ภาษา | Framework |
|---|---|
| Python | unittest, pytest |
| JavaScript | Jest, Mocha |
| Java | JUnit |
| PHP | PHPUnit |
| C# | xUnit, NUnit |
เริ่มต้นอย่างไรดี?
เริ่มจากฟังก์ชันเล็กที่สุดที่สามารถแยกออกมาได้ก่อน เริ่มจากการเขียน test ง่าย ๆ อย่างการตรวจสอบค่าคำตอบที่แน่นอน เมื่อเข้าใจหลักการแล้วค่อยขยายไปยัง use case ที่ซับซ้อนขึ้น เช่น การใช้ mock object หรือ testing asynchronous
เมื่อคุณมีชุดของ Unit Test ที่ดี สิ่งหนึ่งที่จะตามมาคือความมั่นใจ ทุกครั้งที่ปรับปรุงหรือเพิ่มฟีเจอร์ใหม่ หาก test ยังผ่านทั้งหมด แสดงว่าโค้ดเดิมยังคงใช้งานได้ตามต้องการ
การเริ่มเขียน Unit Test อาจไม่ได้ง่ายในช่วงแรก แต่อย่าลืมว่า test คือเพื่อนที่ดีที่สุดของนักพัฒนา เริ่มต้นวันนี้ แล้วคุณจะขอบคุณตัวเองในวันหน้า
