7.2.2 用DbUnit进行断言
要进行断言,必须知道期待结果是什么,实际结果是什么。上一节已经介绍了如何用DbUnit载入XML文件中的数据。这里我们仍然用这个方法载入期待结果。同样,期待结果的数据准备还是使用XML文件,如下:
代码7.6 期待结果文件 expectedResult.xml
1 <?xml version="1.0" encoding="GB2312"?> |
第3行,期待数据库中有一条记录id为001,name为mike。因为不需要插入数据库,这里的表名EXP_TABLE也不用和数据库中物理表名一致。
再用上一节的方法载入这个数据文件,存到DataSet中。现在期待结果有了,剩下的就是要从数据库中查出实际结果。这就需要用到另一个DataSet类——QueryDataSet。
代码7.7 查询数据库
01 public class TestDbUnit { 02 @Test 03 public void testDbUnit() { 04 ... 05 QueryDataSet queryDataSet = new QueryDataSet(connection); 06 queryDataSet.addTable("TABLE", "select id, name from TABLE"); 07 ... 08 } 09 } |
第5行,用IDatabaseConnection对象作为参数初始化一个QueryDataSet对象。
第6行,使用addTable方法将查询结果存放到queryDataSet中。该方法有两个参数,第一个参数标志queryDataSet中的表名,第二个参数传入需要执行的select语句。
这样我们既获得了期待结果(一个FlatXmlDataSet对象),又获得了实际结果(一个QueryDataSet对象),接下来就可以用DbUnit自带的断言函数Assertion.assertEquasl做比较。
该方法有两个参数,均为ITable对象,前者表明期待结果,后者为实际结果。这两个参数的顺序要正确,否则在分析断言结果时会混淆期待结果和实际结果。
这种比较方式仍然没有避免表结构变更带来的影响,比如现在id字段改名成sid,那么代码也要相应改变。代码和表结构仍然没有分离。我们可以通过字段过滤功能消除这种影响。
代码7.8 筛选字段进行比较
01 @Test 02 public void testDbUnit() { 03 IDataSet expDataSet = getDataSet("expectedResult.xml"); 04 05 QueryDataSet queryDataSet = new QueryDataSet(connection); 06 queryDataSet.addTable("TABLE", "select * from TABLE"); 07 08 // 根据期待结果过滤字段 09 ITable filterdTables = DefaultColumnFilter.includedColumnsTable( 10 queryDataSet.getTable("EXP_TABLE"), expDataSet 11 .getTable("TABLE").getTableMetaData(). getColumns()); 12 Assertion.assertEquals(expDataSet.getTable("EXP_TABLE"), filterdTables); 13 } |
第3行,调用自定义的getDataSet方法获得期待结果。
第5~6行,将所有字段取出,获得实际结果。
第9~11行,调用DefaultColumnFilter的includedColumnsTable方法,该方法第一个参数指定待过滤字段的表,第二个参数指定保留的字段。这里根据期待结果中希望比较的字段来过滤实际取出的字段。
第12行,将期待结果和过滤后的实际结果进行比较。
这种方式也有缺点,比如需要取出所有字段,带来了额外的性能消耗。
连载一 连载二 连载三 连载四 连载五 连载六 连载七 连载八 连载九
本文选自:《51Testing软件测试作品系列》之三的 《互联网单元测试及实践》 ,本站经电子工业出版社和作者的授权,近期将进行部分章节的连载,敬请期待!
版权声明:51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像。51testing软件测试网欢迎与业内同行进行有益的合作和交流,如果有任何有关内容方面的合作事宜,请联系我们。