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