Unit Test คืออะไร ?

ไปตอบคำถามในฟอรัมหนึ่ง เรื่องของ Unit Test เขาถามว่ามันคืออะไร ผมก็อธิบายไปประมาณนึง เห็นว่าน่าสนใจก็เลยเอามาแชร์ให้ฟังพร้อมเพิ่มเนื้อหา

Unit test คือการทดสอบตัว Code Unit โดยทั่วไปอาจจะหมายถึง ฟังก์ชั่น หรือเมธอด การทดสอบนั้นมีเพื่อเอาไว้ยืนยันว่าแต่ละยูนิทนั้นทำงานได้ถูกต้อง

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

สมมติ เช่น ผมมีฟังก์ชั่นที่คืนค่าสัมบูรณ์ของ input ใด ๆ

int absolute(const int& a);

ผมสามารถเขียนโปรแกรมเพื่อทดสอบฟังก์ชั่นนี้ได้ดังนี้

void test_absolute() {
  assert(absolute(10) == 10);
  assert(absolute(-5) == 5);
  assert(absolute(0) == 0);
}

ถ้าโปรแกรมเราทำงานไม่ถูกต้องก็จะพัง ถูกไหมครับ พอเรารู้ว่ามันพังเราก็จะรู้ว่า อ๋อ ฟังก์ชั่นนี้ทำงานผิดนะ เราก็ต้องแก้โปรแกรม ซึ่งเราจะแก้แล้วรันใหม่กี่ครั้งก็ได้ตามแต่ที่ต้องการ

ในปัจจุบันการทำ Unit Test จะอาศัย Unit Testing Framework ในการสร้างโปรแกรมขึ้นมาเป็นชุดการทดสอบ (Unit Test Suite) โดยตัวที่ได้รับความนิยมก็คือ jUnit ของภาษา Java ซึ่งก็แตกยอดออกมากลายเป็นตระกูล xUnit ในหลาย ๆ ภาษาครับ

หน้าตาของ Unit Test ที่เขียนด้วย jUnit ก็ไม่ต่างอะไรกับตัวโปรแกรมทดสอบของผมข้างบนสักเท่าไหร่ เช่น ผมอาจจะมีเมธอดสำหรับตรวจสอบที่อยู่อีเมล์

Utility.validateEmailAddress(String address)

ก็สามารถเขียนตัว Unit Test ได้แบบนี้

class ValidateEmailAddressTest {
    @Test
    void testValidateEmailAddress() {
        Utility utility = new Utility();
        assertTrue("mr_tawan@hotmail.com is valid", 
                   utility.validateEmailAddress("mr_tawan@hotmail.com"));
        assertFalse("mr_tawan is invalid",
                   utility.validateEmailAddress("mr_tawan"));
    }
}

เมื่อตัว unit test นี้ถูกเรียกใช้งาน ถ้าหากว่ามีเทสต์เคสไหนที่ไม่ผ่าน ตัวฟังก์ชั่น assert* จะโยน exception ออกมาเพื่อให้รู้ว่ามันมีปัญหาครับ

การใช้ framework มีข้อดีที่ว่ามี output ที่แน่นอน ทำให้สามารถใช้เครื่องมือในการอ่าน output ออกมาเพื่อแสดงผลเป็นรายงานได้ด้วย (เช่น IDE แทบทุกเจ้ารองรับ jUnit หมด)

ข้อดีของ framework อีกอย่างคือการรองรับการทดสอบที่หลากหลายกว่า เช่นเราอาจจะกำหนดช่วงของผลลัพท์ที่เราคาดหวังเอาไว้และให้รายงานเฉพาะเวลาที่ผลลัพท์ที่ได้อยู่นอกเหนือช่วงดังกล่าว ทำให้โปรแกรมสามารถเขียนเทสต์ได้ง่ายกว่า (ถ้าใช้ฟังก์ชัน assert() เฉย ๆ แบบกรณีข้างบนนั้นโปรแกรมเมอร์จะต้องเป็นคนกำหนดวิธีการเช็คเอง)

ในหลาย ๆ โปรเจคจะมีกำหนดเอาไว้ว่า ทุก ๆ วันหลังจากที่ทุกคนกลับบ้าน จะมี server ตัวนึงที่ดึงโค๊ดออกมาจาก repository เพื่อที่จะรัน Unit Test Suit ที่เก็บเอาไว้กับโค๊ดนั้น ๆ และจะมีรายงานออกมาว่าโปรแกรมมีปัญหาหรือไม่ ในอีกหลาย ๆ โปรเจคนั้เนตัว Unit Test จะทำงานทันทีหลังเช็คอินอีกต่างหาก นี่คือสิ่งที่การทำ Unit Test ด้วยมือไม่สามารถทำได้แน่นอน

Wutipong Wongsakuldej

Programmer, interested in frontend applications, music and multimedia.

Latest posts by Wutipong Wongsakuldej (see all)

Leave a Reply

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