如何使用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
方法的影响。)