专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » testng:TestNG使Java单元测试轻而易举 »正文

testng:TestNG使Java单元测试轻而易举

来源: 发布时间:星期三, 2009年1月7日 浏览:2次 评论:0
JUnit 框架是 Java 语言单元测试当前站式解决方案这个框架值得称赞它把测试驱动开发思想介绍给 Java 开发人员并教给他们如何有效地编写单元测试但是在过去几年中JUnit 改进不大;所以为当今复杂环境编写测试已经变成个越来越困难任务即 JUnit 必须和其他些补充性测试框架集成起来在本文中Filippo Diotalevi 介绍了 TestNG这是个测试 Java 应用新框架TestNG 不仅确实强大、创新、可扩展、灵活它还展示了 Java Annotations(JDK 5.0 中重大新特性)有趣应用     在每个现代软件Software包构造阶段测试这实战都扮演着中心角色过去那种先编写代码然后有空时候再测试(或者根本不测试)日子已经去不返大多数开发人员现在认识到需要采用编码和测试彼此交织、同步推进软件Software思路方法论以便尽早发现 bug在开发过程开始时候就识别出主要风险

    JUnit 超过了其他测试框架推动开发人员理解了测试尤其是单元测试用途利用个相当简单、实用、严格架构JUnit 已经能够“传染”大量开发人员(有关“被测试传染”更多信息请参阅 参考资料) JUnit 用户已经学会了单元测试些基本规则:

    每段代码都必须经过测试
    只要有可能代码测试必须隔离进行(例如使用像 模拟对象 这样技术)
    软件Software必须容易测试 —— 也就是说在编写时候要想着测试
    但是随着开发人员对测试信任增长JUnit 简单性和严格性把他们分成两个相反派别方面有些人坚信 JUnit 简单性对于不断地提醒员软件Software也必须保持简单来说是必不可少(这称为 KISS 原则代表 keep it simple, stupid);另方面有些人认为 JUnit 不是简单而是简化所以他们想要从测试框架得到新高级特性、更大灵活性和更强大能力JUnit 些特殊特性就是为了满足这个群体些具体批评而推出:

    Java 语言单继承性所以必须扩展 TestCase 类限制很大
    无法向 JUnit 测试思路方法传递参数也无法向 Up 和 tearDown 思路方法传递参数
    执行模型有点奇怪:每次执行个测试思路方法时候都要重新例子化测试类
    管理复杂项目中区别测试套件有可能非常复杂
    TestNG 创造者
    TestNG 创造者是 Cedric Beust他在 Java 编程领域非常出名是 EJB 3 专家组成员也是其他些流行开源项目(例如 EJBGen 和 Doclipse)创造者TestNG 在 Apache 软件Software许可条款约束下发布并可从其 Web 站点下载(请参阅 参考资料 中到该站点和 Cedric 站点链接)
 
    在本文中您将学习到如何用这个叫做 TestNG 新测试框架为应用编写单元测试TestNG 灵感来自 JUnit同时尽量保持后者简单性;但是TestNG 消除了老框架大多数限制使开发人员可以编写更加灵活、更加强大测试由于 TestNG 大量借用 Java Annotation(随 JDK 5.0 引入;有关这个新特性更多信息请参阅 参考资料)来定义测试所以本文也可以向您演示如何在实际生产环境中使用 Java 语言这个新特性

    有关代码
    为了演示 TestNG 使用方法我要为叫做 Jakarta Common Lang 这个广泛应用开源库(其中包含些处理和操纵串、数字和 Java 对象有用类)编写些单元测试在下面 参考资料 节中您可以找到 TestNG 和 Jakarta Common Lang 库链接;如果您想在自己机器上随着本文起练习这 2者都需要下载

    可以在两个区别包中得到 TestNG:个包要求 JDK 5.0个包和 Java 语言 1.4 版本兼容定义测试时候它们使用语法略有差异:前者使用 JDK 5.0 标注后者使用旧 Javadoc 风格标注本文使用是 JDK 5.0 版本所以在继续阅读本文的前需要对标注有基本了解;您可以在 参考资料 中找到有关这个主题 developerWorks 资源链接但是您要知道 只有在编译和运行测试时候 才需要 JDK 5.0所以您仍然可以用自己喜欢编译器来构建应用实际上您将用从 Jakarata 项目 Web 站点下载相同 JAR 文件来测试 Jakarta Common Lang 库有关使用 Java 平台 1.4 版本 TestNG 更多细节可以在 TestNG Web 站点上找到

    最后请单击本文顶部或底部 Code 图标下载 j-testng-sample.zip 文件其中包含些举例演示了如何用 TestNG 为 Jakarta Commons Lang 编写单元测试在里面可以找到这里给出大多数代码还有其他些举例阅读本文并不需要这些代码但是它可以帮助您更加深入地理解在这里介绍概念

    TestNG 快速起步
    TestNG 测试类是普通老式 Java 对象;您不需要扩展任何特殊也不需要使用测试思路方法任何命名约定:您只要用标注 @Test 通知框架这个类思路方法是测试清单 1 演示了实用类 StringUtils 个最简单测试它测试 StringUtils 两个思路方法: isEmpty 思路方法检测 String 是否为空; trim 思路方法从 String 两端删除控制请注意其中使用了 Java 指令 assert 来检测情况

    清单 1. 针对类 StringUtils 个测试用例
 
