Screen Shot 2558-01-27 at 3.55.14 PM
วันนี้เห็น project ที่น่าสนใจชื่อว่า Lambda Behave
ซึ่งบอกว่าเป็น modern testing framework สำหรับ behavior specification สำหรับ Java 8
โดยเป้าหมายหลักของ projectนี้คือ

  • การใช้งานร่วมกับ jUnit
  • นำรูปแบบของ Spock และ Jasmine มาใช้งาน

ดังนั้น เรามาลองดูกันว่า มันใช้งานอย่างไร
และมันทำให้ unit test ของเราดูดีขึ้นบ้างไหม

Given-When-Then คืออะไร

มันเป็นรูปแบบการทดสอบระบบงานแบบ BDD style หรือ Behavior-Driven Development
ซึ่งมักจะแบ่งส่วนการทำงานออกเป็น 3 ส่วนคือ

  • Given สำหรับกำหนด pre-condition ต่างๆ ของการทดสอบ เช่นการกำหนดสถานะต่างๆ
  • When สำหรับการกระทำต่างๆ ที่ต้องการทดสอบ
  • Then ส่วนตรวจสอบผลการทำงาน ว่าตรงตามที่คาดหวังหรือไม่

แต่ในการใช้งานจริงๆ อาจจะใช้ไม่ครบทั้ง 3 ส่วนก็ได้นะ
เพราะว่าในการกำหนดค่าเริ่มด้วยใน jUnit นั้น
สามารถกำหนดผ่าน method setUp() หรือ @Before ได้

มาดูการใช้งานกันบ้าง

โดยเบื้องต้นจะทำการพัฒนาในรูปแบบ Maven project ดังนั้น
ต้องทำการกำหนด dependency ในไฟล์ pom.xml ดังนี้

จากนั้นลองเขียน unit test ด้วย jUnit 4.11
ด้วยตัวอย่างสุด classic คือ FizzBuzz
ซึ่งเราสามารถเขียน Given-When-Then เข้าไปได้เลย ดังนี้

หรือต้องการเขียนในรูปแบบของ Jasmine หรือ Spock ก็ได้นะ
ด้วยการใช้ Lambda แต่จำเป็นต้องเปลี่ยนไปใช้ JUnitRunner ของ Lambda behave แทนนะ
ดังนี้

ข้อจำกัดของ Lambda behave

สิ่งที่แปลกมากๆ ก็คือ
เราไม่สามารถใช้ Given:, When: และ Then: ก่อนการประกาศตัวแปรได้นะ
ไม่เช่นนั้นมันจะ compile ไม่ผ่านเลย
ดังนั้น ก่อนใช้งานพวก label Given-When-Then จะต้องทำการประกาศตัวแปรที่จะใช้ก่อนเสมอ

และรูปแบบการแบ่งกลุ่มการทำงานของ unit test แบบนี้
ถือว่าเป็นอีกหนึ่งตัวเลือกที่น่าสนใจ
ซึ่งมันน่าจะดีกว่า การ comment ใน code นะ !!
รวมทั้งมันจะดีมากๆ ถ้าทีมพัฒนาสามารถตกลงรูปแบบการเขียน unit test ร่วมกัน

แน่นอนว่ารูปแบบของ Given-When-Then มันมีรูปแบบคล้ายกับ Arrange-Act-Assert นั่นแหละ
เพียงแค่ชื่อมันต่างกันเท่านั้นเองนะ

สุดท้าย คุณและทีมลองใช้งาน และตัดสินใจดูครับ
ว่ารูปแบบไหนที่เหมาะสมกับคุณ ทีม และ งานจริงๆ

ตัวอย่างสามารถดูเพิ่มเติมได้จาก Github:Up1

Tags:,