4

我已经四处搜索,但未能成功确定以下方法是否可行/良好做法。基本上我想做的是以下几点:

创建使用 DBUnit 初始化数据的 JUnit 测试。运行多个测试方法,每个测试方法都使用相同的初始数据集。在每个测试方法之后回滚到初始 setUp 函数之后的状态。在所有测试方法运行后,回滚在 setUp 函数中所做的任何更改。此时数据库中的数据应该与运行 JUnit 测试类之前的数据完全相同。

理想情况下,我不必在每个测试用例之前重新初始化数据,因为我可以在 setUp 之后立即回滚到状态。

我已经能够回滚单个测试方法,但在所有测试方法运行后无法回滚在 setUp 中所做的更改。

注意:我知道 DBUnit 的不同功能,例如 CLEAN_INSERT、DELETE 等。我正在使用 Spring 框架来注入我的数据源。

示例布局如下所示:

public class TestClass {

    public void setUp() {
        // Calls a method in a different class which uses DBUnit to initialize the database
    }

    public void runTest1() {
        // Runs a test which may insert / delete data in the database
        // After running the test the database is in the same state as it was
        // after running setUp
    }

    public void runTest2() {
        // Runs a test which may insert / delete data in the database
        // After running the test the database is in the same state as it was
        // after running setUp
    }

    // After runTest1 and runTest2 have finished the database will be rolled back to the
    // state before any of the methods above had run.
    // The data will be unchanged as if this class had never even been run
}

我将在开发数据库中运行测试,但是我不希望影响数据库中当前的任何数据。我可以在开始时运行 CLEAN_INSERT 来初始化数据,但是在所有测试方法运行之后,我希望数据恢复到运行 JUnit 测试之前的状态。

提前致谢

4

2 回答 2

1


我们在oVirt开源项目 中解决了类似的问题。请查看位于 engine\backend\manager\modules\dal\src\test\java\org\ovirt\engine\core\dao\BaseDAOTestCase.java 的代码。
总的来说,看看我们在 @BeforeClass 和 @AfterClass 方法上做了什么。您可以在每种方法的基础上使用它。为此,我们使用了 Spring-test 框架。

于 2012-06-18T18:50:27.433 回答
1

就像“setUp”一样,JUnit 提供了在每个测试方法之后执行的“tearDown”方法。你可以用来回滚。同样从 JUnit 4 开始,您有以下注释:

  • @BeforeClass:在测试用例中运行任何测试之前运行一次
  • @Before:每次在测试方法之前运行
  • @After:每次测试方法后运行
  • @AfterClass:在当前套件中的所有测试都执行后运行一次
于 2012-06-18T18:59:30.943 回答