实验简介
TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,功能都差不多,TestNG也是以JUnit和NUnit的一些特性作为参考开发而成的,只是功能稍微强大一些,使用也更方便。
测试人员一般用TestNG来写自动化测试。开发人员一般用JUnit写单元测试。
但是这并不是必然的,无论选用哪种框架,并不决定我们的代码级测试开发工作是否做得很好。
实验目的
1.掌握TestNG的使用以及与JUnit的区别。
2.为后续学习其它基于上述两种框架的测试技术打下基础。
实验流程
1. 安装配置TestNG。
(1) 通过Eclipse的菜单Help -> Install New Software:
输入网址:http://beust.com/eclipse安装即可,视网络情况可能会花较长时间。

(2) 直接下载文件并进行离线安装:
直接去网址http://dl.bintray.com/testng-team/testng-eclipse-release/zipped/下载离线安装包。将下载的文件解压,将目录features和plugins下面的文件复制到Eclipse目录下相对应的文件夹下,重启Eclipse即可。
2. 验证TestNG安装。
在File -> New -> Other中,我们能够看到可以创建TestNG class的文件,则说明安装成功。

3. 导入TestNG库文件到当前项目。
进入菜单Project -> Properties -> Java Build Path -> Libraries,选择 Add Library,浏览到TestNG类库,点击确认即可将TestNG需要用到的jar包导入到当前项目中,这一操作跟JUnit类似。

4. 完成对isNumber和splitString的简单测试。
先实现测试代码和断言,同样使用@Test为每个测试用例进行注解:
package com.woniuxy.testng; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.testng.Assert; import com.woniuxy.compare.StringHandle; public class StringHandleTest { @BeforeTest public void init() { System.out.println("测试用例正在执行..."); } @Test public void isNumber() { StringHandle stringHandle = new StringHandle(); String source = "123.45"; boolean actual = stringHandle.isNumber(source); Assert.assertTrue(actual); } @Test public void splitString() { StringHandle stringHandle = new StringHandle(); String source = "333,111,222,666"; Integer[] expect = {333, 111, 222, 666}; Integer[] actual = stringHandle.splitString(source, ","); Assert.assertEquals(expect, actual); } @AfterTest public void end() { System.out.println("测试用例执行完成..."); } } |
5. 使用Eclipse方式运行。
在包com.woniuxy.testng下,右键选择上述测试类:“StringHandleTest”,选择“Run As” -> TestNG Test”的方式运行。运行结果如下:

同样,我们在另外一个视图:Results of running class …中,也可以看到详细信息,还可以用浏览器打开HTML格式的报表:

6. 使用XML方式运行。
除了使用Run As的方式执行测试以外,TestNG提供了另外一种更加灵活的执行手段:通过XML文件执行。我们可以在当然包下面创建一个XML文件,命名为:ArrayCompareTestSuite.xml,格式如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite-1"> <test name="Test-1"> <classes> <class name="com.woniuxy.testng.ArrayHandleTest" /> <class name="com.woniuxy.testng.StringHandleTest" /> </classes> </test> </suite> |
在此XML文件上,点击右键,Run As -> TestNG Suite,即可开始运行。注意一下,上述XML中,我们其实运行了两个测试类,一个叫ArrayHandleTest,一个叫StringHandleTest,我们可以通过设定两个测试类的顺序来决定先运行哪个测试。这也是TestNG非常方便的地方。
7. 为ArrayHandle类快速添加测试类。
除了直接创建一个普通的Java类文件来创建TestNG的测试用例以外,我们还可以有一种相对快速的创建测试类的办法。
(1) 选中要进行测试的被测类,比如此处我们选择com.woniuxy.compare包下的ArrayHandle.java,右键,选择New -> Other -> TestNG –> TestNG Class,下一步,选择要添加测试用例的方法:

(2) 输入相应的包信息,注意路径和测试代码的目标包,写错了会重复创建包,没有必要:

(3) 自动生成部分测试代码:
package com.woniuxy.testng; import org.testng.annotations.Test; public class ArrayHandleTest { @Test public void arrayCompare() { throw new RuntimeException("Test not implemented"); } @Test public void arraySort() { throw new RuntimeException("Test not implemented"); } } |
当然,这样的代码只是一个框架而已,没有实际用途。
(4) 完善测试驱动程序:
package com.woniuxy.testng; import org.testng.Assert; import org.testng.annotations.Test; import com.woniuxy.compare.ArrayHandle; public class ArrayHandleTest { ArrayHandle ah = new ArrayHandle(); @Test public void arrayCompare() { Integer[] source = {22, 33, 55, 77, 11, 99, 66}; Integer[] expect = {11, 22, 33, 55, 66, 77, 99}; Assert.assertFalse(ah.arrayCompare(source, expect)); } @Test public void arraySort() { Integer[] source = {22, 33, 55, 77, 11, 99, 66}; Integer[] expect = {11, 22, 33, 55, 66, 77, 99}; Integer[] actual = ah.arraySort(source); Assert.assertEquals(expect, actual); } } |
8. TestNG按顺序执行Case。
针对一个测试类中,有多个测试用例的情况,我们也可以为每一个测试方法单独指定运行顺序。就像执行多个测试类一样,我们通过配置XML文件的顺序来进行:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite-2"> <test name="Test-2" preserve-order="true"> <classes> <class name="com.woniuxy.testng.ArrayHandleTest"> <methods> <include name="arraySort" /> <include name="arrayCompare" /> </methods> </class> </classes> </test> </suite> |
9. TestNG组测试。
在TestNG中,我们还可以把测试用例进行分组,比如本次测试我们只测试ArrayHandle的arraySort和StringHandle的isNumber两个方法,那么这个时候,我们通过把这两条测试用例指定为同一组,即可实现交叉执行。
(1) 先在ArrayHandleTest类中的arraySort的@Test注解后面加上 @Test(groups = {"group1"}):
@Test(groups = {"group1"}) public void arraySort() { Integer[] source = {22, 33, 55, 77, 11, 99, 66}; Integer[] expect = {11, 22, 33, 55, 66, 77, 99}; Integer[] actual = ah.arraySort(source); Assert.assertEquals(expect, actual); } |
(2) 再在StringHandleTest类中的isNumber的注解上加上:@Test(groups = {"group1","group2"}),其实大家可以看到,groups后面跟的就是一个字符串数组,基于此来判断哪些用例应该被执行。一个测试用例是可以属于多个组的。
(3) 编写XML执行文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite-1">
<test name="Test-1">
<groups>
<run>
<include name="group1" />
</run>
</groups>
<classes>
<class name="com.woniuxy.testng.ArrayHandleTest" />
<class name="com.woniuxy.testng.StringHandleTest" />