簡體   English   中英

dbunit性能最佳實踐

[英]dbunit best practices for performance

除了在實際的dbunit站點上推薦的那些之外,還有哪些最佳實踐/原則可以大大加快測試速度並使其保持可維護性? 我渴望 java 工廠女孩這樣 ,但由於靜態類型,它看起來不太可能。

我目前的想法是在這一點上每個測試類有1個xml數據集 - 也許我會分享其中的一些,也許我沒有。 雖然一些測試數據可能是復制的交叉數據集,但我發現在3000個單元/集成測試中維護共享數據集太難了 - 而且我還有很長的路要走。

將會欣賞任何遵循的原則,導致測試表現良好且易於維護。

在我之前的一項任務中,我們有數百個涉及數據集的集成測試,但不是在DBUnit中 - 測試環境是從頭開始編寫的,因為它是一個非常大的公司,可以負擔這種東西。

數據集按層次結構組織。 被測系統由幾個(5-10)模塊組成,測試數據遵循該模式。 單元測試腳本如下所示:

 include(../../masterDataSet.txt)
 include(../moduleDataSet.txt)

 # unit-specific test data
 someProperty=someData

通過一些我不記得的奇怪工具將屬性名稱直接映射到DB記錄。

相同的模式可以應用於DBUnit測試。 主數據集中,您可以放置​​始終需要的記錄 - 比如字典,數據庫的初始加載,就像從頭開始安裝一樣。

模塊數據集中,您將包含大多數測試的測試用例的記錄放在模塊中; 我不認為你的平均測試涉及所有70個數據庫表,是嗎? 您肯定必須擁有一些可構成模塊的功能組,即使應用程序是單片的。 嘗試圍繞它組織模塊級測試數據。

最后, 在測試級別上 ,您只需使用此特定測試所需的最少記錄數修改測試集。

這種方法具有學習的巨大好處; 因為數據文件很少,所以你實際上開始記住它們。 您可以輕松地分辨出任何兩個數據集的差異,而不是看到數百個大數據集只有不明顯的細節(每次您在一段時間后再次進行測試時都必須找到)。

關於最后表現的一句話。 在我的2.4 GHz雙核WinXP機器上,DBUnit測試涉及:

  • 丟掉14張桌子,
  • 創建14個表,
  • 插入ca. 100條記錄,
  • 執行測試邏輯,

需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM