软件测试


网站首页 | 软件测试论坛 | 软件测试培训 | 软件测试博客 | 软件测试杂志 | 软件测试沙龙 | 软件测试下载 | 软件测试顾问
业界新闻 | 软件测试人才 | 软件测试技术 | 软件测试工具 | 行业软件测试 | 软件测试管理 | 软件质量专栏 | 软件开发专栏
当前位置:首页>>软件测试技术>>其他相关>>正文
追求代码质量: 通过测试分类实现敏捷构建二
文章出处:ibm 作者:Stelligent Incorporated 发布时间:2007-02-09

2. 组件测试

    组件测试验证多个相互作用的对象,但它突破了隔离的概念。由于组件测试处理一个架构的多个层次,所以它们经常用于处理数据库、文件系统、网络元素等。同样,提前编写组件测试有点难,所以将其包含至一个真正的测试优先/测试驱动的场景中是很大的挑战。

    编写组件测试要花更长的时间,因为它们比单元测试所涉及的东西要多。另一方面,由于其宽广的范围,它们实现了比单元测试更广的代码覆盖率。当然它们也要花更多时间运行,所以同时运行很多的组件测试会显著地 增加总的测试时间。

    许多框架有助于测试大型架构组件。DbUnit 是这类框架的一个典型例子。DbUnit 能够很好地处理在测试状态间建立一个数据库这样的复杂性,因而它会使编写依赖于数据库的测试变得较为简单。

    当构建的测试延长时,通常都预示着包含了一个大型的组件测试套件。由于这些测试比真正的单元测试运行时间长,因而不能一直运行它们。相应地,在 CI 环境中这些测试可以至少 每小时运行一次。在签入任何代码前,也应该总在一个本地开发人员机器上运行这些测试。

验收测试
验收测试 和功能测试类似,不同之处在于,理想情况下,验收测试是由客户或最终用户编写的。正如功能测试一样,验收测试也像最终用户测试那样进行。Selenium(参见 参考资料)是一个备受瞩目的验收框架,它使用浏览器测试 Web 应用程序。Selenium 在构建过程中可以是自动运行的,就像 JUnit 测试一样。但 Selenium 是一个新平台:它不使用 JUnit,在使用方式上也不相似。

3. 系统测试

    系统测试端到端地 验证一个软件应用程序。因而,它们引入了一个更高级别的架构复杂度:整个应用程序必需为要进行的系统测试而运行。如果是一个 Web 应用程序,您就需要访问数据库以及 Web 服务器、容器和任何与运行系统测试相关的配置。其遵循这样的原则,即大多数系统测试都在软件生命周期的较后周期中编写。

    编写系统测试是个挑战,也需要大量的时间来实际地执行。而另一方面,就架构性代码覆盖率来讲,系统测试是一件极为划算的事情。

    系统测试和功能测试很相似。所不同的是,它们并不仿效用户,而是模拟出 一个用户。与在组件测试中一样,现在创建了大量的框架来为这些测试提供方便。例如,jWebUnit 通过模拟一个浏览器来测试 Web 应用程序。

用 jWebUnit 还是 Selenium 呢?
jWebUnit 是为系统测试设计的一个 JUnit 扩展框架;因而它需要您来编写测试。Selenium 在验收测试和功能测试方面表现卓越,不同于 jWebUnit,它使非程序员也能够编写测试。理想情况下,团队可以同时 使用两种工具来验证应用程序的功能。

实现测试分类

    所以,您的单元测试套件就是名副其实的包括单元测试、组件测试和系统测试的套件。不仅如此,在检查了这些测试后,您现在知道构建花了三个小时的原因是:绝大部分时间都被组件测试所占用。下一个问题是,如何用 JUnit 实现测试分类?

有几种方式可选,但这里我们只关注于其中两种最简单的方式:

  • 根据所需种类创建定制的 JUnit 套件文件。
  • 为每种测试类型创建定制目录。
用 TestNG 进行测试分类
用 TestNG 实现测试分类相当简单。用 TestNG 的 group 注释按照种类在逻辑上划分测试,这与将适当的 group 注释应用到所需测试中一样简单。这样一来,运行一个特定类型实际上就是将一个相应的组名称传递给一个测试运行程序,如 Ant。

创建定制套件

    可以使用 JUnit 的 TestSuite 类(属于 Test 类型)来定义许多互相归属的测试。首先,创建一个 TestSuite 实例,并为其添加相应的测试类或测试方法。然后,可以通过定义一个叫做 suite()public static 方法,在 TestSuite 实例中指定 JUnit。包含的所有测试随后将在单个运行中执行。因而,可以通过创建单元 TestSuite、组件 TestSuite 和系统 TestSuite 来实现测试分类。

    例如,清单 1 中显示的类创建了一个 TestSuite,其持有 suite() 方法中所有的组件测试。请注意此类并不是非常特定于 JUnit 的。它既没有扩展 TestCase,也没有定义任何测试用例。但它会反射性地找到 suite() 方法并运行由它返回的所有测试。


清单 1. 用于组件测试的 TestSuite
package test.org.acme.widget;

import junit.framework.Test;
import junit.framework.TestSuite;
import test.org.acme.widget.*;

public class ComponentTestSuite {

 public static void main(String[] args) {
  junit.textui.TestRunner.run(ComponentTestSuite.suite());
 }

