簡體   English   中英

如何使用dbUnit將數據庫恢復到初始狀態?

[英]How to revert the database back to the initial state using dbUnit?

我是自動化測試和dbUnit的新手。 所以我很感激你的建議。

我將創建一個測試套件,它將以下列方式運行:

  • 創建一個內存H2數據庫
  • 運行DDL腳本來創建表
  • 運行dbUnit以插入將由所有測試使用的初始數據(讓我們稱之為STATE0 )。
  • 運行測試

直到那里它看起來不錯,但我不明白的是,如何在測試運行后將數據庫恢復到STATE0並更改數據?

我可以用dbUnit做到嗎?
還是別的什么?
我應該在每次測試之前重新創建數據庫嗎?

簡單的不在測試中提交事務對我來說是不合適的,因為測試最終會運行多個事務,可能不止一個數據庫連接。

DBUnit的可以,如果你寫你自動完成的工作相關的四個你@BeforeClass@Before@After方法正確。 例如,在我們的項目中,使用Derby,就像一個這樣的測試用例

public class MyTest {
    protected static IDataSet getDataSet() throws Exception {
        URL url = MyTest.class.getClassLoader().getResource("MyDataSet.xml");
        return new XmlDataSet(new FileInputStream(url.getPath()));
    }

    private static JdbcDatabaseTester databaseTester;

    @BeforeClass
    public static void setUpClass() throws Exception {
        // Init test environment, session etc.
        databaseTester = new JdbcDatabaseTester(
                "org.apache.derby.jdbc.ClientDriver",
                "jdbc:derby://localhost:1527/myschema", 
                "username", "password");
        databaseTester.setDataSet(getDataSet());
    }

    @AfterClass
    public static void tearDownClass() {
        // Close session etc.
    }

    @Before
    public void setUp() throws Exception {
        databaseTester.onSetup();
    }

    @After
    public void tearDown() throws Exception {
        databaseTester.onTearDown();
    }

    @Test
    public void test() throws Exception { ... }
}

此代碼在每次測試后將數據庫模式的(子集)放回到MyDataSet.xml定義的狀態。 (注意,正如@Pascal評論的那樣,重置可能並不總是滿的 - 如果測試修改了不在數據集中的表,它將不受@Before / @After方法的影響。)

要將數據庫初始化為初始數據集,只需在測試用例中實現這些方法:

@Override
protected DatabaseOperation getSetUpOperation() throws Exception
{
    return DatabaseOperation.CLEAN_INSERT; // by default (will do DELETE_ALL + INSERT)
}

@Override
protected DatabaseOperation getTearDownOperation() throws Exception
{
    return DatabaseOperation.NONE; // by default
}

如果某些測試在空表中插入行(例如,未在初始數據集中定義),則可能有外鍵約束。

只需在數據集中添加此空表而不添加任何行:

<mydb_mypopulatedtable id="1" name="toto" alias="funky"/>
<mydb_mypopulatedtable id="2" name="titi" alias="groovy"/>
<mydb_mypopulatedtable id="3" name="tutu" alias="creepy"/>

<mydb_myemptytable />

在這里,myemptytable有mypopulatedtable的外鍵。 如果未定義myemptytable,DBUnit將嘗試刪除mypopulatedtable但由於約束而失敗。 如果已定義,DBUnit將刪除myemptytable行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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