Board logo

标题: TestNG使Java单元测试轻而易举 [打印本页]

作者: qingqing3721    时间: 2011-12-9 03:06     标题: TestNG使Java单元测试轻而易举

JUnit 框架是 Java 言语单元测试以后的一站式解决方案。这个框架值得称赞,因为它把测试驱动的开发思想介绍给 Java 开发人员并教给他们如何有效地编写单元测试。但是,在过去的几年中,JUnit 的改良不大;所以,为当今复杂的环境编写测试曾经变成一个越来越困难的任务,即 JUnit 必须与其他一些补充性测试框架集成起来。在本文中,Filippo Diotalevi 介绍了 TestNG,这是一个测试 Java 使用顺序的新框架。TestNG 不只确实弱小、创新、可扩展、灵敏,它还展现了 Java Annotations(JDK 5.0 中的重大新特性)的有趣使用。
在每个现代软件包的结构阶段,测试这一理论都扮演着中心角色。过去那种先编写代码,然后有空的时候再测试(或者根本不测试)的日子曾经一去不返,因为大多数开发人员现在认识到需求采用编码和测试彼此交错、同步推进的软件方法论,以便尽早发现 bug,在开发进程开始的时候就识别出次要的风险。
JUnit 超过了其他测试框架,推进开发人员理解了测试尤其是单元测试的用途。利用一个相当复杂、适用、严厉的架构,JUnit 曾经能够“传染”大量开发人员。(有关“被测试传染”的更多信息,请参阅 参考资料。) JUnit 用户曾经学会了单元测试的一些根本规则:
每段代码都必须经过测试。  只要有可能,代码的测试必须隔离进行(例如,使用像 模拟对象 这样的技术)。  软件必须容易测试 —— 也就是说,在编写的时候要想着测试。  但是,随着开发人员对测试的信任增长,JUnit 的复杂性和严厉性把他们分红两个相反的派系。一方面,有些人坚信 JUnit 的复杂性对于不断地提醒顺序员软件也必须保持复杂来说是必不可少的(这称为 KISS 原则,代表 keep it simple, stupid);另一方面,有些人以为 JUnit 不是复杂而是简化,所以他们想要从测试框架得到新的初级特性、更大的灵敏性和更弱小的才能。JUnit 的一些特殊特性,就是为了满足这个群体的一些详细批判而推出的:
因为 Java 言语的单承继性,所以必须扩展 TestCase 类的限制很大。  无法向 JUnit 的测试方法传递参数,也无法向 setUp() 和 tearDown() 方法传递参数。  执行模型有点奇异:每次执行一个测试方法的时候,都要重新实例化测试类。  管理复杂项目中的不同测试套件有可能十分复杂。  TestNG 的创造者 TestNG 的创造者是 Cedric Beust,他在 Java 编程范畴十分知名,是 EJB 3 专家组的成员,也是其他一些流行的开源项目(例如 EJBGen 和 Doclipse)的创造者。TestNG 在 Apache 软件容许条款约束下发布,并可从其 Web 站点下载(请参阅 参考资料 中到该站点和 Cedric 站点的链接)。 在本文中,您将学习到如何用这个叫做 TestNG 的新测试框架为使用顺序编写单元测试。TestNG 的灵感来自 JUnit,同时尽量保持后者的复杂性;但是,TestNG 消除了老框架的大多数限制,使开发人员可以编写更加灵敏、更加弱小的测试。由于 TestNG 大量借用 Java Annotation(随 JDK 5.0 引入;有关这个新特性的更多信息,请参阅 参考资料)来定义测试,所以本文也可以向您演示如何在实践的消费环境中使用 Java 言语的这个新特性。
关于代码 为了演示 TestNG 的用法,我要为叫做 Jakarta Common Lang 的这个广泛使用的开源库(其中包含一些处理和操纵字符串、数字和 Java 对象的有用的类)编写一些单元测试。在下面的 参考资料 一节中,您可以找到 TestNG 和 Jakarta Common Lang 库的链接;如果您想在自己的机器上随着本文一起练习,这二者都需求下载。
可以在两个不同的包中得到 TestNG:一个包要求 JDK 5.0,另一个包与 Java 言语 1.4 版本兼容。定义测试的时候,它们使用的语法略有差异:前者使用 JDK 5.0 标注,后者使用旧的 Javadoc 风格的标注。本文使用的是 JDK 5.0 版本,所以在继续阅读本文之前,需求对标注有根本的了解;您可以在 参考资料 中找到关于这个主题的 developerWorks 资源的链接。但是,您要知道 只要在编译和运转测试的时候 才需求 JDK 5.boe京东方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.apachemons.lang.StringUtils;
public class StringUtilsTest{@Testpublic void isEmpty(){assert StringUtils.isBlank(null);assert StringUtils.isBlank("");}
@Testpublic void trim(){assert "foo".equals(StringUtils.trim(" foo "));}} 但是,在运转测试之前,必须用特殊的 XML 文件配置 TestNG,习气上把这个文件命名为 testng.xml。这个文件的语法十分复杂,如清单 2 所示。这个文件首先定义测试套件 My test suite,这个套件只包含一个测试 First test,这个测试由 StringUtilsTest 类完成。
清单 2. TestNG 的配置文件 !DOCTYPE suite SYSTEM "beust/testng/testng-1.0.dtd" suite name="My test suite"test name="First test"classesclass name="tests.StringUtilsTest" //classes/test/suite  如果这个示例 testng.xml 文件看起来没什么用途(只要一个测试类),那么好消息是:这实践上是您定义测试套件时 惟一需求编写的文件。还记得 JUnit 过去的日子么?在那些日子里,套件的定义可能分布在多个文件中:JUnit 的 TestSuite 文件,属性文件,还有当然缺不了的 Ant 构建文件。使用 TestNG,一切必需的数据都集中在 testng.xml 文件中。不需求额定的 TestSuite 文件和构建文件。
要运转测试,请用 javac 编译类,然后用以下命令调用 TestNG : java -ea -classpath .;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"//pathtarget name="compile"echo message="compiling tests"/mkdir dir="classes"/javac debug="true"source="1.5" classpathref="cpath"srcdir="src" destdir="classes"//target
!-- RUN TESTS--taskdef name="testng"classname="com.beust.testng.TestNGAntTask"classpathref="cpath"/path id="runpath"path refid="cpath"/pathelement location="classes"//pathtarget name="test" depends="compile"echo message="running tests"/testng fork="yes" classpathref="runpath" outputDir="test-output"fileset dir="src" includes="testng.xml"/jvmarg value="-ea" //testng/target
/project 如果一切正常,那么应当在控制台中看到测试结果。而且,TestNG 还在以后目录下自动创立了一个叫做 test-output 的文件夹,并在其中创立了一份十分好的 HTML 报告。如果打开该报告并装入 index.html,就可以看到与图 1 中的页面相似的页面。
图 1. TestNG 创立的 HTML 报告




欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/) Powered by Discuz! 6.0.0