DBUnit不会在每个方法之后清理并插入数据库,因此测试不是独立的

ERN*_*RON 7 java tdd testng dbunit

我有一个DAO类的测试,我使用DBUnit来创建和填充数据库(使用内存中的德比).我在测试dao update方法时遇到问题,因为它修改数据然后另一个测试失败.因为我们所有人都知道测试应该独立于任何其他测试,并且我知道DBUnit在每次测试后都有一些清理和重新生成数据库的工具.但它不起作用!

代码就是这个(TestNG):

@BeforeMethod
public void prepareData() throws Exception {
  cleanAndPopulate("users");
}

public void cleanAndPopulate (String nameXML) throws Exception {
  IDatabaseConnection conn; 
  conn = new DatabaseConnection (sessionForTesting.connection());        
  InputStream is = DBconnection.class.getClassLoader()
    .getResourceAsStream(nameXML + ".xml");      
  dataset = new FlatXmlDataSet(is);
  System.out.println("*** Preparando base de datos de test"); 
  DatabaseOperation.CLEAN_INSERT.execute(conn, dataset); 
}
Run Code Online (Sandbox Code Playgroud)

这是测试(禁用以避免附带影响):

@Test(enabled=false) // Deja la BBDD en estado erroneo!!!
public void busco_y_actualizo() throws Exception { 
    PacoUser resultado = userdao.getById(1L);
    resultado.setName("OTRO");
    userdao.update(resultado);
    PacoUser resultado2 = userdao.getById(1L);
    AssertJUnit.assertNotNull(resultado2); 
    AssertJUnit.assertEquals("OTRO", resultado2.getName());    
}
Run Code Online (Sandbox Code Playgroud)

Day*_*ong 9

这是因为CLEAN_INSERT在测试之前"清洁",而不是在测试之后.

例如,如果有两个测试,test1和test2.test1和test2分别从test1.xml和test2.xml填充表.

test1.xml就像

<dataset>
  <table1 ... />
  <table2 ... />
</dataset>
Run Code Online (Sandbox Code Playgroud)

test2.xml就好

<dataset>
  <table1 ... />
</dataset>
Run Code Online (Sandbox Code Playgroud)

当测试的顺序是test1然后是test2时,CLEAN_INSERT将执行以下操作:

  1. 从table2中删除所有内容
  2. 从table1中删除所有内容
  3. 将test1.xml中的数据插入table1
  4. 将test1.xml中的数据插入table2
  5. 执行test1
  6. 从table1中删除所有内容
  7. 将test2.xml中的数据插入table1
  8. 执行test2

因此,当执行test2时,table1包含来自test2.xml的数据,这正是我们所期望的.但是table2仍然包含test1的数据,这可能会导致一些问题.

解决方法是在所有xml文件中为每个表创建一个空行.它将确保在插入之前清除所有表格.

对于上面的例子,

test1.xml会是这样的

<dataset>
  <table1 ... />
  <table2 ... />
  <table1 />
  <table2 />
</dataset>
Run Code Online (Sandbox Code Playgroud)

test2.xml就好

<dataset>
  <table1 ... />
  <table1 />
  <table2 />
</dataset> 
Run Code Online (Sandbox Code Playgroud)


jab*_*bal 0

确保在每个测试用例之前重置数据库以确保测试独立性。@BeforeMethod 仅在所有测试用例运行之前调用一次,因此放在cleanAndPopulate这里是不够的。