您的位置:首页 > 其它

【转载】TestNG 简易指南

2012-08-14 17:05 288 查看
转载---原文地址:http://dev.sei.pku.edu.cn/trac/pkuas/wiki/testng



TestNG 简易指南

本文内容包括:

• 属性介绍• TestNG 的示例代码 • 运行 TestNG 的 Ant 脚本 • 重新运行前次运行失败的测试用例 • 分布式测试特性 • TestNG 的多线程支持 • 总结 • 参考资料 • 关于作者 随着项目的成长,单元测试的数量会迅猛增长。这就带来不少问题。首先数量巨大的单元测试难于管理,运行一遍耗时巨大。其次,有时某个微小改动可能只需要运行某个测试文件中的部分单元测试就可以,这时重新运行全部测试用例就没有必要了。其三,大多数项目需要用到多线程特性,为使用了多线程特性的代码写测试用例相当麻烦且容易出错。本文将利用
TestNG 提供的新特性,解决以上提到的问题。

1 TestNG的属性介绍:

属性名 描述 是否必须

annotations 字符串"JDK"或者"Javadoc". 定义测试适用的注释类型.如果使用"Javadoc", 则需要同时指定"sourcedir". 不是必须. 如果适用jkd5则默认为"JDK",如果适用jdk1.4则默认为"Javadoc"

classfilesetref 要运行的测试类的FileSet结构的引用.

classpath 要运行的测试的PATH-like 结构.

classpathref 要运行的测试的PATH-like 结构的引用.

dumpCommand 打印TestNG启动命令. 不是必须,默认false

enableAssert 开启JDK 1.4的断言. 不是必须,默认true

failureProperty 失败发生时要设置的属性的名称. 只有haltonfailure没有设置时才有效. 不是必须.

haltonfailure 如果测试运行期间发生失败,停止构造过程. 不是必须,默认false

haltonskipped 如果发生至少一次测试跳过,停止构造过程. 不是必须,false

groups 要运行的组列表,空格或逗号分隔

excludedgroups 排除在外的组列表,空格或逗号分隔

jvm 使用的jvm,将被Runtime.exec()运行 java

listeners 逗号或空格分隔的全路径类列表,需要实现org.testng.ITestListener或org.testng.IReporter 不是必须

outputdir 报告输出目录 不是必须,默认输出到test-output.

skippedProperty 当发生测试被跳过时设置的property的名称.只有当haltonskipped没有设置时才使用 不是必须

sourcedir 用于jdk1.4测试的PATH-like结构(使用JavaDoc形式的annotations)

sourcedirref 用于jdk1.4测试的PATH-like结构的引用(使用JavaDoc形式的annotations)

suiteRunnerClass TestNG启动器的全路径名称 不是必须. 默认使用org.testng.TestNG

parallel 运行测试时使用的并行模式 - methods或者tests 不是必须 - 如果没有指定,并行模式不被选择

threadCount 运行时使用的线程数量。如果并行模式被同时指定否则忽略。 默认1

testJar 包含测试和套件定义的jar包路径

timeOut 所有测试必须运行完成的最大超时时间,单位毫秒

useDefaultListeners 是否使用默认监听器和报告器. 默认true.

workingDir 运行TestNG前ant任务应该转移到的目录。

xmlfilesetref 用于要测试的套件定义的FileSet结构的引用

suitename 设置测试套件的默认名称如果在suite的xml文件或者源代码中都没有被定义。 不是必须,默认设置为"Ant suite"

testname 设置测试的默认名称如果在suite的xml文件或者源代码中都没有被定义。 不是必须,默认设置为"Ant test"

2 TestNG 的示例代码

TestNG 提供了从命令行运行测试用例的方法。下面将首先从命令行运行测试用例。假设有如下的测试用例组:

列表 1. TestNG 示例代码









运行 TestNG 的 Ant 脚本

为了运行这组测试用例,构建了如下的 Ant 运行脚本:

列表 2. 运行测试用例组的 Ant 脚本 build.xml 文件





运行之后的结果如下:

图 1. 命令行运行 TestNG 的结果





运行完成之后,会在运行目录下生成一个test-output 目录。如图 2 所示:

图 2. 生成的 test-output 目录





该目录中包含有 html 形式的运行结果的报告,通过命令 start test-output\index.html 可以查看生成的测试报告





该目录中有一个 testng-failed.xml 文件,该文件可以被用来运行前一次运行失败的所有测试用例。下文将会详细介绍使用该文件的步骤。

重新运行前次运行失败的测试用例

