dbunit-logo

ได้พูดคุยเรื่องการทดสอบระบบงานในส่วนที่จัดการข้อมูลในฐานข้อมูล
ซึ่งหนึ่งในแนวทางที่ได้พูดคุยกันก็คือ การนำ In-memory database
มาใช้แทนฐานข้อมูลจริงๆ ในขณะการทดสอบ
โดยในภาษา Java ก็สามารถทดสอบได้หลายแบบ
หนึ่งในนั้นก็คือ DbUnit

เริ่มด้วยการทำความรู้จัก DbUnit

คือ JUnit extension สำหรับการทดสอบกับฐานข้อมูล
ซึ่งสามารถกำหนดข้อมูลระหว่างการทดสอบได้
และช่วยทำให้การทดสอบระบบไม่กระทบกับฐานข้อมูลหลัก
โดยสามารถ import และ export ข้อมูลในรูปแบบ xml

มาดูการใช้งานดีกว่า

1. เริ่มต้นด้วยการสร้าง project ด้วย maven
ซึ่งประกอบด้วย library ต่างๆ ดังนี้

  • jUnit
  • DbUnit
  • H2 คือ In-Memory database สำหรับการทดสอบ

ในไฟล์ pom.xml เป็นดังนี้

2. เตรียมข้อมูลสำหรับการทดสอบ
ประกอบไปด้วยโครงสร้างของตารางและข้อมูลสำหรับการทดสอบ

ไฟล์ schema.sql

3. มา coding กันดีกว่า
เริ่มด้วยการสร้าง Test case ด้วย jUnit
โดยสิ่งที่ต้องการทดสอบก็คือ PersonDAO
ทำหน้าที่การดึงข้อมูลรายละเอียดของ Person ด้วย ID ที่กำหนด
แล้วทำการตรวจสอบว่าได้ข้อมูล Person
ที่มี ID และ Name ตามที่คาดหวัง ดังนี้

จะพบว่าสิ่งที่ PersonDAO ต้องการคือ DataSource object
เป็น ojbect สำหรับการติดต่อกับฐานข้อมูล
ดังนั้น ใน test นี้เราสามารถทำการสร้าง DataSource
สำหรับการติดต่อไปยัง In-Memory database แทน ซึ่งใช้ H2 ดังนี้

ต่อมาจะทำการกำหนดข้อมูลก่อนการทดสอบแต่ละ test case ใน jUnit
ด้วยการสร้าง table  และ  เริ่มต้น ซึ่งอยู่ในไฟล์ schema.sql และ persons.xml ตามลำดับ ดังนั้น

เมื่อทุกอย่างเรียบร้อย ทำการ run unit test
ซึ่งสามารถทำงานตามที่เราต้องการทุกๆ อย่าง
โดยไม่ต้องตั้งฐานข้อมูลอะไรเลย
ทำให้การทดสอบระบบที่เกี่ยวข้องกับฐานข้อมูลทำได้ง่าย
สะดวก ไม่ผูกติดกับฐานข้อมูลจริง มากเกินไป

จากตัวอย่างนี้ น่าจะพอทำให้เห็นภาพว่า เราสามารถทดสอบ
ส่วนที่ทำงานกับฐานข้อมูลอย่างไร ให้ใกล้เคียงกับของจริงมากๆ

แต่เหนือสิ่งอื่นใด code จริงๆ ของเรานั้นจะต้องทำการ refactoring
ให้มันง่ายต่อการทดสอบด้วยเช่นกันนะ …