หลังจากที่เขียนภาษา R มาสักพัก
สิ่งที่น่าสนใจ และ ตั้งคำถามไว้คือ
ถ้าอยากเขียน Unit test ในภาษา R มันมี xUnit framework อะไรให้ใช้หรือไม่ ?
เมื่อไปค้นหาก็เจอเยอะเลย เช่น
- RUnit ทำการ update ล่าสุดในปี 2015
- svUnit ทำการ update ล่าสุดในปี 2014
- testthat ทำการ update ล่าสุดในปี 2016
ดูจากการ update แล้วมาลองใช้งาน testthat กันหน่อยดีกว่า
เริ่มด้วยการ configuration และโครงสร้าง project ก่อนเลย
- เก็บ production code ไว้ใน folder src
- เก็บ test code ไว้ใน folder tests
จากนั้นทำการสร้างไฟล์หลักสำหรับการทดสอบ
ชื่อว่าไฟล์ run-test.R
เพื่อบอกว่าใช้ library ชื่อว่า testthat สำหรับการทดสอบ
เพื่อบอกว่าจะทดสอบไฟล์อะไรบ้าง
เพื่อบอกว่าชุดการทดสอบอยู่ที่ไหน
ดังนี้
ทำการทดสอบด้วยคำสั่ง
$Rscript run-test.R
แน่นอนว่าต้องเจอ error
โดย error แรกก็คือไม่เจอไฟล์ fizzbuzz.R ใน folder src
ดังนั้นทำการสร้างไฟล์ก่อน
จากนั้นทำการ run ด้วยคำสั่งเดิมจะเจอ error ต่อมา
คือ ไม่พบไฟล์ test ใน folder tests เลย
ซึ่งรูปแบบของชื่อไฟล์เป็นไปตาม regular expression ดังนี้
“^test.*\\.[rR]$”
นั่นคือชื่อไฟล์ขึ้นต้นด้วย test.
และมีนามสกุล r หรือ R ก็ได้
ยกตัวอย่างเช่น test.fizzbuzz.R
หลังจากสร้างไฟล์ทุกอย่างเรียบร้อยทำการ run คำสั่งเดิม
จะแสดงผลดังนี้ ถือว่าพร้อมสำหรับการเขียน unit test แล้ว
DONE =================
เมื่อทุกอย่างพร้อมก็เริ่มเขียน test กันเถอะครับ
ซึ่งเขียนตามรูปแบบของ testthat ดังนี้
คำอธิบาย
- context ใช้อธิบายกลุ่มการทดสอบ
- test_that ทำการกำหนดชื่อการทดสอบ โครงสร้างคล้าย jasmine มาก ๆ
จากนั้นทำการ run การทดสอบได้ผลดังนี้
จะเห็นได้ว่า error message แจ้งข้อผิดพลาดต่าง ๆ มาหมดเลย
เช่นชื่อ function say() นั้นหาไม่เจอนะ
เมื่อ test fail แล้วก็ได้เวลาเขียน production code นะสิ
ก็เขียน code ง่าย ๆ เพื่อทำให้ชุดการทดสอบผ่านดังนี้
ผลการทำงานผ่านสิ
TDD with R language: . DONE ==================
สังเกตุไหมว่ามีจุด (.) จำนวน 1 จุดนะ
นั่นคือจำนวนของชุดการทดสอบนั่นเอง
เพียงเท่านี้ก็สามารถเริ่มเขียน Unit testing สำหรับภาษา R ได้แล้วครับ
ปล. ทำไปเพื่ออะไร ?
ตอบง่าย ๆ คือ อยากทำเท่านั้นเองนะ
Source code ตัวอย่างอยู่ที่ Github::Up1::TDD with R