随着项目开发的进行,单元测试的数量也会成倍的增加。有时仅仅有数量很小的某几个测试用例会运行失败。在这种情况之下,对于每一次修改,可能并不需要跑完所有的测试用例。只需要重新运行前次运行失败的测试用例。TestNG 内建了重新运行上次失败测试用例的功能,下文将会给出重新运行前次错误测试用例的步骤。

运行一组测试用例,如果这一组测试用例中有失败的用例,TestNG 就会在输出目录中创建一个叫做 testng-failed.xml 的配置文件。这个文件记录了本组测试用例中运行失败的测试用例。使用该文件,用户可以快速的重新运行上次运行失败的测试用例。而无需运行整个测试用例组。如前文所述,运行完 Ant 脚本之后,会在脚本运行的目录之中生成一个 test-output 目录。该目录中,包含 testng-failed.xml 文件。可以用如下的命令运行被标记为运行失败的测试用例。

列表 3. 重新运行前次运行失败的测试用例





运行结果如下:

图 4. 重新运行前次运行失败的测试用例的输出结果





分布式测试特性

随着测试用例规模的扩大,分组数量的增加。使用一台主机来运行所有的测试用例需要消耗大量的时间。为了解决这个问题,TestNG 提供了分布式特性。本文将介绍使用 TestNG 分布特征——使用多台主机同时运行测试用例。TestNG 提供的分布式模型如下所示:

图 5. TestNG 提供的分布式模型





这是一个典型的 master/slave。在这个模型中,有一个负责调度的 master 节点,和一些负责执行任务的 slave 节点。下文将介绍如何配置这样一个分布式模型。

首先,在远程机器上部署 slave 节点。如上图所示,在远程节点上不仅要配置 TestNG 运行环境,还需要复制测试用例文件。

图 6. 将需要运行的测试用例部署到远程机器上





然后在这台远程机器上以 “slave” 模式启动一个 TestNG 实例,使用如下命令:java –classpath <testng_path>;<testcase_path> org.testng.TestNG -slave <port>

图 7. 以“slave”模式启动一个 TestNG 实例





这样,一个 TestNG 实例将会被启动,并且等待即将到来的连接请求。如果有需要,可以在多台机器上以 slave 模式启动 TestNG 实例。

完成了所有 slave 实例的启动之后,将所有启动 slave 实例的主机信息记录在一个配置文件中,如图 8 所示:

图 8. 分布式运行的配置文件





然后使用该配置文件启动 TestNG 的 master 实例。

列表 4. 启动 TestNG 的 master 实例





这样,所有的测试用例,将会被随机的分配到多个 slave 实例上运行。图9给出了在一个 slave 节点上运行测试用例的结果。

图 9. 分布式运行的 TestNG 测试用例结果





TestNG 的多线程支持

测试用例分组中,针对网络应用的测试用例往往需要在多线程环境下运行。TestNG 为多线程运行某个测试用例提供了方便的内建支持。这可以通过在测试用例的方法前制定 annotation @Test 的属性来完成。

列表 5. 设置多线程属性运行测试用例





这个属性表示,运行 multipleTest 方法总共 5 次,在 3 个线程中运行这五次调用。每个线程运行该方法的时间不超过 1000 毫秒。修改 build.xml 文件,运行 multiple 组。

列表 6. 修改 build.xml 文件,运行 multiple 组。





图 10. 多线程运行测试用例 multipleTest 的结果





总结:

本文希望通过场景和 TestNG 新特性的结合,可以为用户管理规模庞大的测试用例集有所帮助。场景中提到的分类方法,对实际项目中测试用例的管理具有帮助意义。其中,重跑失败的测试用例,分组运行,分布式运行,和多线程运行也是对于管理测试用例非常有帮助的特征。

参考资料

学习

• Eclipse 3.1 中使用TestNG:基于注释的单元测试框架 • “TestNG 使 Java 单元测试轻而易举”(Filippo Diotalevi,developerWorks,2005 年 1 月):TestNG 不仅仅是性能强大、富于创新、易于扩充、使用灵活,它也展示了 Java 注释的一种有趣应用方式。 • 追求代码质量: JUnit 4 与 TestNG 的对比(Andrew Glover,developerWorks,2006 年 9 月):探讨了这两种框架各自的独特之处,并阐述了
TestNG 独有的三种高级测试特性。 • 使用 TestNG 的统计测试(Cedric Beust,beust.com,2006 年 2 月):使用 TestNG 进行高级测试,本文由该项目的创始人编写。 • 追求代码质量:决心采用 FIT(Andrew Glover,developerWorks,2006 年 2 月):有利于加强商业客户和开发者沟通的集成测试框架。 • developerWorks:查阅数百篇关于 Java 编程各个方面的文章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: