มีโอกาสไปแบ่งปันเรื่อง TDD with Golang สำหรับผู้เริ่มต้น
ตั้งแต่การติดตั้ง เริ่มทำความรู้และเข้าใจเกี่ยวกับพื้นฐานของภาษา Go
จากนั้นจึงเริ่มแนะนำการเขียน Test
จนไปถึง Testable code ด้วยภาษา Go
แต่สิ่งที่อยากสรุปไว้นิดหน่อยคือ
เทคนิคสำหรับการเขียน Test ด้วยภาษา Go
มาดูกันว่ามีอะไรที่น่าสนใจบ้าง
ปล. อยากรู้เรื่องอะไร ก็แบ่งปันคนอื่นซะ
ไม่จำเป็นต้องใช้ testing framework อื่น ๆ
เนื่องจากภาษา Go นั้นได้เตรียม testing package ไว้ให้แล้ว ซึ่งมีความสามารถครบครัน ไม่ต้องเรียนรู้ framework อื่น ๆ อีก ดังนั้นสำหรับผู้เริ่มต้นแนะนำให้ใช้ก่อนเลย ไม่ต้องไปหา framework อื่น จนกว่าคุณจะเข้าใจมัน ในการใช้งาน testing package นั้นอาจจะต้องเขียน code ต่าง ๆ เองเยอะพอควร ดังนั้นแนะนำให้ลองสร้าง helper function สำหรับการทดสอบไว้ด้วย แล้วชีวิตจะสะดวกสบายมากขึ้น ตัวอย่างเช่น function equals() สำหรับการเปรียบเทียบค่า [gist id="452c4eec4b860505d7f904c96b51e230" file="helper.go"] มีคำตอบสำหรับคำถามว่า Why does Go not have assertions? รวมไปถึงการ mock และ stub ก็ใช้ Go ล้วน ๆ ได้เลย ไม่ต้องไปหา framework อื่น ๆการตั้งชื่อสำหรับการทดสอบก็สำคัญนะ
ชื่อไฟล์ของการทดสอบจะลงท้ายด้วย _test.go เสมอ ตัวอย่างเช่นใน package hello มีไฟล์ชื่อว่า sample.go ถ้าต้องการทดสอบก็เขียนไว้ในไฟล์ sample_test.go ซึ่งอยู่ใน package hello เช่นกัน ส่วนชื่อของ test case นั้นต้องขึ้นต้นด้วยคำว่า Test เสมอ จากนั้นคำต่อมาต้องขึ้นต้นด้วยตัวพิมพ์ใหญ่เสมอนะ !! ยกตัวอย่างเช่น [code] Test<ชื่อ function ที่ทดสอบ>ToReturn<ผลที่คาดหวัง><เงื่อนไขที่ต้องการทดสอบ> [/code] ในการทดสอบก็ไม่ยาก ใช้คำสั่งดังนี้ (ปกติจะทดสอบแบบ parallel อยู่แล้ว) [code] $go test ./… #ทำการทดสอบทั้งหมด $go test -p 1 ./… #ทำการทดสอบทีละ package $go test -run TestName #ทำการทดสอบตามชื่อ test case ที่ต้องการ [/code]การเขียน Example ก็คือการทดสอบนะ
ใน Go นั้นอนุญาติให้เขียน example ใน package ต่าง ๆ ได้ โดยจะเขียนในไฟล์ *_test.go นั่นเอง และชื่อ function จะขึ้นต้นด้วยคำว่า Example ไม่มี argument ใด ๆ ตัวอย่าง code เป็นดังนี้ [gist id="452c4eec4b860505d7f904c96b51e230" file="example.go"]หลีกเลี่ยงการกำหนดค่าคงที่แบบ Global scope
ถ้าเรากำหนดค่าคงที่ใน code แล้ว ในส่วนของ test นั้นไม่สามารถเปลี่ยนแปลงค่าได้ ดังนั้นเปลี่ยนดีกว่านะ ยกตัวอย่างเช่น การกำหนด port ของระบบ [gist id="452c4eec4b860505d7f904c96b51e230" file="global.go"]สำหรับ test fixture นั้นแนะนำให้สร้างใน directory ชื่อว่า testdata
ในการทดสอบบ่อยครั้งจำเป็นต้องมีไฟล์ของข้อมูลสำหรับการทดสอบใน package นั้น ๆ สิ่งที่ Go แนะนำคือ การสร้างไว้ใน directory ชื่อว่า testdata ซะ โดยที่ go build จะไม่สนใจ directory ชื่อนี้ รวมทั้งตอนทดสอบก็ดึงข้อมูลใน directory ได้ง่าย ๆ เพราะว่า directory ปัจจุบันคือ package นั้น เขียน code ได้ดังนี้ [gist id="452c4eec4b860505d7f904c96b51e230" file="testdata.go"]สุดท้ายต้องคอยดูด้วยว่าชุดการทดสอบใดบ้างที่มันทำงานช้า
มีวิธีการแก้ไขหลายทางเช่น- แก้ไขให้เร็วขึ้น
- ให้ข้ามหรือลบทิ้งไป !!
- ทำการแยกไปอยู่ใน integration testing แทน จากนั้นก็เพิ่ม tag integration เข้าไปใน code เช่น
วันนี้คุณเขียน test แล้วหรือยัง ?ไว้มาดูเรื่อง Testable code กันใน blog ต่อไปนะ