หลังจากที่เขียนภาษา 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