มารู้จัก DUnit และมาเขียน Delphi โดยใช้ TDD กัน

October 20, 2015 3:07 pm Delphi, TDD, Test

โปรแกรมเมอร์หลายๆคน คงรู้จักการเขียน Automation Test กัน ซึ่งเครื่องมือก็แตกต่างกันไปตามภาษาที่ใช้ในการเขียน เช่น JUnit (Java), NUnit (c#), phpUnit (PHP) คราวนี้เรามาเรียนการเขียน Unit Test บน Delphi กันด้วยเครื่องมือที่ชื่อว่า DUnit

DUnit เป็นเครื่องมือที่ใช้เขียนโปรแกรมทดสอบโปรแกรม (ฟังดูงงๆเนอะ) ในภาษา Delphi เป็นการเขียนโปรแกรมเพื่อเข้าไปทดสอบโปรแกรมระดับ Unit

การใช้งาน DUnit นั้นง่ายกว่าที่คิดเยอะครับ (ตอนลองครั้งแรกนึกว่ายาก) โดยผมจะเอามาประยุกต์กับการพัฒนาซอฟแวร์แบบ Test-Driven Development (TDD) ที่กำลังเป็นที่นิยมกันอยู่ในตอนนี้ โดยผมจะเริ่มทำโดยการสร้าง Project ง่ายๆขึ้นมา โดยผมจะเริ่มเขียน Test Case ขึ้นมาก่อน แล้วค่อยๆเขียน Code การทำงานไปเรื่อยๆ ดูตามลำดับไปเรื่อยๆนะครับ

ในตัวอย่าง ผมจะใช้ Delphi XE4 ในการพัฒนานะครับ

การสร้าง Test Project และ Test Case ของ DUnit

  1. ผมจะสร้าง Project เปล่าๆ ขึ้นมา 1 Project โดย Project ที่ผมสร้างนั้น จะเป็นประเภท VCL Forms ApplicationScreen Shot 2558-10-20 at 12.05.48 PM
  2. สร้าง Function ขึ้นมา (ในที่นี้ผมจะสร้าง Function สำหรับบวกเลข โดยใช้ชื่อว่า Sum2Number) เป็น Function เปล่าที่ยังไม่ผ่านการ Implement ใดๆScreen Shot 2558-10-20 at 2.29.19 PM
  3. เราจะทำการสร้าง Project ของ DUnit ขึ้นมาสำหรับการทดสอบ Project ก่อน โดยไปที่ File -> New -> Other -> Unit Test -> Test ProjectScreen Shot 2558-10-20 at 1.24.36 PM
  4. กรอกรายละเอียดสำหรับการสร้าง Unit Project โดย Source Project คือ Project ต้นทางที่เราจะทำการทดสอบ, Project Name จะเป็นชื่อ Project ของ Unit Test, Location จะเป็นส่วนที่ใช้ในการเก็บไฟล์ Unit Test หลังจากตั้งค่าเสร็จ กด NextScreen Shot 2558-10-20 at 1.26.18 PM
  5. เลือกการทำงานของตัว DUnit ว่าจะให้ทำงานเป็น Console Mode หรือ GUI Mode ในที่นี้จะเลือกเป็น GUI Mode เพื่อความง่ายในการใช้งาน แล้วกด FinishScreen Shot 2558-10-20 at 1.26.23 PM
  6. หลังจากนั้น Delphi XE จะทำการสร้าง DUnit Project ขึ้นมาและจะถูกเพิ่มใน Project Group เป็นที่เรียบร้อยScreen Shot 2558-10-20 at 1.31.56 PM
  7. หลังจากที่ได้ Test Project ขึ้นมาแล้ว เราจะต้องทำการสร้าง Test Case ขึ้นมาเพื่อใช้ในการ Test ก่อน โดยการสร้าง TestCase นั้น ทำได้โดยการเลือก Project ใน Project Group เป็น Project ของ DUnit แล้วใช้เมนู File -> New -> Other -> Unit Test -> Test Case Screen Shot 2558-10-20 at 1.36.45 PM
  8. จะมีหน้าต่างให้เลือกไฟล์ Source Code ภายใน Project ขึ้นมา ให้เลือกไฟล์ Source Code ที่เราต้องการสร้าง Unit Test แล้วจะมีรายชื่อ Function และ Procedule ในไฟล์ๆนั้นขึ้นมา ให้เราเลือก Function หรือ Procedule ที่เราต้องการทำ Unit Test แล้วกด NextScreen Shot 2558-10-20 at 2.30.34 PM
  9. ตั้งค่าไฟล์ที่ใช้ในการเขียน Unit Test ตามสะดวก (ผมขอใช้แบบ Default ไปก่อนนะครับ เพื่อความง่าย) แล้วกด FinishScreen Shot 2558-10-20 at 1.42.53 PM
  10. ตัวโปรแกรมจะสร้าง Default Code ของ DUnit เอาไว้ให้เราเขียน Test เพิ่มเติมเข้าไป

ทำ TDD เบื้องต้น สำหรับภาษา Delphi

เอาหล่ะ หลังจากที่เราได้รู้จักการสร้าง Project Test และ Test Case ของตัว DUnit กันแล้ว หลังจากนี้ เราจะมาเริ่มทำการพัฒนาซอฟแวร์ด้วย TDD บนภาษา Delphi กัน โดยผมจะต่อเนื่องจากบนหัวข้อที่แล้วเลยนะครับ โดยผมมี Unit อยู่ 1 ตัว ชื่อว่า “Unit1.pas” และ Test Case ชื่อว่า “TestUnit1.pas” เอาหล่ะ เราลองมาทำ TDD กันดูครับ

    1. เราต้องทำการร่าง Test Case ของ Function ที่เราต้องการทำข้นมาก่อน โดย Test Case ของ Function ของผมคือ “รับค่าเลข 2 ตัว มาบวกกัน โดยจำนวนตัวเลขที่รับเข้ามา ต้องไม่เกิน 200 และไม่น้อยกว่า 0”   ร่างออกมาเป็นตาราง Test Case ได้ ดังนี้
      ลำดับ ตัวเลขที่ 1 ตัวเลขที่ 2 ผลลัพธ์
      1 0 0 0
      2 1 0 1
      3 -1 0 Error : Out of Rage
      4 199 0 199
      5 200 0 200
      6 201 0 Error : Out of Rage
      7 Test 0 Error : Invalid Input
      8 0 1 1
      9 0 -1 Error : Out of Rage
      10 0 199 199
      11 0 200 200
      12 0 201 Error : Out of Rage
      13 0 Test Error : Invalid Input
      14 1 1 2
      15 199 199 398
      16 200 200 400
      17 201 201 Error : Out of Rage
      18 -1 -1 Error : Out of Rage
      19 Test Test Error : Invalid Input
    2. หลังจากเราได้ตาราง Test Case แล้ว ให้เรานำตาราง Test Case ไป Implement กับ DUnit ได้ ดังนี้
    3. หลังจากนั้น ให้ลอง Run Unit Test ดูScreen Shot 2558-10-20 at 3.01.39 PM
    4. จะเห็นว่า ไม่มี Test Case ที่ Run ผ่าน เพราะมันเป็น Function เปล่า ทีนี้เราก็ Implement Function ให้ Run ผ่านทุก Test Case
    5. หลังจาก Implement Function เรียบร้อยแล้ว แล้ว Run Test อีกครั้ง ผลคือ…Screen Shot 2558-10-20 at 3.04.57 PM
    6. หลังจากนี้ ใครอยากจะ Code refactoring ก็แล้วแต่สะดวกครับ แต่ Test Case ทุกตัว ต้อง Run ผ่านเหมือนเดิม