มีโอกาสไปแบ่งปันเรื่อง TDD with Golang สำหรับผู้เริ่มต้น
ตั้งแต่การติดตั้ง เริ่มทำความรู้และเข้าใจเกี่ยวกับพื้นฐานของภาษา Go
จากนั้นจึงเริ่มแนะนำการเขียน Test
จนไปถึง Testable code ด้วยภาษา Go

แต่สิ่งที่อยากสรุปไว้นิดหน่อยคือ
เทคนิคสำหรับการเขียน Test ด้วยภาษา Go
มาดูกันว่ามีอะไรที่น่าสนใจบ้าง

ปล. อยากรู้เรื่องอะไร ก็แบ่งปันคนอื่นซะ

ไม่จำเป็นต้องใช้ testing framework อื่น ๆ

เนื่องจากภาษา Go นั้นได้เตรียม testing package ไว้ให้แล้ว
ซึ่งมีความสามารถครบครัน
ไม่ต้องเรียนรู้ framework อื่น ๆ อีก
ดังนั้นสำหรับผู้เริ่มต้นแนะนำให้ใช้ก่อนเลย
ไม่ต้องไปหา framework อื่น จนกว่าคุณจะเข้าใจมัน

ในการใช้งาน testing package นั้นอาจจะต้องเขียน code ต่าง ๆ เองเยอะพอควร
ดังนั้นแนะนำให้ลองสร้าง helper function สำหรับการทดสอบไว้ด้วย
แล้วชีวิตจะสะดวกสบายมากขึ้น

ตัวอย่างเช่น function equals() สำหรับการเปรียบเทียบค่า

มีคำตอบสำหรับคำถามว่า Why does Go not have assertions?

รวมไปถึงการ mock และ stub ก็ใช้ Go ล้วน ๆ ได้เลย
ไม่ต้องไปหา framework อื่น ๆ

การตั้งชื่อสำหรับการทดสอบก็สำคัญนะ

ชื่อไฟล์ของการทดสอบจะลงท้ายด้วย _test.go เสมอ
ตัวอย่างเช่นใน package hello มีไฟล์ชื่อว่า sample.go
ถ้าต้องการทดสอบก็เขียนไว้ในไฟล์ sample_test.go
ซึ่งอยู่ใน package hello เช่นกัน

ส่วนชื่อของ test case นั้นต้องขึ้นต้นด้วยคำว่า Test เสมอ
จากนั้นคำต่อมาต้องขึ้นต้นด้วยตัวพิมพ์ใหญ่เสมอนะ !!
ยกตัวอย่างเช่น

Test<ชื่อ function ที่ทดสอบ>ToReturn<ผลที่คาดหวัง><เงื่อนไขที่ต้องการทดสอบ>

ในการทดสอบก็ไม่ยาก ใช้คำสั่งดังนี้ (ปกติจะทดสอบแบบ parallel อยู่แล้ว)

$go test ./…  #ทำการทดสอบทั้งหมด
$go test -p 1  ./…  #ทำการทดสอบทีละ package
$go test -run TestName #ทำการทดสอบตามชื่อ test case ที่ต้องการ

การเขียน Example ก็คือการทดสอบนะ

ใน Go นั้นอนุญาติให้เขียน example ใน package ต่าง ๆ ได้
โดยจะเขียนในไฟล์ *_test.go นั่นเอง
และชื่อ function จะขึ้นต้นด้วยคำว่า Example ไม่มี argument ใด ๆ
ตัวอย่าง code เป็นดังนี้

หลีกเลี่ยงการกำหนดค่าคงที่แบบ Global scope

ถ้าเรากำหนดค่าคงที่ใน code แล้ว
ในส่วนของ test นั้นไม่สามารถเปลี่ยนแปลงค่าได้
ดังนั้นเปลี่ยนดีกว่านะ
ยกตัวอย่างเช่น การกำหนด port ของระบบ

สำหรับ test fixture นั้นแนะนำให้สร้างใน directory ชื่อว่า testdata

ในการทดสอบบ่อยครั้งจำเป็นต้องมีไฟล์ของข้อมูลสำหรับการทดสอบใน package นั้น ๆ
สิ่งที่ Go แนะนำคือ การสร้างไว้ใน directory ชื่อว่า testdata ซะ
โดยที่ go build จะไม่สนใจ directory ชื่อนี้
รวมทั้งตอนทดสอบก็ดึงข้อมูลใน directory ได้ง่าย ๆ
เพราะว่า directory ปัจจุบันคือ package นั้น
เขียน code ได้ดังนี้

สุดท้ายต้องคอยดูด้วยว่าชุดการทดสอบใดบ้างที่มันทำงานช้า

มีวิธีการแก้ไขหลายทางเช่น

  • แก้ไขให้เร็วขึ้น
  • ให้ข้ามหรือลบทิ้งไป !!
  • ทำการแยกไปอยู่ใน integration testing แทน จากนั้นก็เพิ่ม tag integration เข้าไปใน code เช่น

จากนั้นทำการทดสอบด้วยคำสั่ง

$go test -tags=integration

วันนี้คุณเขียน test แล้วหรือยัง ?

ไว้มาดูเรื่อง Testable code กันใน blog ต่อไปนะ

Reference Websites
https://hackernoon.com/advanced-testing-in-go-tutorial-28b89d3a813
https://medium.com/@povilasve/go-advanced-tips-tricks-a872503ac859