package tests;
import com.beust.testng.annotations.*;
import org.apache.commons.lang.StringUtils;

public StringUtilsTest
{
@Test
public void isEmpty
{
assert StringUtils.isBlank(null);
assert StringUtils.isBlank("");
}

@Test
public void trim
{
assert "foo".equals(StringUtils.trim(" foo "));
}
}
 
    但是在运行测试的前必须用特殊 XML 文件配置 TestNG习惯上把这个文件命名为 testng.xml这个文件语法非常简单如清单 2 所示这个文件首先定义测试套件 My test suite这个套件只包含个测试 First test这个测试由 StringUtilsTest 类完成

    清单 2. TestNG 配置文件
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="First test">
<es>
< name="tests.StringUtilsTest" />
</es>
</test>
</suite>
    如果这个举例 testng.xml 文件看起来没什么用处(只有个测试类)那么好消息是:这实际上是您定义测试套件时 惟需要编写文件还记得 JUnit 过去日子么?在那些日子里套件定义可能分布在多个文件中:JUnit TestSuite 文件属性文件还有当然缺不了 Ant 构建文件使用 TestNG所有必需数据都集中在 testng.xml 文件中不需要额外 TestSuite 文件和构建文件

    要运行测试请用 javac 编译类然后用以下命令 TestNG :
 
    java -ea -path .;testng.jar;commons-lang-2.0.jar com.beust.testng.TestNG testng.xml
    在这里选项 -ea 告诉 JVM 处理断言(在断言失败时抛出异常);运行这个例子只需要 testng.jar 和 commons-lang-2.0.jar 这两个库而 com.beust.testng.TestNG 是 TestNG 主类对于所有那些已经非常高兴地忘记了 java 和 javac 神秘语法开发人员来说还提供了个有用 Ant 任务作为例子清单 3 演示了本文发布举例应用 Ant 构建文件请注意和类 com.beust.testng.TestNGAntTask 关联 testng 任务定义以及它在 test 目标中相当简单使用方法

    清单 3. 带有 TestNG 任务 Ant 构建文件
<project name="sample" default="test" basedir=".">
<!-- COMPILE TESTS-->
<path id="cpath">
<pathelement location="testng.jar"/>
<pathelement location="commons-lang-2.0.jar"/>
</path>
<target name="compile">
<echo message="compiling tests"/>
<mkdir dir="es"/>
<javac debug="true"
source="1.5" pathref="cpath"
srcdir="src" destdir="es"/>
</target>

<!-- RUN TESTS-->
<taskdef name="testng"
name="com.beust.testng.TestNGAntTask"
pathref="cpath"/>
<path id="runpath">
<path refid="cpath"/>
<pathelement location="es"/>
</path>
<target name="test" depends="compile">
<echo message="running tests"/>
<testng fork="yes" pathref="runpath" outputDir="test-output">
<file dir="src" s="testng.xml"/>
<jvmarg value="-ea" />
</testng>
</target>

