mycodecantfail
จากงาน Agile Singapore 2014 นั้น
มี session ชื่อว่า Programming with GUTs โดยคุณ Kevlin Henney
แน่นอนว่าสำหรับ developer นั้นการเขียน test เป็นเรื่องที่ต้องทำอยู่แล้ว
แต่บ่อยครั้งมักพบว่า test เหล่านั้นที่เขียนขึ้นมาไม่ค่อยมีประสิทธิภาพเท่าไรนัก
ทำให้ส่งผลต่อการพัฒนาระบบงาน
ดังนั้น มาดูว่าการเขียน test ที่ดีนั้นมันเป้นอย่างไร
ซึ่งอธิบายด้วยคำว่า GUTs (Good Unit Tests)

ในการเขียน test ที่ดีนั้น จำเป็นต้องใช้ความรู้มากมายพอสมควรในการสร้าง
ซึ่งการ test นั้นมันคือ ตัวแทนของการสื่อสารรูปแบบหนึ่ง
มันจะทำการส่ง feedback กลับมาให้เราในหลายๆ ระดับ
โดย test ที่ดีมันควรอยู่ในรูปแบบที่เข้าใจง่าย สื่อสารได้ง่าย
ดังนั้นรูปแบบของ test จึงต้องดีเช่นกัน

การเขียน test ส่วนใหญ่เรามักจะทำตามแนวคิดของ TDD (Test-Driven Development)
นั่นคือจะเขียน test ก่อนเขียน code จริงๆ
ซึ่งเป็นแนวทางของ developer ที่มีความเป็นมืออาชีพ
แต่มันยังไม่พอนะ เพราะว่า test ที่คุณเขียนขึ้นมานั้น มันจะต้องเป็น test ที่ดีด้วย
จึงจะเรียกได้ว่า คุณเป็น developer มืออาชีพ
ดังนั้นแนวทางของ TDD มันคือเส้นทางหนึ่งของ GUTs เลยนะ

Developer มืออาชีพ ต้องทำ TDD และ GUTs นะ

คำจำกัดความของ GUTs (Good Unit Tests) เป็นอย่างไร

สิ่งที่น่าสนใจของ GUTs คือ มันเป็นคำที่ใช้อธิบายคุณลักษณะของ test
ไม่ว่าจะเขียน ก่อน หรือ หลัง code
ดังนั้น จะไม่มี drama ว่าคุณต้องทำตามแนวคิด TDD หรือไม่ ( TDD คือวิธีการหนึ่งที่ทำให้ได้ GUTs )

จากหนังสือ 97 Things Every Programmer Should Know เขียนไว้ว่า
คำถาม
ในการเขียน test นั้น สิ่งที่ต้องคำนึงคือ คุณเขียนให้ใคร เพื่อใคร ?
คำตอบ
สำหรับคนที่ต้องการทำความเข้าใจกับ code ไงล่ะ

ดังนั้น test ที่ดี ต้องเป็นตัวแทนของเอกสารเพื่ออธิบาย code
ว่า code ทำงานอย่างไร ในแต่ละ scenario
ดังนั้น test ควรจะมีรูปแบบดังนี้

  • อธิบาย context ว่าอยู่ที่ไหน
  • เริ่มต้นการทำงานที่ตรงไหน
  • บอกเงื่อนก่อนเริ่มทำงาน
  • แสดงให้เห็นภาพว่า ระบบงานทำงานอย่างไร เช่นขั้นตอนการทำงานต่างๆ ที่เกิดขึ้น
  • ทำการอธิบายผลลัพธ์ที่คาดหวัง หรือ เงื่อนไขต่างๆ หลังจากการทำงานเสร็จสิ้น

โดยในแต่ละ scenario ควรแยกออกจากกันให้ชัดเจน
ให้จำไว้ว่า เรา Write test for People นะครับ

ตัวอย่างของ test ที่ดี เช่น

  • ในแต่ละ test ต้องมีชื่อ test ที่ดี นั่นคือ อ่านเข้าใจได้ง่าย และ ทันที ไม่ต้องมานั่งตีความ
  • ในแต่ละ test ควรมีเป้าหมาย หรือ ตรวจสอบเพียงเรื่องเดียว หรือ อย่างเดียว นั่นคือการเคารพใน SRP (Single Responsibility Principle)
  • ในแต่ละ test ควรมีโครงสร้างที่ดี เช่น AAA (Arrange Act Assert)
  • test ที่ดีควรเป็นอิสระจาก code

แต่มันยากมาก ที่จะเขียน test ให้ได้ดี เนื่องจาก

  • ปัญหาที่แก้ไขนั้นมีความซับซ้อนที่เรารู้
  • ปัญหาที่แก้ไขนั้นมีความซับซ้อนที่เราไม่รู้
  • ความไม่แน่นอนในการทำงานของ code ว่าจริงๆ แล้วทำงานอย่างไร
  • ขาดความรู้ในเรื่องการทดสอบ ทำให้ไม่สามารถคิดได้ว่าจะต้องทำสอบอะไรบ้าง และ อะไรก่อนหลัง

แนวปฏิบัติของการทดสอบที่ดี ประกอบไปด้วย

  • Test Early คือ ทดสอบตั้งแต่เนิ่นๆ
  • Test Often คือ ทดสอบอยู่บ่อยๆ
  • Test Automatically คือ ต้องทำการทดสอบแบบอัตโนมัติ

ถ้าไม่สามารถทำได้ตามแนวปฏิบัติ แสดงว่า คุณควรปรับปรุงวิธีการทดสอบได้แล้ว

Real developer/programmer have GUTs

Tags:,