單元測試時數據的准備與驗證是一個很繁瑣的過程,DBUnit為之提供了一套優雅的解決方案,可以幫我們從中解脫出來。
DBUnit數據准備
DBUnit支持將准備的數據放置在一個xml文件中,在執行測試用例之前自動同步到數據庫中,執行完成后數據也可以自動銷毀。示例如下:
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<User UserId="200" UserName="tony" Age="25" pointValue="2000" />
</dataset>
User表示是數據庫中的表,UserId、UserName等表示表中的字段。我們可以在dataset中寫入多個這樣的記錄,文件中每條記錄對應數據庫表中的一行記錄。
DBUnit數據驗證
假如我們執行一個測試用例把上面的記錄中的pointValue="2000" 更新為2500,通常的驗證方式是更新后再去查詢數據庫再做比對。而DBUnit支持你將一個預期結果寫到xml文件中,當測試用例更新完后會和數據庫中的數據自動做比較,看看是否符合預期。下面是預期結果的xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<dataset>
<User UserId="200" UserName="tony" Age="25" pointValue="2500" />
</dataset>
由於DBUnit官方提供的用法和測試用例耦合太強,這里比較推薦spring-test-dbunit,我們可以通過幾個簡單的注解實現與測試的解耦:
@DatabaseSetup :將特定xml文件中的數據同步到數據庫
@DatabaseTearDown: 清理數據
@ExpectedDatabase :數據驗證,
其assertionMode屬性支持兩種驗證方式--DatabaseAssertionMode.DEFAULT 要驗證所有的字段,DatabaseAssertionMode.NON_STRICT則支持只驗證部分字段,這個實際測試中更為常用,畢竟多數情況下並不需要驗證所有的字段。
此外,@ExpectedDatabase只能用於增刪改三種場景!
上面這幾個注解要起作用,記得首先要在@TestExecutionListeners中配置DbUnitTestExecutionListener,具體用法下篇會有完整示例。
下面是spring-test-dbunit注解的用法的示例:
@Test
@DatabaseTearDown
@DatabaseSetup("/data/user-setUpData.xml")
@ExpectedDatabase(table = "User",
assertionMode= DatabaseAssertionMode.NON_STRICT,
value= "/data/updatePoint-exceptedData.xml")
public void testUpdatePointValue() throws Exception {
int result = userDao.updatePointValue(200L,2500L);
Assert.assertEquals(result,1);
}
這里,@DatabaseSetup會把/data/user-setUpData.xml文件中的數據同步到數據庫,然后執行updatePointValue,將pointValue更新為2500,最后再拿數據庫中更新后的數據和/data/updatePoint-exceptedData.xml文件中的數據做比較。@DatabaseTearDown則測試用例執行完后重置數據庫清理掉數據。