</project>
 
    如果切正常那么应当在控制台中看到测试结果而且TestNG 还在当前目录下自动创建了个叫做 test-output 文件夹并在其中创建了份非常好 HTML 报告如果打开该报告并装入 index.html就可以看到和图 1 中页面类似页面

    图 1. TestNG 创建 HTML 报告

    
 定义测试组
    TestNG 另外个有趣特性是其定义测试组能力每个测试思路方法都可以和个或多个组相关联但可以选择只运行某个测试组要把测试加入测试组只要把组指定为 @Test 标注参数使用语法如下:
 
    @Test(groups = {"tests."})
    在这个具体例子中您声明:标注思路方法属于 tests.参数 groups 是所以可以指定多个组组名的间用逗号分隔例如在举例应用您可以为 String、Number 以及 boolean 创建区别测试然后如清单 4 所示配置 TestNG, 有选择地运行它们.

    清单 4. 带有区别组配置文件
 
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My suite">
<test name="Simple example">
<groups>
<run>
< name="tests." />
< name="tests.math" />
<exclude name="tests.boolean"/>
</run>
</groups>
<es>
.... list es here....
</es>
</test>
</suite>
    显然当运行区别测试组时HTML 报告能够在单列表中显示所有测试也可以在独立列表中显示每个组测试从而能够立即理解问题来源

    配置思路方法
    使用 TestNG不仅可以指定测试思路方法还可以用专门标注 @Configuration 指定类中其他特定思路方法这些思路方法叫做 配置思路方法配置思路方法有 4种类型:

    beforeTestClass 思路方法在类例子化的后但是在测试思路方法运行的前执行
    afterTestClass 思路方法在类中所有测试思路方法执行的后执行
    beforeTestMethod 思路方法在类中任何测试思路方法执行的前执行
    afterTestMethod 思路方法在类中每个测试思路方法执行的后执行
    图 2 进步描述了测试类生命周期

    图 2. 测试类生命周期

    

    清单 5 演示了配置思路方法些举例请注意如果您使用组那么配置思路方法也必须属于某个组而且配置思路方法 4种类型彼此的间不是互斥所以可以把思路方法定义成同时属于种或多种配置思路方法类型(作为例子请参阅清单 5 中 aroundTestMethods 思路方法)

    清单 5. 配置思路方法举例
 
@Configuration(beforeTestClass = true, groups = {"tests.workflow"})
public void Up
{
.out.prln("Initializing...");
}
@Configuration(afterTestMethod = true, beforeTestMethod = true, groups = {"tests.workflow"})
public void aroundTestMethods
{

.out.prln("Around Test");
}
 
TestNG 中配置思路方法是 JUnit Up 和 tearDown 思路方法增强版;它们主要目是为测试创建正确执行上下文并在测试用例执行的后刷新数据

    异常检测
    使用 TestNG您可以非常简单、非常容易地检测异常发生很明显用 JUnit 也可以做这件事但是正如您在清单 6 中举例中所看到使用 TestNG @ExpectedExceptions 标注可以使代码编写惊人地容易和简单@ExpectedExceptions 标注指明框架能够容忍抛出 NumberFormatException 异常所以不应当被当作是故障要查看在某行代码中是否抛出异常您可以直接在这行代码的后加入 assert false 语句这意味着 只有 在指定行中抛出特定类型异常时候您才会通过测试

    清单 6. 用 TestNG 进行异常检测
public NumberUtilsTest
{
@Test(groups = {"tests.math"})
@ExpectedExceptions(NumberFormatException.)
public void test
{
NumberUtils.createDouble("12.23.45");
assert false; //shouldn't be invoked
}

}
 
    结束语
    在本文中我提供了 TestNG 快速实用介绍是展示如何开始编写单元测试但是它不是份完整参考手册TestNG 还有许多其他非常有用有趣特性:

    可以向测试思路方法和配置思路方法传递参数可以用标注或在 XML 配置文件中声明参数


    可以在 TestNG 下用“兼容模式”运行过去运行良好 Junit 测试


    可以在测试组的间建立依赖性决定它们执行顺序
    要了解这个框架所有潜力有必要参阅 TestNG 文档(参阅 参考资料)

    所有这些特性和用于定义测试 Java 标注使整个测试过程更加简单、更加灵活编写测试必须遵守规则 很少;除此的外您绝对可以自由选择自己喜欢测试策略

    在使用 TestNG 时最明显这个模板已经是编写单元测试个好选择了而且在设计上它和其他库和工具集成非常简单所以它未来发展会给开发人员带来些有趣新东西

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: