[英]dbunit best practices for performance
在我之前的一項任務中,我們有數百個涉及數據集的集成測試,但不是在DBUnit中 - 測試環境是從頭開始編寫的,因為它是一個非常大的公司,可以負擔這種東西。
數據集按層次結構組織。 被測系統由幾個(5-10)模塊組成,測試數據遵循該模式。 單元測試腳本如下所示:
include(../../masterDataSet.txt)
include(../moduleDataSet.txt)
# unit-specific test data
someProperty=someData
通過一些我不記得的奇怪工具將屬性名稱直接映射到DB記錄。
相同的模式可以應用於DBUnit測試。 在主數據集中,您可以放置始終需要的記錄 - 比如字典,數據庫的初始加載,就像從頭開始安裝一樣。
在模塊數據集中,您將包含大多數測試的測試用例的記錄放在模塊中; 我不認為你的平均測試涉及所有70個數據庫表,是嗎? 您肯定必須擁有一些可構成模塊的功能組,即使應用程序是單片的。 嘗試圍繞它組織模塊級測試數據。
最后, 在測試級別上 ,您只需使用此特定測試所需的最少記錄數修改測試集。
這種方法具有學習的巨大好處; 因為數據文件很少,所以你實際上開始記住它們。 您可以輕松地分辨出任何兩個數據集的差異,而不是看到數百個大數據集只有不明顯的細節(每次您在一段時間后再次進行測試時都必須找到)。
關於最后表現的一句話。 在我的2.4 GHz雙核WinXP機器上,DBUnit測試涉及:
需要1-3秒。 日志顯示前3個操作只需不到一秒鍾,大部分測試時間都由Spring消耗。 每個測試都執行此邏輯,以避免測試順序依賴性。 一切都在一個帶有嵌入式Derby的VM中運行,這可能就是為什么它如此之快。
編輯:我認為DBUnit XML數據集不支持包含其他測試文件,可以通過為所有集成測試使用基類來克服它,例如:
public class AbstractITest {
@Before
public void setUp() throws Exception {
//
// drop and recreate tables here if needed; we use
// Spring's SimpleJdbcTemplate executing drop/create SQL
//
IDataSet masterDataSet = new FlatXmlDataSetBuilder().build("file://masterDataSet.xml");
DatabaseOperation.CLEAN_INSERT.execute(dbUnitConnection, dataSet);
}
}
public class AbstractModuleITest extends AbstractITest {
@Before
public void setUp() throws Exception {
super.setUp();
IDataSet moduleDataSet = new FlatXmlDataSetBuilder().build("file://moduleDataSet.xml");
DatabaseOperation.CLEAN_INSERT.execute(dbUnitConnection, moduleDataSet);
}
}
public class SomeITest extends AbstractModuleITest {
// The "setUp()" routine only here if needed, remember to call super.setUp().
@Test
public void someTest() { ... }
}
Junit在Action 2e中的建議實際上並不是創建太多的數據集(比如每個測試類一個),但只是足夠被認為是可維護的。 除了一些例外情況,我發現可以使用主數據集進行大多數單元測試,並使用單個數據集進行集成測試。 限制ExpectedDataSets的使用也是一種選擇。
此外,我將Unitils與dbunit結合使用以簡化測試數據的一些設置和加載,因此您可能需要在適當的時候考慮它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.