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

时间:2012-05-15 09:54:20

标签: java unit-testing dbunit

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

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作为预期数据集。

另一个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 个答案:

答案 0 :(得分:4)

我一直在努力测试数据库很长时间,我在几篇博文中编写了我的想法:

答案 1 :(得分: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代码中写入列名(很多),并且无法验证这一点。

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

所以问题的答案是使用数据集

然而,也会有一些缺点,这就是我们现在如何处理它:

  1. 整理XML文件:

    位置:数据集XML文件将位于测试类的同一个包中。

    命名:XML文件将以测试类名称开头,并在必要时添加方法/状态名称。例如:“companyDao-updateCompany-expected.xml”

  2. 使XML与数据库同步。

    我们将Untils用于generate DTD file from database on the fly,并使用它来验证XML。我们很少更改列名,因此开销应该很低。