JUnit 框架是 Java 语言单元测试当前
![](/icons/78146de.gif)
![](/icons/78146yi.gif)
站式解决方案
![](/icons/78146dou2.gif)
这个框架值得称赞
![](/icons/78146dou.gif)
![](/icons/78146yinwei.gif)
它把测试驱动
![](/icons/78146de.gif)
开发思想介绍给 Java 开发人员并教给他们如何有效地编写单元测试
![](/icons/78146dou2.gif)
但是
![](/icons/78146dou.gif)
在过去
![](/icons/78146de.gif)
几年中
![](/icons/78146dou.gif)
JUnit
![](/icons/78146de.gif)
改进不大;所以
![](/icons/78146dou.gif)
为当今复杂
![](/icons/78146de.gif)
环境编写测试已经变成
![](/icons/78146yi.gif)
个越来越困难
![](/icons/78146de.gif)
任务
![](/icons/78146dou.gif)
即 JUnit 必须和其他
![](/icons/78146yi.gif)
些补充性测试框架集成起来
![](/icons/78146dou2.gif)
在本文中
![](/icons/78146dou.gif)
Filippo Diotalevi 介绍了 TestNG
![](/icons/78146dou.gif)
这是
![](/icons/78146yi.gif)
个测试 Java 应用
![](/icons/78146chengxu.gif)
![](/icons/78146de.gif)
新框架
![](/icons/78146dou2.gif)
TestNG 不仅确实强大、创新、可扩展、灵活
![](/icons/78146dou.gif)
它还展示了 Java Annotations(JDK 5.0 中
![](/icons/78146de.gif)
重大新特性)
![](/icons/78146de.gif)
有趣应用
![](/icons/78146dou2.gif)
在每个现代软件Software包
![](/icons/78146de.gif)
构造阶段
![](/icons/78146dou.gif)
测试这
![](/icons/78146yi.gif)
实战都扮演着中心角色
![](/icons/78146dou2.gif)
过去那种先编写代码
![](/icons/78146dou.gif)
然后有空
![](/icons/78146de.gif)
时候再测试(或者根本不测试)
![](/icons/78146de.gif)
日子已经
![](/icons/78146yi.gif)
去不返
![](/icons/78146dou.gif)
![](/icons/78146yinwei.gif)
大多数开发人员现在认识到需要采用编码和测试彼此交织、同步推进
![](/icons/78146de.gif)
软件Software思路方法论
![](/icons/78146dou.gif)
以便尽早发现 bug
![](/icons/78146dou.gif)
在开发过程开始
![](/icons/78146de.gif)
时候就识别出主要
![](/icons/78146de.gif)
风险
![](/icons/78146dou2.gif)
JUnit 超过了其他测试框架
![](/icons/78146dou.gif)
推动开发人员理解了测试尤其是单元测试
![](/icons/78146de.gif)
用途
![](/icons/78146dou2.gif)
利用
![](/icons/78146yi.gif)
个相当简单、实用、严格
![](/icons/78146de.gif)
架构
![](/icons/78146dou.gif)
JUnit 已经能够“传染”大量开发人员
![](/icons/78146dou2.gif)
(有关“被测试传染”
![](/icons/78146de.gif)
更多信息
![](/icons/78146dou.gif)
请参阅 参考资料
![](/icons/78146dou2.gif)
) JUnit 用户已经学会了单元测试
![](/icons/78146de.gif)
![](/icons/78146yi.gif)
些基本规则:
每段代码都必须经过测试
只要有可能
![](/icons/78146dou.gif)
代码
![](/icons/78146de.gif)
测试必须隔离进行(例如
![](/icons/78146dou.gif)
使用像 模拟对象 这样
![](/icons/78146de.gif)
技术)
软件Software必须容易测试 —— 也就是说
![](/icons/78146dou.gif)
在编写
![](/icons/78146de.gif)
时候要想着测试
但是
![](/icons/78146dou.gif)
随着开发人员对测试
![](/icons/78146de.gif)
信任增长
![](/icons/78146dou.gif)
JUnit
![](/icons/78146de.gif)
简单性和严格性把他们分成两个相反
![](/icons/78146de.gif)
派别
![](/icons/78146dou2.gif)
![](/icons/78146yi.gif)
方面
![](/icons/78146dou.gif)
有些人坚信 JUnit
![](/icons/78146de.gif)
简单性对于不断地提醒
![](/icons/78146chengxu.gif)
员软件Software也必须保持简单来说是必不可少
![](/icons/78146de.gif)
(这称为 KISS 原则
![](/icons/78146dou.gif)
代表 keep it simple, stupid);另
![](/icons/78146yi.gif)
方面
![](/icons/78146dou.gif)
有些人认为 JUnit 不是简单而是简化
![](/icons/78146dou.gif)
所以他们想要从测试框架得到新
![](/icons/78146de.gif)
高级特性、更大
![](/icons/78146de.gif)
灵活性和更强大
![](/icons/78146de.gif)
能力
![](/icons/78146dou2.gif)
JUnit
![](/icons/78146de.gif)
![](/icons/78146yi.gif)
些特殊特性
![](/icons/78146dou.gif)
就是为了满足这个群体
![](/icons/78146de.gif)
![](/icons/78146yi.gif)
些具体批评而推出
![](/icons/78146de.gif)
:
![](/icons/78146yinwei.gif)
Java 语言
![](/icons/78146de.gif)
单继承性
![](/icons/78146dou.gif)
所以必须扩展 TestCase 类
![](/icons/78146de.gif)
限制很大
无法向 JUnit
![](/icons/78146de.gif)
测试思路方法传递参数
![](/icons/78146dou.gif)
也无法向
![](/icons/78146set.gif)
Up
![](/icons/78146kh.gif)
和 tearDown
![](/icons/78146kh.gif)
思路方法传递参数
执行模型有点奇怪:每次执行
![](/icons/78146yi.gif)
个测试思路方法
![](/icons/78146de.gif)
时候
![](/icons/78146dou.gif)
都要重新例子化测试类
管理复杂项目中
![](/icons/78146de.gif)
区别测试套件有可能非常复杂
TestNG
![](/icons/78146de.gif)
创造者
TestNG
![](/icons/78146de.gif)
创造者是 Cedric Beust
![](/icons/78146dou.gif)
他在 Java 编程领域非常出名
![](/icons/78146dou.gif)
是 EJB 3 专家组
![](/icons/78146de.gif)
成员
![](/icons/78146dou.gif)
也是其他
![](/icons/78146yi.gif)
些流行
![](/icons/78146de.gif)
开源项目(例如 EJBGen 和 Doclipse)
![](/icons/78146de.gif)
创造者
![](/icons/78146dou2.gif)
TestNG 在 Apache 软件Software许可条款约束下发布
![](/icons/78146dou.gif)
并可从其 Web 站点下载(请参阅 参考资料 中到该站点和 Cedric 站点
![](/icons/78146de.gif)
链接)
在本文中
![](/icons/78146dou.gif)
您将学习到如何用这个叫做 TestNG
![](/icons/78146de.gif)
新测试框架为应用
![](/icons/78146chengxu.gif)
编写单元测试
![](/icons/78146dou2.gif)
TestNG
![](/icons/78146de.gif)
灵感来自 JUnit
![](/icons/78146dou.gif)
同时尽量保持后者
![](/icons/78146de.gif)
简单性;但是
![](/icons/78146dou.gif)
TestNG 消除了老框架
![](/icons/78146de.gif)
大多数限制
![](/icons/78146dou.gif)
使开发人员可以编写更加灵活、更加强大
![](/icons/78146de.gif)
测试
![](/icons/78146dou2.gif)
由于 TestNG 大量借用 Java Annotation(随 JDK 5.0 引入;有关这个新特性
![](/icons/78146de.gif)
更多信息
![](/icons/78146dou.gif)
请参阅 参考资料)来定义测试
![](/icons/78146dou.gif)
所以本文也可以向您演示如何在实际
![](/icons/78146de.gif)
生产环境中使用 Java 语言
![](/icons/78146de.gif)
这个新特性
![](/icons/78146dou2.gif)
有关代码
为了演示 TestNG
![](/icons/78146de.gif)
使用方法
![](/icons/78146dou.gif)
我要为叫做 Jakarta Common Lang
![](/icons/78146de.gif)
这个广泛应用
![](/icons/78146de.gif)
开源库(其中包含
![](/icons/78146yi.gif)
些处理和操纵
![](/icons/78146zifu.gif)
串、数字和 Java 对象
![](/icons/78146de.gif)
有用
![](/icons/78146de.gif)
类)编写
![](/icons/78146yi.gif)
些单元测试
![](/icons/78146dou2.gif)
在下面
![](/icons/78146de.gif)
参考资料
![](/icons/78146yi.gif)
节中
![](/icons/78146dou.gif)
您可以找到 TestNG 和 Jakarta Common Lang 库
![](/icons/78146de.gif)
链接;如果您想在自己
![](/icons/78146de.gif)
机器上随着本文
![](/icons/78146yi.gif)
起练习
![](/icons/78146dou.gif)
这 2者都需要下载
![](/icons/78146dou2.gif)
可以在两个区别
![](/icons/78146de.gif)
包中得到 TestNG:
![](/icons/78146yi.gif)
个包要求 JDK 5.0
![](/icons/78146dou.gif)
另
![](/icons/78146yi.gif)
个包和 Java 语言 1.4 版本兼容
![](/icons/78146dou2.gif)
定义测试
![](/icons/78146de.gif)
时候
![](/icons/78146dou.gif)
它们使用
![](/icons/78146de.gif)
语法略有差异:前者使用 JDK 5.0 标注
![](/icons/78146dou.gif)
后者使用旧
![](/icons/78146de.gif)
Javadoc 风格
![](/icons/78146de.gif)
标注
![](/icons/78146dou2.gif)
本文使用
![](/icons/78146de.gif)
是 JDK 5.0 版本
![](/icons/78146dou.gif)
所以在继续阅读本文的前
![](/icons/78146dou.gif)
需要对标注有基本
![](/icons/78146de.gif)
了解;您可以在 参考资料 中找到有关这个主题
![](/icons/78146de.gif)
developerWorks 资源
![](/icons/78146de.gif)
链接
![](/icons/78146dou2.gif)
但是
![](/icons/78146dou.gif)
您要知道 只有在编译和运行测试
![](/icons/78146de.gif)
时候 才需要 JDK 5.0
![](/icons/78146dou.gif)
所以您仍然可以用自己喜欢
![](/icons/78146de.gif)
编译器来构建应用
![](/icons/78146chengxu.gif)
![](/icons/78146dou2.gif)
实际上
![](/icons/78146dou.gif)
您将用从 Jakarata 项目
![](/icons/78146de.gif)
Web 站点下载
![](/icons/78146de.gif)
相同 JAR 文件来测试 Jakarta Common Lang 库
![](/icons/78146dou2.gif)
有关使用 Java 平台 1.4 版本
![](/icons/78146de.gif)
TestNG
![](/icons/78146de.gif)
更多细节
![](/icons/78146dou.gif)
可以在 TestNG
![](/icons/78146de.gif)
Web 站点上找到
![](/icons/78146dou2.gif)
最后
![](/icons/78146dou.gif)
请单击本文顶部或底部
![](/icons/78146de.gif)
Code 图标
![](/icons/78146dou.gif)
下载 j-testng-sample.zip 文件
![](/icons/78146dou.gif)
其中包含
![](/icons/78146yi.gif)
些举例
![](/icons/78146dou.gif)
演示了如何用 TestNG 为 Jakarta Commons Lang 编写单元测试
![](/icons/78146dou2.gif)
在里面
![](/icons/78146dou.gif)
可以找到这里给出
![](/icons/78146de.gif)
大多数代码
![](/icons/78146dou.gif)
还有其他
![](/icons/78146yi.gif)
些举例
![](/icons/78146dou2.gif)
阅读本文并不需要这些代码
![](/icons/78146dou.gif)
但是它可以帮助您更加深入地理解在这里介绍
![](/icons/78146de.gif)
概念
![](/icons/78146dou2.gif)
TestNG 快速起步
TestNG
![](/icons/78146de.gif)
测试类是普通
![](/icons/78146de.gif)
老式 Java 对象;您不需要扩展任何特殊
![](/icons/78146de.gif)
类
![](/icons/78146dou.gif)
也不需要使用测试思路方法
![](/icons/78146de.gif)
任何命名约定:您只要用标注 @Test 通知框架这个类
![](/icons/78146de.gif)
思路方法是测试
![](/icons/78146dou2.gif)
清单 1 演示了实用类 StringUtils
![](/icons/78146de.gif)
![](/icons/78146yi.gif)
个最简单
![](/icons/78146de.gif)
测试
![](/icons/78146dou2.gif)
它测试 StringUtils
![](/icons/78146de.gif)
两个思路方法: isEmpty
![](/icons/78146kh.gif)
思路方法检测 String 是否为空; trim
![](/icons/78146kh.gif)
思路方法从 String 两端删除控制
![](/icons/78146zifu.gif)
![](/icons/78146dou2.gif)
请注意
![](/icons/78146dou.gif)
其中使用了 Java 指令 assert 来检测
![](/icons/78146cuowu.gif)
情况
![](/icons/78146dou2.gif)
清单 1. 针对类 StringUtils
![](/icons/78146de.gif)
![](/icons/78146yi.gif)
个测试用例
package tests;
import com.beust.testng.annotations.*;
import org.apache.commons.lang.StringUtils;
public
![](/icons/78146class.gif)
StringUtilsTest
{
@Test
public void isEmpty
![](/icons/78146kh.gif)
{
assert StringUtils.isBlank(null);
assert StringUtils.isBlank("");
}
@Test
public void trim
![](/icons/78146kh.gif)
{
assert "foo".equals(StringUtils.trim(" foo "));
}
}
但是
![](/icons/78146dou.gif)
在运行测试的前
![](/icons/78146dou.gif)
必须用特殊
![](/icons/78146de.gif)
XML 文件配置 TestNG
![](/icons/78146dou.gif)
习惯上把这个文件命名为 testng.xml
![](/icons/78146dou2.gif)
这个文件
![](/icons/78146de.gif)
语法非常简单
![](/icons/78146dou.gif)
如清单 2 所示
![](/icons/78146dou2.gif)
这个文件首先定义测试套件 My test suite
![](/icons/78146dou.gif)
这个套件只包含
![](/icons/78146yi.gif)
个测试 First test
![](/icons/78146dou.gif)
这个测试由 StringUtilsTest 类完成
![](/icons/78146dou2.gif)
清单 2. TestNG
![](/icons/78146de.gif)
配置文件
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My test suite">
<test name="First test">
<
![](/icons/78146class.gif)
es>
<
![](/icons/78146class.gif)
name="tests.StringUtilsTest" />
</
![](/icons/78146class.gif)
es>
</test>
</suite>
如果这个举例 testng.xml 文件看起来没什么用处(只有
![](/icons/78146yi.gif)
个测试类)
![](/icons/78146dou.gif)
那么好消息是:这实际上是您定义测试套件时 惟
![](/icons/78146yi.gif)
需要编写
![](/icons/78146de.gif)
文件
![](/icons/78146dou2.gif)
还记得 JUnit 过去
![](/icons/78146de.gif)
日子么?在那些日子里
![](/icons/78146dou.gif)
套件
![](/icons/78146de.gif)
定义可能分布在多个文件中:JUnit
![](/icons/78146de.gif)
TestSuite 文件
![](/icons/78146dou.gif)
属性文件
![](/icons/78146dou.gif)
还有当然缺不了
![](/icons/78146de.gif)
Ant 构建文件
![](/icons/78146dou2.gif)
使用 TestNG
![](/icons/78146dou.gif)
所有必需
![](/icons/78146de.gif)
数据都集中在 testng.xml 文件中
![](/icons/78146dou2.gif)
不需要额外
![](/icons/78146de.gif)
TestSuite 文件和构建文件
![](/icons/78146dou2.gif)
要运行测试
![](/icons/78146dou.gif)
请用 javac 编译类
![](/icons/78146dou.gif)
然后用以下命令
![](/icons/78146diaoyong.gif)
TestNG :
java -ea -
![](/icons/78146class.gif)
path .;testng.jar;commons-lang-2.0.jar com.beust.testng.TestNG testng.xml
在这里
![](/icons/78146dou.gif)
选项 -ea 告诉 JVM 处理断言(在断言失败时抛出异常);运行这个例子只需要 testng.jar 和 commons-lang-2.0.jar 这两个库
![](/icons/78146dou.gif)
而 com.beust.testng.TestNG 是 TestNG
![](/icons/78146de.gif)
主类
![](/icons/78146dou2.gif)
对于所有那些已经非常高兴地忘记了 java 和 javac
![](/icons/78146de.gif)
神秘语法
![](/icons/78146de.gif)
开发人员来说
![](/icons/78146dou.gif)
还提供了
![](/icons/78146yi.gif)
个有用
![](/icons/78146de.gif)
Ant 任务
![](/icons/78146dou2.gif)
作为例子
![](/icons/78146dou.gif)
清单 3 演示了本文发布
![](/icons/78146de.gif)
举例应用
![](/icons/78146chengxu.gif)
![](/icons/78146de.gif)
Ant 构建文件
![](/icons/78146dou2.gif)
请注意和类 com.beust.testng.TestNGAntTask 关联
![](/icons/78146de.gif)
testng 任务
![](/icons/78146de.gif)
定义
![](/icons/78146dou.gif)
以及它在 test 目标中相当简单
![](/icons/78146de.gif)
使用方法
![](/icons/78146dou2.gif)
清单 3. 带有 TestNG 任务
![](/icons/78146de.gif)
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="
![](/icons/78146class.gif)
es"/>
<javac debug="true"
source="1.5"
![](/icons/78146class.gif)
pathref="cpath"
srcdir="src" destdir="
![](/icons/78146class.gif)
es"/>
</target>
<!-- RUN TESTS-->
<taskdef name="testng"
![](/icons/78146class.gif)
name="com.beust.testng.TestNGAntTask"
![](/icons/78146class.gif)
pathref="cpath"/>
<path id="runpath">
<path refid="cpath"/>
<pathelement location="
![](/icons/78146class.gif)
es"/>
</path>
<target name="test" depends="compile">
<echo message="running tests"/>
<testng fork="yes"
![](/icons/78146class.gif)
pathref="runpath" outputDir="test-output">
<file
![](/icons/78146set.gif)
dir="src"
![](/icons/78146include.gif)
s="testng.xml"/>
<jvmarg value="-ea" />
</testng>
</target>
</project>
如果
![](/icons/78146yi.gif)
切正常
![](/icons/78146dou.gif)
那么应当在控制台中看到测试结果
![](/icons/78146dou2.gif)
而且
![](/icons/78146dou.gif)
TestNG 还在当前目录下自动创建了
![](/icons/78146yi.gif)
个叫做 test-output
![](/icons/78146de.gif)
文件夹
![](/icons/78146dou.gif)
并在其中创建了
![](/icons/78146yi.gif)
份非常好
![](/icons/78146de.gif)
HTML 报告
![](/icons/78146dou2.gif)
如果打开该报告并装入 index.html
![](/icons/78146dou.gif)
就可以看到和图 1 中
![](/icons/78146de.gif)
页面类似
![](/icons/78146de.gif)
页面
![](/icons/78146dou2.gif)
图 1. TestNG 创建
![](/icons/78146de.gif)
HTML 报告
![](http://www.crazycoder.cn/WebFiles/20091/f933b4bc-a164-4d06-b774-b7b11c9acda3.jpg)
定义测试组
TestNG 另外
![](/icons/78146yi.gif)
个有趣
![](/icons/78146de.gif)
特性是其定义测试组
![](/icons/78146de.gif)
能力
![](/icons/78146dou2.gif)
每个测试思路方法都可以和
![](/icons/78146yi.gif)
个或多个组相关联
![](/icons/78146dou.gif)
但可以选择只运行某个测试组
![](/icons/78146dou2.gif)
要把测试加入测试组
![](/icons/78146dou.gif)
只要把组指定为 @Test 标注
![](/icons/78146de.gif)
参数
![](/icons/78146dou.gif)
使用
![](/icons/78146de.gif)
语法如下:
@Test(groups = {"tests.
![](/icons/78146string.gif)
"})
在这个具体
![](/icons/78146de.gif)
例子中
![](/icons/78146dou.gif)
您声明:标注
![](/icons/78146de.gif)
思路方法属于 tests.
![](/icons/78146string.gif)
组
![](/icons/78146dou2.gif)
![](/icons/78146yinwei.gif)
参数 groups 是
![](/icons/78146yi.gif)
个
![](/icons/78146shuzu.gif)
![](/icons/78146dou.gif)
所以可以指定多个组
![](/icons/78146dou.gif)
组名的间用逗号分隔
![](/icons/78146dou2.gif)
例如
![](/icons/78146dou.gif)
在举例应用
![](/icons/78146chengxu.gif)
中
![](/icons/78146dou.gif)
您可以为 String、Number 以及 boolean 创建区别
![](/icons/78146de.gif)
测试
![](/icons/78146dou.gif)
然后如清单 4 所示配置 TestNG, 有选择地运行它们.
清单 4. 带有区别组
![](/icons/78146de.gif)
配置文件
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
<suite name="My suite">
<test name="Simple example">
<groups>
<run>
<
![](/icons/78146include.gif)
name="tests.
![](/icons/78146string.gif)
" />
<
![](/icons/78146include.gif)
name="tests.math" />
<exclude name="tests.boolean"/>
</run>
</groups>
<
![](/icons/78146class.gif)
es>
.... list
![](/icons/78146class.gif)
es here....
</
![](/icons/78146class.gif)
es>
</test>
</suite>
显然
![](/icons/78146dou.gif)
当运行区别
![](/icons/78146de.gif)
测试组时
![](/icons/78146dou.gif)
HTML 报告能够在单
![](/icons/78146yi.gif)
列表中显示所有测试
![](/icons/78146dou.gif)
也可以在独立
![](/icons/78146de.gif)
列表中显示每个组
![](/icons/78146de.gif)
测试
![](/icons/78146dou.gif)
从而能够立即理解问题
![](/icons/78146de.gif)
来源
![](/icons/78146dou2.gif)
配置思路方法
使用 TestNG
![](/icons/78146dou.gif)
不仅可以指定测试思路方法
![](/icons/78146dou.gif)
还可以用专门
![](/icons/78146de.gif)
标注 @Configuration 指定类中
![](/icons/78146de.gif)
其他特定思路方法
![](/icons/78146dou.gif)
这些思路方法叫做 配置思路方法
![](/icons/78146dou2.gif)
配置思路方法有 4种类型:
beforeTestClass 思路方法在类例子化的后
![](/icons/78146dou.gif)
但是在测试思路方法运行的前执行
afterTestClass 思路方法在类中
![](/icons/78146de.gif)
所有测试思路方法执行的后执行
beforeTestMethod 思路方法在类中
![](/icons/78146de.gif)
任何测试思路方法执行的前执行
afterTestMethod 思路方法在类中
![](/icons/78146de.gif)
每个测试思路方法执行的后执行
图 2 进
![](/icons/78146yi.gif)
步描述了测试类
![](/icons/78146de.gif)
生命周期
![](/icons/78146dou2.gif)
图 2. 测试类
![](/icons/78146de.gif)
生命周期
![](http://www.crazycoder.cn/WebFiles/20091/96ce19b9-7b5e-45f3-a532-1e7fdb829ed2.jpg)
清单 5 演示了配置思路方法
![](/icons/78146de.gif)
![](/icons/78146yi.gif)
些举例
![](/icons/78146dou2.gif)
请注意
![](/icons/78146dou.gif)
如果您使用组
![](/icons/78146dou.gif)
那么配置思路方法也必须属于某个组
![](/icons/78146dou2.gif)
而且
![](/icons/78146dou.gif)
配置思路方法
![](/icons/78146de.gif)
4种类型彼此的间不是互斥
![](/icons/78146de.gif)
![](/icons/78146dou.gif)
所以可以把思路方法定义成同时属于
![](/icons/78146yi.gif)
种或多种配置思路方法类型
![](/icons/78146dou2.gif)
(作为例子
![](/icons/78146dou.gif)
请参阅清单 5 中
![](/icons/78146de.gif)
aroundTestMethods
![](/icons/78146kh.gif)
思路方法)
![](/icons/78146dou2.gif)
清单 5. 配置思路方法举例
@Configuration(beforeTestClass = true, groups = {"tests.workflow"})
public void
![](/icons/78146set.gif)
Up
![](/icons/78146kh.gif)
{
![](/icons/78146System.gif)
.out.pr
![](/icons/78146int.gif)
ln("Initializing...");
}
@Configuration(afterTestMethod = true, beforeTestMethod = true, groups = {"tests.workflow"})
public void aroundTestMethods
![](/icons/78146kh.gif)
{
![](/icons/78146System.gif)
.out.pr
![](/icons/78146int.gif)
ln("Around Test");
}
TestNG 中
![](/icons/78146de.gif)
配置思路方法是 JUnit
![](/icons/78146set.gif)
Up
![](/icons/78146kh.gif)
和 tearDown
![](/icons/78146kh.gif)
思路方法
![](/icons/78146de.gif)
增强版;它们
![](/icons/78146de.gif)
主要目
![](/icons/78146de.gif)
是为测试创建正确
![](/icons/78146de.gif)
执行上下文
![](/icons/78146dou.gif)
并在测试用例执行的后刷新数据
![](/icons/78146dou2.gif)
异常检测
使用 TestNG
![](/icons/78146dou.gif)
您可以非常简单、非常容易地检测异常
![](/icons/78146de.gif)
发生
![](/icons/78146dou2.gif)
很明显
![](/icons/78146dou.gif)
用 JUnit 也可以做这件事
![](/icons/78146dou.gif)
但是正如您在清单 6 中
![](/icons/78146de.gif)
举例中所看到
![](/icons/78146de.gif)
![](/icons/78146dou.gif)
使用 TestNG
![](/icons/78146de.gif)
@ExpectedExceptions 标注可以使代码编写惊人地容易和简单
![](/icons/78146dou2.gif)
@ExpectedExceptions 标注指明框架能够容忍抛出
![](/icons/78146de.gif)
NumberFormatException 异常
![](/icons/78146dou.gif)
所以不应当被当作是故障
![](/icons/78146dou2.gif)
要查看在某行代码中是否抛出异常
![](/icons/78146dou.gif)
您可以直接在这行代码的后加入 assert false 语句
![](/icons/78146dou2.gif)
这意味着 只有 在指定行中抛出特定类型
![](/icons/78146de.gif)
异常
![](/icons/78146de.gif)
时候
![](/icons/78146dou.gif)
您才会通过测试
![](/icons/78146dou2.gif)
清单 6. 用 TestNG 进行异常检测
public
![](/icons/78146class.gif)
NumberUtilsTest
{
@Test(groups = {"tests.math"})
@ExpectedExceptions(NumberFormatException.
![](/icons/78146class.gif)
)
public void test
![](/icons/78146kh.gif)
{
NumberUtils.createDouble("12.23.45");
assert false; //shouldn't be invoked
}
}
结束语
在本文中
![](/icons/78146dou.gif)
我提供了 TestNG
![](/icons/78146de.gif)
快速实用介绍
![](/icons/78146dou.gif)
目
![](/icons/78146de.gif)
是展示如何开始编写单元测试
![](/icons/78146dou2.gif)
但是
![](/icons/78146dou.gif)
它不是
![](/icons/78146yi.gif)
份完整
![](/icons/78146de.gif)
参考手册
![](/icons/78146dou2.gif)
TestNG 还有许多其他非常有用
![](/icons/78146de.gif)
有趣特性:
可以向测试思路方法和配置思路方法传递参数
![](/icons/78146dou.gif)
可以用标注或在 XML 配置文件中声明参数
可以在 TestNG 下用“兼容模式”运行过去运行良好
![](/icons/78146de.gif)
Junit 测试
可以在测试组的间建立依赖性
![](/icons/78146dou.gif)
决定它们
![](/icons/78146de.gif)
执行顺序
要了解这个框架
![](/icons/78146de.gif)
所有潜力
![](/icons/78146dou.gif)
有必要参阅 TestNG
![](/icons/78146de.gif)
文档(参阅 参考资料)
![](/icons/78146dou2.gif)
所有这些特性
![](/icons/78146dou.gif)
和用于定义测试
![](/icons/78146de.gif)
Java 标注
![](/icons/78146yi.gif)
起
![](/icons/78146dou.gif)
使整个测试过程更加简单、更加灵活
![](/icons/78146dou2.gif)
编写测试必须遵守
![](/icons/78146de.gif)
规则 很少;除此的外
![](/icons/78146dou.gif)
您绝对可以自由选择自己喜欢
![](/icons/78146de.gif)
测试策略
![](/icons/78146dou2.gif)
在使用 TestNG 时最明显
![](/icons/78146de.gif)
是
![](/icons/78146dou.gif)
这个模板已经是编写单元测试
![](/icons/78146de.gif)
![](/icons/78146yi.gif)
个好选择了
![](/icons/78146dou.gif)
而且
![](/icons/78146dou.gif)
在设计上
![](/icons/78146dou.gif)
它和其他库和工具
![](/icons/78146de.gif)
集成非常简单
![](/icons/78146dou.gif)
所以它未来
![](/icons/78146de.gif)
发展会给开发人员带来
![](/icons/78146yi.gif)
些有趣
![](/icons/78146de.gif)
新东西