 public static Test suite(){
  TestSuite suite = new TestSuite();
  suite.addTestSuite(DefaultSpringWidgetDAOImplTest.class);
  suite.addTestSuite(WidgetDAOImplLoadTest.class);
  ...
  suite.addTestSuite(WidgetReportTest.class);
  return suite;
 }
}

    定义 TestSuite 的过程的确需要浏览现有的测试,并将它们添加到相应的类中(即,将所有的单元测试添加到一个 UnitTestSuite 中)。这也意味着,由于在一个给定分类中编写新测试,不得不将它们按照一定的程序添加到适当的 TestSuite 中,当然,还需要重新编译 它们。

    运行独立的 TestSuites,然后试着创建单一的 Ant 任务,Ant 任务调用正确的测试集。可以定义一个 component-test 任务,用于组织 ComponentTestSuite 等,正如清单 2 中所示:


清单 2. 只运行组件测试的 Ant 任务

 
<target name="component-test" 
           if="Junit.present" 
           depends="junit-present,compile-tests">
 <mkdir dir="${testreportdir}"/>   
 <junit dir="./" failureproperty="test.failure" 
             printSummary="yes" 
             fork="true" haltonerror="true">
   <sysproperty key="basedir" value="."/>     
   <formatter type="xml"/>      
   <formatter usefile="false" type="plain"/>     
   <classpath>
    <path refid="build.classpath"/>       
    <pathelement path="${testclassesdir}"/>        
    <pathelement path="${classesdir}"/>      
   </classpath>
   <batchtest todir="${testreportdir}">
    <fileset dir="test">
     <include name="**/ComponentTestSuite.java"/>                 
    </fileset>
   </batchtest>
 </junit>
</target>

    理想情况下,还需要有调用单元测试和系统测试的任务。最后,在想要运行整个测试套件时,应该创建一个依赖于所有三种测试种类的第四项任务,如清单 3 中如示:


清单 3. 用于所有测试的 Ant 任务

<target name="test-all" depends="unit-test,component-test,system-test"/>

    创建定制 TestSuite 是实现测试分类的一个快速解决方案。这个方法的缺点是:一旦创建新测试,就必须通过编程将它们添加到适当的 TestSuite 中,这很痛苦。为每种测试创建定制目录更具扩展性,且允许 经过重新编译就添加新的经过分类的测试。


上一页 下一页


站内搜索
相关文章
◎追求代码质量: 通过测试分类实现敏捷构建一
◎解析测试工程师职业发展瓶颈三
◎解析测试工程师职业发展瓶颈二
◎解析测试工程师职业发展瓶颈一
◎试点项目的特点及处理方式
◎软件评测师考试经验分享
◎如何评价测试人员的工作绩效?
◎测试经理的能力要求
◎管理一个测试组织涉及到的相关概念
◎各种类型的软件的测试应该是相通的
◎MP3芯片方案
◎accessibility test的拓宽思维
◎测试人员如何获得高薪?
◎从企业问题来了解软件测试人员的作用
◎关于测试工作考核
◎测试就是不断的总结与创新
◎测试员的职责
◎从十大经典故事中学管理
◎优秀测试人员所具备的素质
◎一位软件测试工程师的工作总结
◎测试工作的未来
◎软件测试工程师的素质
◎模糊测试
◎做软件测试至少要有四种能力
◎面向对象的系统测试
◎我的SP心得
◎如何编制成功的测试计划
◎用vbs新建文件夹的方法
◎浅谈软件测试之技巧
◎微软公司是如何测试的
◎软件人员,做什么才好?
◎提高测试覆盖度
◎我从沙龙看测试界
◎软件测试职业发展的各个阶段
◎追求代码质量: 可重复的系统测试
◎软件项目测试管理经验谈
◎软件测试过程和流程区别
◎面试问题积累-新手注意
◎测试员的职责
◎软件质量保证的最佳实践之一:Code review和Case review
◎16个月的工作感想
◎如何增加面试成功的胜算
◎《测试之道》第四篇——胡马大宛名
◎《测试之道》第三篇——吴钩霜雪明
◎《测试之道》第二篇——大道如一,过犹不及
◎《测试之道》第一篇——道可道
◎软件测试方向杂谈
◎程序员实用测试技巧(1)
◎测试小技巧之文档编写
◎软件测试的起源与发展
热门文章
◎软件测试工程师面试问题选登
◎一个初级测试工程师的工作总结
◎软件测试常用术语表
◎测试人员面试三步曲
◎DOS命令大全
◎什么样的测试人员是好的测试人员
◎软件测试基本方法
◎好的测试工程师应具备的素质
◎软件测试工程师面试题
◎软件测试入门书籍(2)
◎面试官最爱问的问题背后真相
◎我在软件公司成长的三年
◎应届毕业生少走弯路的十条忠告
◎有关软件测试的术语定义集锦
◎微软的软件测试方法(一)
◎软件测试步骤
◎全景记录:软件测试工程师的一天
◎我的测试经历(1)
◎漫谈软件测试工程师的角色定位
◎谈谈对测试职业的看法
◎测试需要掌握什么
◎软件测试员自身素质培养
◎测试小技巧集锦之一黑盒测试
◎近10年最强的50本计算机图书,您读过几本?
◎软件测试人员职业发展助手
◎测试要点总结
◎如何制定成功的测试计划
◎什么是ERP,通俗版解释
◎测试的主要评测方法(1)
◎软件产品测试标准
◎测试经验交流
◎微软的软件测试方法(二)
◎编写优秀Bug报告的艺术
◎软件测试及其支持工具
◎从程序员到测试工程师
◎软件测试应遵循的八条原则
◎个人职业生涯规划发展
◎你适合做测试吗?
◎测试版本大全
◎网管和黑客都必须知道的命令
◎测试人员的挑战
◎我的测试经历(2)
◎Alpha和Beta测试简介
◎QA活动的理解与实施
◎浮躁的国内测试界—2006年测试人员招聘感悟
◎想编写出优秀技术文档,先学学这四招
◎网络最经典命令行
◎软件测试的误区
◎我的测试经历(3)
◎软件测试的心理学问题

Google提供的广告