java - 如何使用 dbUnit 将数据库恢复到初始状态?

标签 java unit-testing testing dbunit

我是自动化测试和 dbUnit 的新手。所以非常感谢您的建议。

我要创建一个测试套件,它将按以下方式运行:

  • 创建内存中的 H2 数据库
  • 运行 DDL 脚本来创建表
  • 运行 dbUnit 以插入将由所有测试使用的初始数据(我们称之为 STATE0)。
  • 运行测试

到目前为止它对我来说看起来不错,但我不明白的是,在测试运行并更改数据后如何将数据库恢复到 STATE0

我可以用 dbUnit 做吗?
还是用其他东西?
我应该在每次测试前重新创建数据库吗?

简单的不在测试中提交事务对我来说不合适,因为测试最终会运行多个事务超过一个数据库连接。

最佳答案

如果您正确编写@BeforeClass@Before@After 方法,DBUnit 可以自动完成这四个工作。例如。在我们的项目中,使用 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 方法。)

关于java - 如何使用 dbUnit 将数据库恢复到初始状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3813684/

相关文章:

testing - 测试与第三方 API 的连接如何适应持续集成?

javascript - Protractor (用于测试 Angular growl )通过/失败不一致

django - React 前端与 Django REST 后端的集成测试

java - Spring属性占位符配置需要在运行时动态替换

unit-testing - Groovy Spock 文件测试

unit-testing - 通过一些更改从 Const 初始化变量

unit-testing - Grails Interceptor模型在单元测试中为空

java - 无法删除文件 Java

java - 我们为什么要部署应用程序?

Java - num1 = event.getActionCommand() 不起作用(无法将字符串设置为 Int)