แยก Unit Test กับ Integration Test ใน Java ด้วย Maven

การทำยูนิตเทสต์ด้วยจาวา ควรจะแยกเทสต์เคส (Test Case) ที่ต้องติดต่อข้ามโปรเจคท์ หรือข้ามคอมโพเนนท์ ไปเป็นอินทิเกรชั่นเทสต์ แทนยูนิตเทสต์ ถึงแม้จะใช้เจยูนิตในการทำก็ตาม เพราะโดยส่วนมากอินทิเกรชั่นเทสต์นั้นจะใช้เวลานานกว่า ไม่เหมาะที่จะรันบ่อยๆ

เมเว่น (Maven) ได้กำหนดเฟสการเทสต์ 2 แบบนี้แยกจากกันไว้อยู่แล้ว โดยยูนิตเทสต์จะถูกรันในเฟสเทสต์ (mvn test) ส่วนอินทิเกรชั่นเทสต์จะถูกรันในเฟสเวอริฟาย (mvn verify) ค่าเริ่มต้นนั้น อินทิเกรชั่นเทสต์จะไม่ได้กำหนดให้ทำงาน

ถ้าต้องการใช้เมเว่นในการทำเทสต์

  1. เพิ่มปลั๊กอินเฟลเซฟ (maven-failsafe-plugin) เข้าไปในส่วน <build> ของ pom.xml
  2. แยกชนิดการเทสต์ด้วยชื่อคลาส
    • **/*Test.java คือ ยูนิตเทส
    • **/*IT.java คือ อินทิเกรชั่นเทสต์
  3. รัน mvn test เมื่อต้องการรันยูนิตเทสต์ และ mvn verify เมื่อต้องการรันอินทิเกรชั่นเทสต์

อย่าลืมว่าอินทิเกรชั่นเทสต์นั้นจะต้องผ่านยูนิตเทสต์ก่อนจึงจะรันได้นะ

ที่มา: http://maven.apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html

สแลช (Slash)

ใช้ Mockito ทำ Unit Test ง่ายๆ

แน่นอนว่าการทำยูนิตเทสต์ (Unit Test) ด้วยจาวา (Java) ต้องใช้เจยูนิต (JUnit) แต่ในการทำทีดีดี (TDD: Test-Driven Development) การเทสต์ให้ครอบคลุมซอร์สโค้ดทั้งหมดนั้นสำคัญ ซึ่งเป็นเรื่องยากในภาษาอื่นๆ อย่างเช่นซีพลัสๆ (C++) แต่ในโลกของจาวานั้น มีม็อคคิโต (Mockito) ที่ทำงานร่วมกับเจยูนิตได้ง่าย

พื้นฐานม็อคคิโตอย่างง่ายๆ

  1. ใช้ @Mock เพื่อจำลองพฤติกรรมของวัตถุนั้นทั้งกระบวนการ ด้วยคำสั่ง when()
  2. ใช้ @Spy เพื่อให้วัตถุนั้นทำงานจริงแต่เปลี่ยนพฤติกรรมบางเม็ทเถิด (method) ได้
  3. ใช้ @Captor เพื่อเก็บข้อมูลจากการประมวลผลเอาไปเปรียบเทียบกับค่าที่เราต้องการได้
  4. ใช้ verify() เพื่อพิสูจน์ว่ามีการเรียกใช้เม็ทเถิดนั้นๆหรือไม่
  5. ถ้าจะใช้แอนโนเทชั่น (Annotation) เหล่านี้ จะต้องแอนโนเถต (Annotate) เจยูนิตคลาสด้วย @RunWith(MockitoJUnitRunner.class)

มาทำ ทีดีดี ที่ครอบคลุมซอร์สโค้ด 100% กันเถอะ

สแลช (SLASH)