绪论
TestNG 是一款测试框架,被设计用于解决大部分的测试需求,涵盖单元测试(测
试一个单独的类)和集成测试(测试有几个类、几个包甚至有几个框架组成的系统)
写一个测试一般需要如下3步:
- 写出你需测试的业务逻辑并在你的代码上加上TestNG注解
- 在 testng.xml 或build.xml中加上测试信息(例如:你需要运行的类名、组名)
- 运行测试
本文档涵盖的主题包括:
- 一个suite使用一个xml文件来定义 。该suite可以包含一个或多个test且该suite使用<suite>标签来定义。
- 一个test使用<test>标签来定义,该test可以包含一个或多个TestNG类
- 一个TestNG类就是一个Java类,它至少包含一个TestNG注解。一个TestNg类使用<class>标签来定义,可以包含一个或多个方法。
- 一个测试方法就是一个在你的代码中使用@test注解标注的java方法
一个TestNG测试可以使用使用@BeforeXXX或@AfterXXX注解被配置为,用于在某一切入点之前或之后执行一些代码逻辑,这些切入点可以是上述所列项中的任何一项。
手册的其它部分将阐述如下内容:
- 对所有注解的一个简单阐述。这将让你对TestNG提供的功能有一个整体认识。如果你想获得更详细的信息, 你还需要参照关于每个注解的描述。
- 对testing.xml语法及如何配置的描述
- 关于各种特征的详细描述以及如何把注解和testing.xml结合在一起使用。
注解
这里是对TestNG中的注解的简单描述。
- @BeforSuite 被标注的方法将在本Suite中所有测试运行之前运行
- @AfterSuite 被标注的方法将在本Suite中所有测试运行之后运行
- @BeforeTest 被标注的方法将在本测试运行之前运行
- @AfterTest 被标注的方法将在本测试运行之后运行
- @BeforeGroups 被标注的方法将在本groups中所有测试运行之前运行
- @AfterGroups 被标注的方法将在本groups中所有测试运行之后运行
- @BeforeClass 被标注的方法将在本class中的所有方法执行之前运行
- @AfterClass 被标注的方法将在本class中的所有方法执行之后运行
- @BeforeMethod 被标注的方法将在每一个测试方法前执行
- @AfterMethod 被标注的方法将在每一个测试方法后执行
alwaysRun 用于before类方法中时(beforeSuite, beforeTest, beforeTestClass 和
beforeTestMethod 但不包括beforeGroups):如果被设为true,被标注的
方法不管属于哪个groups都将被执行
用于after类方法中时(afterSuite, afterClass, ..):如果被设置为true,
被标注的将总能执行不论之前是否有方法出错或被跳过。
dependsOnGroups 本method依赖的groups 列表
dependsOnMethods 本method依赖的method列表
enabled : 指定class/method 是否可用
groups : class/method从属的groups列表
inheritGroups :如果设定为true,本方法将从属于在class级别上被使用@test注解指定的组
- @DataProvider 标记一个method 为另一个测试method 准备数据。被标记的method 须返回一个Object[][] ,其中的Object[]用于为测试方法的参数赋值。被标记为@test的method只有当@test注解的name的值与DataProvider的名字相等时,才能从Data Provider获取值。
name : Data Provider的名字
- @Factory 标记一个method作为一个factory,用于为TestNG的测试类返回object。此方法必须返回Object[].
- @Parameters 描述如何把参数传递到一个@Test标注的method上
value 用于为method的参数赋值的变量列表
- @Test 将一个class或method标记为需要测试的一部分
alwayRun 如果被标记为true,此测试method 将始终运行即使其依赖的method 失败了
DataProvider 此测试方法的data Provider的名字
DataProviderClass 提供data Provider的类。 如果没有被指定,将从本测试方法所在的类或基类中寻找data Provider。如果被指定,data Provider需要被设定为static的。
dependsOnGroups 此method 所依赖的groups列表
dependsOnMethods 此method 所依赖的method列表
description 对于此测试method 的描述
enabled 指定class/method 是否可用
expectedException 此测试方法期待抛出的异常的列表。如果无异常抛出或抛出的异常的种类不符,那么此测试方法将被标记为failure。
groups 此class/method 从属的groups
invocationCount 此method被调用的次数
invocationTimeOut 此测试中所有调用执行的时间的总和。 如果没有指定invocationCount此属性将被忽略。
successPercentage 此method期待成功的百分比
sequential 如果设置为true,此测试类的所有方法被保证按序执行,即使这些正在运行的测试是被标记为parallel="true"的. 此属性只在class级别上起作用,如果使用在method上将被忽略。
timeOut 此测试耗费的最大毫秒数
threadPoolSize 此method所需的线程池的大小。此method按照在invocationCount指定的那样可以以多线程的方式被调用。
Note:如果没有指定invocationCount 此属性将被忽略。
testng.xml
你可以使用多种不同的方式运行TestNg:
- 使用testing.xml文件
- 使用ant
- 从命令行
本节将描述testing.xml的格式(后面部分将涉及ant及命令行)
关于testing.xml的DTD文档,你可以在站点 [url]http://testng.org/testng-1.0.dtd [/url]查询到。
这里是testing.xml文件的一个例子:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<test name="Nopackage" >
<classes>
<class name="NoPackageTest" />
</classes>
</test>
<test name="Regression1" >
<classes>
<class name="test.sample.ParameterSample" />
<class name="test.sample.ParameterTest" />
</classes>
</test>
</suite>
你可以将包名替换掉类名:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite1" verbose="1" >
<test name="Regression1" >
<packages>
<package name="test.sample" />
</packages>
</test>
</suite>
在这个例子中,TestNG将检索包test.sample中的所有类,并且只返回含有
TestNG注解的类。
你也可以指定包含的或不包含的groups和methods
<test name="Regression1">
<groups>
<run>
<exclude name="brokenTests" />
<include name="checkinTests" />
</run>
</groups>
<classes>
<class name="test.IndividualMethodsTest">
<methods>
<include name="testMethod" />
</methods>
</class>
</classes>
</test>
你可以在testng.xml内定义新的组并且可以在属性中增加其它的信息,例如是否平行的
运行测试,使用了多少线程,是否运行Junit测试等等。可以参照DTD得到完整的
属性列表。
运行TestNG
TestNG可以按如下几种方式运行