Ran*_*Lin 6 java dbunit unit-testing
下面是一些(过度)简化的代码示例来描述我的单元测试方法.
<dataset>
<company company_key="100" company_name="OldName" />
</dataset>
Run Code Online (Sandbox Code Playgroud)
@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 ?
}
Run Code Online (Sandbox Code Playgroud)
我提出了两种断言公司数据的方法.
创建另一个数据集xml作为预期数据集.
另一个XML
<dataset>
<company company_key="100" company_name="NewName" />
</dataset>
Run Code Online (Sandbox Code Playgroud)
在Java中断言部分
IDataSet actual = dbConn.createDataSet(new String[]{"company"});
IDataSet expected = createDataSet("CompanyDataSet_expected.xml");
Assertion.assertEquals(expected, actual);
Run Code Online (Sandbox Code Playgroud)
只需通过DAO加载公司对象,然后比较属性.
你应该明白这个想法.
第一种方法很容易编写,但我必须为每种不同的更新方法创建另一个XML文件.创建这么多数据集XML文件听起来不是一个好主意.
第二种方法很简单,但是,当存在不同的更新方法时,测试类将填充使用不同值声明不同属性的方法.如果加载方法有问题,很多测试都会破坏.
是否有一种断言数据的好方法?是否有可能避免我刚才描述的问题(或者它真的不重要)?
由于没有人回答这个问题,我决定接受我的回答.
这是断言数据的另一种方法。
因为我已经拥有包含数据库当前数据的实际数据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"));
}
Run Code Online (Sandbox Code Playgroud)
如果有很多属性要检查,那就有点冗长了,但应该很容易处理
虽然这种方式可以解决问题,但测试将不再与不相关的方法结合。但是,当涉及到维护时,它实际上具有与前两种方式相同的开销,甚至更糟。因为我必须在java代码中写入列名(很多),并且没有办法验证这一点。
我们的团队决定尽可能使用数据集来断言数据。主要原因是我们希望测试数据尽可能小,并且易于断言。
所以问题的答案将使用数据集
但是,也会有一些缺点,目前我们是这样处理的:
组织 XML 文件:
位置:数据集 XML 文件将位于测试类的同一包中。
命名:XML 文件将以测试类名称开头,并根据需要添加方法/状态名称。例如:“companyDao-updateCompany-expected.xml”
使 XML 与数据库同步。
我们将使用Untils从数据库动态生成 DTD 文件,并使用它来验证 XML。我们很少更改列名,因此开销应该很低。