使用DBUnit在数据库中断言更新数据的好策略是什么?

6

以下是我用来描述单元测试方法的(过度)简化代码示例。

CompanyDataSet.xml

<dataset>
    <company company_key="100" company_name="OldName" />
</dataset>

CompanyDaoTest.java

@Test
public void testUpdateCompany() {
  CompanyDao companyDao = new CompanyDao();
  IDatabaseConnection dbConn = createConnection();

  IDataSet dataSet = createDataSet("CompanyDataSet.xml");
  DatabaseOperation.CLEAN_INSERT.execute(dbConn, dataSet);

  companyDao.updateCompany(100, "NewName");

  // What is a good way to assert updated company data ?
}

我想到了两种验证公司数据的方法。 创建另一个预期数据集作为数据源。 另一个XML。
<dataset>
    <company company_key="100" company_name="NewName" />
</dataset>

Java中的断言部分

IDataSet actual = dbConn.createDataSet(new String[]{"company"});
IDataSet expected = createDataSet("CompanyDataSet_expected.xml");

Assertion.assertEquals(expected, actual);

只需通过DAO加载公司对象,然后比较属性即可。

你应该明白了。


我的问题

第一种方法很容易编写,但我必须为每种不同的更新方法创建另一个XML文件。创建这么多数据集XML文件听起来并不是一个好主意。

第二种方法很直接,但当有不同的更新方法时,测试类将充满了断言不同属性具有不同值的方法。如果加载方法出现问题,许多测试将会失败。

有没有一种好的方法来断言数据?是否有可能避免我刚才描述的问题(或者这真的无关紧要)?

更新

由于没有人回答这个问题,我决定接受自己的答案。

2个回答

4

谢谢,这些肯定会对我在数据库测试方面有所帮助 :) - Rangi Lin

1

以下是另一种断言数据的方法。

由于我已经有了实际的 IDataSet,其中包含数据库的当前数据,因此我可以从中简单地检索数据。

我使用问题中的示例,这就是我的做法。

@Test
public void testUpdateCompany() {
  CompanyDao companyDao = new CompanyDao();
  IDatabaseConnection dbConn = createConnection();

  IDataSet dataSet = createDataSet("CompanyDataSet.xml");
  DatabaseOperation.CLEAN_INSERT.execute(dbConn, dataSet);

  companyDao.updateCompany(100, "NewName");

  IDataSet actual = dbConn.createDataSet(new String[]{"company"});
  ITable companyTable = actual.getTable("company");

  assertEquals("NewName", companyTable.getValue(0, "company_name"));
}

如果要检查很多属性,这可能会有点冗长,但是它应该很容易处理。


更新

虽然这种方法确实解决了问题,但测试不再与不相关的方法耦合。但是,在维护方面,它实际上具有与前两种方式相同的开销,甚至更糟。因为我必须在Java代码中编写列名称(很多),并且没有办法验证这一点。

我们团队决定尽可能使用数据集来断言数据。主要原因是我们希望保持测试数据尽可能小,并且易于断言。

因此,问题的答案将是使用数据集

然而,这也会有一些缺点,以下是我们目前处理它的方式:

组织XML文件: 位置:数据集XML文件将与测试类位于同一包中。 命名:XML文件将以测试类名称开头,必要时添加方法/状态名称。例如:"companyDao-updateCompany-expected.xml"
使XML与数据库同步。 我们将使用Untils从数据库动态生成DTD文件,并使用它来验证XML。我们很少更改列名称,因此开销应该很低。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接