F.I.R.S.T Principles ของ Unit Test

ถ้าพูดถึงคุณสมบัติของ unit test ที่ดี มันจะมีชุดของคุณสมบัติหนึ่งที่เรียกว่า F.I.R.S.T Principles ซึ่งเขียนอยู่ในหนังสือที่ชื่อ Clean Code ที่เขียนโดย Robert C. Martin (Robert Cecil Martin)

F.I.R.S.T

จากชื่อ F.I.R.S.T Principles ก็น่าจะเดาได้ไม่ยากว่ามันเป็นชื่อย่อแน่ ๆ แล้วก็ตามที่เข้าใจนั่นแหละ มันมาจากชื่อย่อของคุณสมบัติต่าง ๆ ที่ดีของ unit test ตามนี้

Fast

ตรงตัวมาก Fast แปลว่าเร็ว เร็วในที่นี้คือเร็วจริง ๆ เร็วโคตร ๆ สามารถรันได้จบภายในเสี้ยววินาที นั่นหมายถึงทุกครั้งที่เรามีการแก้ไขโค้ดเราจะสามารถรู้ได้ทันทีว่าเกิดปัญหาขึ้นแล้วหรือไม่

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

Independent

Independent คือ unit test จะต้องไม่ขึ้นต่อกัน การรัน unit test จะต้องสามารถรันได้โดยไม่สนลำดับก่อนหลัง test case ที่ 1 จะต้องไม่ส่งผลกระทบกับ test case ที่ 2 ดังนั้น เราจะไม่เขียน test case หนึ่ง แล้วเอาผลลัพธ์ไปใช้กับ test case ที่สอง

ถ้า unit test มันขึ้นต่อกัน นั่นแปลว่า ถ้า test case หนึ่งรันไม่ผ่าน มันจะทำให้ test case อื่น ๆ ที่เกี่ยวข้องกันไม่ผ่านไปด้วย และพอมันไม่ผ่านเต็มไปหมด การหาว่ามันผิดตรงไหนก็จะยากขึ้นไปอีก

Repeatable

Repeatable คือ สามารถที่จะรันซ้ำ ๆ ได้ ไม่ว่าจะอยู่ในสถานการณ์ไหนก็ตาม เช่น อยู่ในสถานที่ที่ไม่มี network ก็ยังจะต้องรันได้เหมือนเดิม และจะต้องให้ผลเหมือนเดิมเสมอ (Idempotent)

สิ่งที่จะทำให้ test case สามารถรันได้ซ้ำ ๆ คือ การที่เราสามารถกำหนดและควบคุมสภาพแวดล้อมในการรันได้ทั้งหมด ไม่ว่าจะเป็นการใช้ Setup/Teardown ที่เหมาะสม รวมถึงการใช้ Test double ในการทดสอบ

Self-Validating

Self-Validating หมายถึงการที่ผลลัพธ์จากการทดสอบควรจะมีค่าที่ตรงไปตรงมาว่าผ่านหรือไม่ผ่านเท่านั้น ไม่ควรจะต้องเอาไปตีความอย่างอื่นอีก ดังนั้น ถ้าเราต้องการเปรียบเทียบผลลัพธ์จากสร้างไฟล์ว่าถูกต้องหรือไม่ เราก็ควรจะมีวิธีการเปรียบเทียบไฟล์ผลลัพธ์กับไฟล์ที่ควรจะเป็นแล้วให้ผลลัพธ์ออกมาเป็นว่าเหมือนหรือไม่เหมือน ไม่ควรจะต้องมีกระบวนการตรวจสอบด้วยวิธี manual ใด ๆ เกิดขึ้นอีก

Timely

Timely ในที่นี้หมายถึงถูกเวลา นั่นคือ unit test ควรจะเขียนตอนที่เรากำลังจะเริ่มเขียน code ในเรื่องนั้น ๆ ไม่ใช่เกิดขึ้นหลังจากเขียน code แล้ว เพราะว่า การเขียน test หลังจากที่เขียน code แล้ว สิ่งที่อาจจะเกิดขึ้นได้คือความยากในการเขียน test เพราะบางครั้ง code เราอาจจะซับซ้อนมากเกินกว่าจะเขียน test ได้ง่าย ๆ แล้ว นอกจากนี้ มีความเป็นไปได้สูงมาก ที่เราจะเขียน test เพียงเพื่อให้ test ผ่าน โดยไม่ได้สนใจว่าจริง ๆ แล้ว สิ่งที่ test ควรจะ focus คือ การยึดเอาตัว requirement ของ method นั้น ๆ เป็นหลักนั่นเอง (การที่เราเขียน Test ก่อน Code เราเรียกอีกอย่างหนึ่งว่า Test-First)

ข้อดีอย่างหนึ่งของการเขียน Test-First คือ การที่เราจะได้ code ที่ง่าย และมีฟีเจอร์เพียงพอต่อการใช้งานตาม business requirement ที่เราได้รับมานั่นเอง และแน่นอน code เราจะสะอาดขึ้น ดูดีขึ้นอีกเยอะ

ส่งท้าย

การที่ unit test ที่เราเขียนขึ้นมามันมีคุณสมบัติตาม F.I.R.S.T Principles แล้ว ข้อดีของมันก็คือ unit test ของเราจะง่าย ตรงไปตรงมา สามารถรันได้ซ้ำ ๆ และมี feedback loop ที่เร็วมากพอที่จะทำให้เราสามารถรู้ถึงปัญหาที่เกิดขึ้นได้ก่อนจะสายเกินไป และแถมว่าเราจะได้โค้ดที่เพียงพอต่อ business requirement โดยไม่ไปสร้างโค้ดที่ซับซ้อนโดยไม่จำเป็น

Leave a Reply

Your email address will not be published. Required fields are marked *