2TestNG注释
1.前置条件和后置条件
把注释作为前置条件(或初始化操作)和后置条件(或清理操作)使用:
范围大小关系是suite > test > class > method
@BeforeSuite:在所有<test>模块运行之前运行,仅运行一次。
@AfterSuite: 在所有<test>模块运行之后运行,仅运行一次。
@BeforeTest:在<test>标签内的类<class>的之前运行,每个class运行之前运行一次。
@AfterTest:注释的方法将在属于<test>标签内的类的所有测试方法运行之后运行。
@BeforeClass:在调用当前类的任意一个测试方法之前运行一次。(有多个<class>标签时,则运行多次)
@AfterClass:在调用当前类的任意一个测试方法之后运行一次。(有多个<class>标签时,则运行多次)
@BeforeMethod:注释方法将在每个测试方法之前运行。
@AfterMethod:注释方法将在每个测试方法之后运行。
testNG的执行顺序是@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite
其中{}内的与多少个@Test,就循环执行多少次。
@BeforeGroups:配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行。
@AfterGroups:此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行。
2.数据驱动
@DataProvider:标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称。
当Object[][]二维数组中有汉字时,运行会提示java.net.SocketException: Software caused connection abort: socket write error,进入eclipse目录下,修改eclipse.ini文件加入一行 -Dfile.encoding=UTF-8 即可,下面的代码执行结果为:
第一个参数:1 第二个参数:a 第三个参数:一
第一个参数:2 第二个参数:b 第三个参数:two
第一个参数:3 第二个参数:c 第三个参数:three
PASSED: f(1, "a", "一")
PASSED: f(2, "b", "two")
PASSED: f(3, "c", "three")
package com.dahai.testng; import org.testng.annotations.Test; import org.testng.annotations.DataProvider; public class DataProviderTest { @Test(dataProvider = "dp") public void f(Integer n, String s,String c) { System.out.println("第一个参数:"+n+" 第二个参数:"+s+" 第三个参数:"+c); } @DataProvider(name="dp") public Object[][] dp() { return new Object[][] { new Object[]{1,"a","一"}, new Object[]{2,"b","two"}, new Object[]{3,"c","three"}, }; } }
@Parameters:描述如何将参数传递给@Test方法。和<parameter>标签配合使用
package com.dahai.testng; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class ParameterTest { @Parameters({"p1"}) @Test public void testCase(String p) { System.out.println(p); } }
和xml配合使用
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <!--<parameter>标签只能放到对应的<test>之前才可以被识别--> <parameter name="p1" value="this is p1"/> <test thread-count="5" name="Test"> <classes> <class name="com.dahai.testng.ParameterTest"/> </classes> </test> </suite>
3.测试用例
@Test:将类或方法标记为测试的一部分。
注释:
1.@Test(dataProvider="data"),数据驱动的注释,和@DataProvider(name="data"){public Object[][] dataProvider1(){}}配合使用,上面数据驱动里有介绍
2.@Test(groups={g1}),@BeforeGroups(groups={g1})将在所有的groups=g1的用例之前执行,@AfterGroups(groups={g1})将在所有的groups=g1的用例执行完之后再执行。
3.@Test(description="测试用例1"),description代表测试用例描述,在控制台中会打印出此描述,比如PASSED:testCase1 测试用例1
4.@Test(priority=2),@Test(priority=1),priority代表优先级,数字越小,优先级越高,默认值为0,priority=1的用例放在倒数第二位执行,@Test(priority=2)的用例放在倒数第一位执行,如果级别一样,则执行顺序默认按方法名排序
5.@Test(enabled=false),代表禁用,执行时跳过此用例
6.@Test(dependsOnMethods={testcase1},dependsOnGroups={g1},alwaysRun=true),dependsOnMethods代表依赖一个或多个方法,dependsOnGroups代表依赖一个或多个分组,当被依赖的测试用例执行失败,则TestNG将跳过该测试用例,这两个注释不建议使用。alwaysRun=true代表始终执行,哪怕被依赖的方法或组执行失败。
4.监听器
@Listeners:定义测试类上的侦听器。
<?xml version="1.0" encoding="UTF-8" ?> <!-- <suite>标签下class类中包含的@BeforeSuite和@AfterSuite方法,都会在该<suite>标签开始和结束的位置运行,但是如果相同class类出现多次,也只执行一遍 --> <suite name="suitname"> <!--代表本次只执行<run>标签中的内容,其他案例一律不执行--> <groups> <run> <include name="gp1"/> <exclude name="gp2"/> </run> </groups> <!-- <test>标签下class类中包含的@BeforeTest和@AfterTest方法,都会在该<test>标签开始和结束的位置运行,但是如果相同class类出现多次,也只执行一遍 --> <test name="testname"> <!-- <classes>标签为<class>的集合,可包含多个class类 --> <classes> <!-- 每个<class>标签都对应一个java类,该类下的@BeforeClass和@AfterClass方法会在所有@Test方法运行之前和之后运行,name为唯一标签,name多次重复也只执行一次 --> <class name="testclass1"/> <!-- <methods>标签为class类下方法的集合,可包含多个@Test方法 --> <methods> <!-- @Test为最小的测试单元,该类下的@BeforeMethod和@AfterMethod方法会在每一个@Test方法运行之前和之后运行,include和exclude分别表示包含和排除该方法,name为唯一标签,name多次重复也只执行一次 --> <include name="testcase."/><!-- testcase.中的.代表任意一个字符 --> <exclude name="testcase3"/> </methods> </class> <class name="testclass2"/> <methods> <include name="testcase4"/> <include name="testcase5"/> <include name="testcase6"/> </methods> </class> </classes> </test> </suite>