Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

แนะนำเทคนิคสำหรับการเขียน Test ด้วยภาษา Go

$
0
0

มีโอกาสไปแบ่งปันเรื่อง 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 เช่น
[gist id="452c4eec4b860505d7f904c96b51e230" file="some_integration_test.go"] จากนั้นทำการทดสอบด้วยคำสั่ง [code] $go test -tags=integration [/code]
วันนี้คุณเขียน test แล้วหรือยัง ?
ไว้มาดูเรื่อง Testable code กันใน blog ต่อไปนะ

Viewing all articles
Browse latest Browse all 1997

Trending Articles