วันนี้เห็น 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