java - DBUnit 没有在每个方法之后清理和插入数据库,所以测试不是独立的

标签 java tdd testng dbunit

我有一个 DAO 类的测试,我使用 DBUnit 来创建和填充数据库(使用内存中的 derby)。 我在测试 dao 更新方法时遇到了问题,因为它修改了数据,然后另一个测试失败了。众所周知,测试应该独立于任何其他测试,而且我知道 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); 
}

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

@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());    
}

最佳答案

这是因为 CLEAN_INSERT 在测试之前执行“CLEAN”,而不是在测试之后。

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

test1.xml 就像

<dataset>
  <table1 ... />
  <table2 ... />
</dataset>

test2.xml 就像

<dataset>
  <table1 ... />
</dataset>

当测试顺序为test1然后test2时,CLEAN_INSERT会做如下操作:

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

所以当执行test2时,table1有test2.xml中的数据,这是我们所期望的。但是table2仍然包含test1的数据,这可能会导致一些问题。

解决方法是为所有 xml 文件中的每个表设置一个空行。它将确保在插入之前清除所有表。

对于上面的例子,

test1.xml 会像

<dataset>
  <table1 ... />
  <table2 ... />
  <table1 />
  <table2 />
</dataset>

test2.xml 就像

<dataset>
  <table1 ... />
  <table1 />
  <table2 />
</dataset> 

关于java - DBUnit 没有在每个方法之后清理和插入数据库,所以测试不是独立的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7670645/

相关文章:

java - ArrayList .contains() 不起作用

java - 复制和排序数组中的错误

java - 我的简单 antlr 语法有什么问题?

java - 无法在 Gradle 多项目构建中读取另一个项目中的资源文件

android - AWS Device farm 似乎忽略了 TestNG 注释

asp.net-mvc-2 - TDD使用ASP.NET MVC 2,NUnit和Rhino Mocks的 Controller

c# - 将 TDD 追溯应用到 C# 代码库中的最佳选择

node.js - 不显眼的 Node 测试

java - 如何理解testng中相同的<test>标签?

testng - 如何获取 Testng - 如果测试用例具有具有多个值的数据提供程序,则测试方法名称