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

我是自动化测试和dbUnit的新手。 所以我很感激你的建议。

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

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

到那里它对我来说很好看,但我不明白的是,如何在测试运行后将数据库恢复到STATE0并更改数据?

我可以用dbUnit做到吗?
还是别的什么?
我应该在每次测试之前重新创建数据库吗?

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

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

如果某些测试在空表中插入行(例如,未在初始数据集中定义),则可能有外键约束。

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

     

在这里,myemptytable有mypopulatedtable的外键。 如果未定义myemptytable,DBUnit将尝试删除mypopulatedtable但由于约束而失败。 如果已定义,DBUnit将删除myemptytable行。