UnitTest Rule

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

  1. อย่า test module ภายนอก, ข้อนี้เจอช่วงแรกๆ ตอนนี้ที่ทดลอง process เพราะมี third party component หนึ่งที่ต้องเรียกก่อนจะเรียกใช้ method อื่นได้เวลาทำงานจริง ตอนเขียน test น้องๆก็เลยหวังดีเขียน case ครอบด้วยว่า third party ทำงานสำเร็จไหม ซึ่งไม่จำเป็นเลยสำหรับ UnitTest และกลายเป็นว่า case นั้นเป็นการ test third party แทนและ case นี้ถูกเขียนซ้ำบ่อยสุด จนเป็นตัวขัดขวางทำให้เขียน test ยากขึ้นในอนาคตเมื่อ third party เปลี่ยน API
  2. สร้าง Mock/Stub เมื่อต้องทดสอบกับ third party, สิ่งหนึ่งที่มักเป็นปัญหาขัดขวางการสร้าง UnitTest คือ third party ที่เราไม่สามารถควบคุมการเปลี่ยนแปลงได้ แต่สิ่งหนึ่งที่เรารู้คือ method ที่เราเรียกใช้, สิ่งที่เราส่งเข้าไปและผลลัพธ์ที่เราคาดหวังจาก third party ในช่วงแรกที่เข้าไปดู เจอว่าน้องๆ เล่น test กับ third party จริงเลย เวลาจะ test ทีก็ต้อง start third party ให้ทำงานก่อนที่จะ test ทำให้เรียก test ยากขึ้นและความถี่ในการ run test ลดลง ผลคือ test ที่ถูก maintain ลดลงและพังมากขึ้น สุดท้าย test ก็ไร้ประโยชน์ แต่การสร้าง Mock/Stub ก็ไม่ใช้จะสร้างแทนทุกอย่าง ถ้าเป็น component ภายในก็ไม่จำเป็นต้องสร้างเพื่อเพิ่มงานให้ตัวเอง
  3. อย่าเชื่อม UnitTest, ข้อนี้เป็นข้อที่แก้ยากสุดโดยเฉพาะการสร้าง UnitTest กลุ่ม CRUD เพราะมักคิดว่าจะ อ่าน(read), แก้ไข(update) และ ลบ(delete) ได้ก็ต้อง สร้าง(create) ก่อนหรือเมื่อ สร้าง(create) แล้วจะทดสอบว่าสำเร็จก็ต้อง อ่าน(read) ออกมา วิธีแก้ต้องใช้ตัวช่วยสองอย่างคือ Mock/Stub และ Fixture. Fixture มีไว้สำหรับให้ทดสอบโดยไม่ต้องเรียก create ก่อนโดยการเตรียมข้อมูลเบื้องต้นไว้ เมื่อเปลี่ยนแปลงอะไรก็สำรวจว่าข้อมูลเบื้องต้นนั้นเปลี่ยนไปอย่างที่เราต้องการหรือไม่ การสำรวจว่าข้อมูลนั้นเปลี่ยนแปลงไปก็ต้องผ่าน Mock/Stub หรือ component อื่นที่สิ่งที่เราทดสอบเรียกผ่านอีกที สาเหตุที่ UnitTest ไม่ควรเชื่อมกันก็เพราะว่าหากมีกรณีใดกรณีหนึ่งที่ผิดพลาดสามารถรู้ถึงขอบเขตได้ว่ามันผิดพลาดที่ส่วนไหนอย่างละเอียด

ตอนนี้พยายามบังคับแค่สามกรณีนี้ก่อนถ้าเจออะไรที่ทำให้ test ยากอีกค่อยมาเพิ่มหรือเขียนเป็นอีก post อีกที

About llun

Just a programmer

,