“组件测试”或“子系统测试”验证系统的各个部分,可能需要安装整个系统或某些外部依赖关系,如数据库、文件系统或网络终端等。这些测试验证组件间的交互能产生预期的组合行为。典型的组件测试需要底层数据库支持,甚至可能跨越架构边界。因为每个测试用例执行的代码量更大,每个测试的代码覆盖率也更大,所以这些测试一般比单元测试执行的时间长。
代码清单6-3展示了一个组件测试的例子,它利用DbUnit框架来生成数据库中的基底数据,然后尝试基于数据库中的内容找到数据。DbUnit使用了一些XML文件,它读入这些文件并将对应的数据插入到匹配的数据库表中。
代码清单6-3 使用DbUnit的组件测试
public class DefaultWordDAOImplTestextends DatabaseTestCase {
protected IDataSet getDataSet()throws Exception {
return new FlatXmlDataSet(newFile("test/conf/wseed. xml"));
}
protected IDatabaseConnectiongetConnection() throws Exception {
final Class driverClass =
Class.forName("org.gjt.mm.mysql.Driver");
final Connection jdbcConnection=
DriverManager.getConnection(
"jdbc:mysql://localhost/words",
"words","words");
return newDatabaseConnection(jdbcConnection);
}
public voidtestFindVerifyDefinition() throws Exception{
final WordDAOImpl dao = newWordDAOImpl();
final IWord wrd =dao.findWord("pugnacious");
for(Iterator iter =
wrd.getDefinitions().iterator();
iter.hasNext();){
IDefinition def =(IDefinition)iter.next();
TestCase.assertEquals(
"def is not Combative in nature;belligerent.",
"Combative in nature;belligerent.",
def.getDefinition());
}
}
publicDefaultWordDAOImplTest(String name) {
super(name);
}
}
组件级的测试比单元测试用到更多的依赖关系,但不一定像更高级的系统测试(稍后定义)用到的那么多。组件级的测试通过API来执行代码,但这些API可能暴露给客户,也可能不暴露给客户。在代码清单6-3中,主要通过暴露出的接口测试了数据访问对象(DAO)层的一个对象。另一个组件测试的例子通过StrutsTestCase框架测试了Struts架构中一个动作类,如代码清单6-4所示。这个测试明显需要一个数据库才能执行,但Web容器则是虚拟的,执行的API也不必暴露给客户。
代码清单6-4 使用StrutsTest的组件测试
publicclass ProjectViewActionTest extends DeftMeinMockStrutsTestCase {
public voidtestProjectViewAction() throws Exception {
this.addRequestParameter("projectId", "100");
this.setRequestPathInfo("/viewProjectHistory");
this.actionPerform();
this.verifyForward("success");
Project project =(Project)this.getRequest()
.getAttribute("project");
assertNotNull(project);
assertEquals(project.getName(),"DS");
}
protected StringgetDBUnitDataSetFileForSetUp() {
return"dbunit-seed.xml";
}
publicProjectViewActionTest(String name) {
super(name);
}
}
在代码清单6-4中,StrutsTestCase框架与DbUnit一起提供了向数据库填充基底数据的功能和一个虚拟的容器。DeftMeinMockStrutsTestCase类是一个模板,它要求实现getDBUnitDataSetFileForSetUp方法。
这种类型的测试也被称为“集成测试”。这种类型的测试与系统测试的不同之处在于,集成测试(或组件测试、子系统测试)并不总是执行那些期望公开的API。例如,系统测试可以通过Web应用程序的Web页面执行它,但组件测试可以执行应用程序Web页面底下的业务层。
本文节选自《持续集成:软件质量改进和风险降低之道》一书
图书详细信息:http://blog.csdn.net/broadview2006/article/details/7660148
[美]Paul M.Duvall (保罗.M. 杜瓦尔)Steve Matyas (史蒂夫.迈耶斯) Andrew Glover(安德鲁.格洛弗) 著
王海鹏 译
电子工业出版社出版