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


问题内容

我是自动化测试和dbUnit的新手。因此,感谢您的建议。

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

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

到那里对我来说看起来不错,但是我不明白,是在测试运行并更改数据后如何将数据库还原为 STATE0

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

在测试中简单地不提交事务对我来说不合适,因为测试最终将运行多个事务,并且可能运行多个数据库连接。


问题答案:

如果正确编写和方法@BeforeClass,DBUnit可以自动完成四个工作。例如,在我们的项目中,使用Derby,一个这样的测试用例看起来像@Before``@After

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 { ... }
}

此代码将DB模式(的一个子集)恢复到MyDataSet.xml每次测试后定义的状态。(请注意,正如@Pascal所评论的那样,重置可能并不总是完整的-
如果测试修改了不在数据集中的表,它将不受@Before/ @After方法的影响。)