使用 DBUnit 在数据库中断言更新数据的好策略是啥?
Posted
技术标签:
【中文标题】使用 DBUnit 在数据库中断言更新数据的好策略是啥?【英文标题】:What is a good strategy to assert updated data in Database with DBUnit?使用 DBUnit 在数据库中断言更新数据的好策略是什么? 【发布时间】:2012-05-22 19:37:27 【问题描述】:这里有一些(过度)简化的代码示例来描述我的单元测试方法。
公司数据集.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 文件听起来不是一个好主意。
第二种方式很简单,但是,当有不同的更新方法时,测试类将填充以不同值断言不同属性的方法。如果加载方法有问题,很多测试都会中断。
有没有好的方法来断言数据?是否有可能避免我刚才描述的问题(或者它并不重要)?
更新
由于没有人回答这个问题,我决定接受我的回答。
【问题讨论】:
【参考方案1】:我在测试数据库方面苦苦挣扎了很长时间,我在几篇博文中整理了我的想法:
Testing the Impossible: Rules of Thumb Testing With Databases All my testing related blog posts【讨论】:
谢谢,这些肯定会帮助我进行数据库测试:)【参考方案2】:这是另一种断言数据的方法。
因为我已经拥有包含当前数据库数据的实际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 到generate DTD file from database on the fly,并使用它来验证 XML。我们很少更改列名,因此开销应该很低。
【讨论】:
以上是关于使用 DBUnit 在数据库中断言更新数据的好策略是啥?的主要内容,如果未能解决你的问题,请参考以下文章