自动化组件测试

“组件测试”或“子系统测试”验证系统的各个部分,可能需要安装整个系统或某些外部依赖关系,如数据库、文件系统或网络终端等。这些测试验证组件间的交互能产生预期的组合行为。典型的组件测试需要底层数据库支持,甚至可能跨越架构边界。因为每个测试用例执行的代码量更大,每个测试的代码覆盖率也更大,所以这些测试一般比单元测试执行的时间长。

代码清单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页面底下的业务层。

 

自动化组件测试_第1张图片

本文节选自《持续集成:软件质量改进和风险降低之道》一书

图书详细信息:http://bvbroadview.blog.51cto.com/addblog.php

[]Paul M. Duvall (保罗.M. 杜瓦尔)Steve Matyas (史蒂夫.迈耶斯) Andrew Glover(安德鲁.格洛弗

王海鹏 

电子工业出版社出版