testNg注解
- @BeforeSuite(@AfterSuite)
- 作用及作用域范围
@BeforeSuite在test suite中的所有test运行之前运行,只运行一次;
@AfterSuite在test suite中的所有test运行之后运行,只运行一次;
Test suite可以由一个或多个测试组成.
- @BeforeTest(@AfterTest)
- 作用及作用域范围
@BeforeTest注解的方法将只运行一次后已经运行在当前类中的所有测试方法;
@AfterTest注解的方法将被运行后,所有的测试方法,属于内部类的<test>标签的运行;
Test可以由一个或多个测试类组成.
- @BeforeClass(@AfterClass)
- 作用及作用域范围
@BeforeClass 注解的方法将只运行一次先行先试在当前类中的方法调用;
@AfterClass注解的方法将只运行一次后已经运行在当前类中的所有测试方法;
Class由一个或多个方法组成
- @BeforeGroups(@AfterGroups)
- 作用及作用域范围
@BeforeGroups组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组第一个测试方法,该方法被调用。
@AfterGroups注解的方法将被运行后,所有的测试方法,属于内部类的<test>标签的运行;
组是由测试组自定义的一个测试的集合
- @BeforeMethod(@AfterMethod)
- 作用及作用域范围
@BeforeMethod 注解的方法将每个测试方法之前运行。
@AfterMethod注解的方法将每个测试方法之前运行。
在class中的方法每执行一次,就会分别调用一次@BeforeMethod和@AfterMethod
测试级别为:suite -> test -> class -> method。test指的是中的test 标签,而不是测试类里的一个 @Test。测试类里的@Test实际上对应的是method。所以在使用 @BeforeSuite、 @BeforeTest、 @BeforeClass、 @BeforeMethod这些标签的时候,它们的实际执行顺序也是按照上述级别来的。
超类上的注解,子类也将得到继承。在这种情况下,TestNG保证“@Before”方法按照继承顺序执行(首先是最高的超类,然后向下继承链),以及“@After”方法按照相反的顺序执行(向上继承链)。
- testNg测试示例解读
<!DOCTYPE suite SYSTEM "/testng-1." > <!-- @BeforeSuite --> <suite name="TestAll"> <packages> <package name=""></package> </packages> <!-- @BeforeTest --> <test name="case1"> <groups> <run> <exclude name="shopping"></exclude> </run> </groups> <classes> <class name="" /> <class name="" /> </classes> </test> <!-- @AfterTest --> <!-- @BeforeTest --> <test name="case2"> <classes> <class name="" /> </classes> </test> <!-- @AfterTest --> <test name="case3"> <groups> <run> <include name="shopping"></include> </run> </groups> <classes> <class name="" /> </classes> </test> </suite> <!-- @AfterSuite -->
TestAll测试组,由3个test(case1,case2,case3)组成;
其中case1中定义了一个groups和一个classes组成;groups中定义了一个run标签,标签下面包含一个exclude标签;classes中定义了两个class文件(TestConfiguration和TestDBConnection);
public class TestConfiguration { @BeforeSuite() public void beforeSuite() { System.out.println("@BeforeSuite"); } @AfterSuite() public void afterSuite() { System.out.println("@AfterSuite"); } @BeforeTest() public void beforeTest() { System.out.println("@BeforeTest"); } @AfterTest() public void afterTest() { System.out.println("@AfterTest"); } @BeforeGroups(groups = "shopping") public void beforeGroups() { System.out.println("@BeforeGroups"); } @AfterGroups(groups = "shopping") public void afterGroups() { System.out.println("@AfterGroups"); } @BeforeClass public void beforeClass() { System.out.println("@BeforeClass"); } @AfterClass public void afterClass() { System.out.println("@AfterClass"); } @BeforeMethod public void beforeMethod() { System.out.println("@BeforeMethod"); } @AfterMethod public void afterMethod() { System.out.println("@AfterMethod"); } @Test(groups = "shopping") public void runTest1() { System.out.println("@Test - runTest1"); } @Test public void runTest2() { System.out.println("@Test - runTest2"); } }
TestConfiguration中分别定义了我们上面的所有的注解文件:
(@BeforeSuite(),@AfterSuite(),@BeforeTest(),@AfterTest(),@BeforeGroups(groups="shopping"),@AfterGroups(groups = "shopping"),@BeforeClass, @AfterClass,@BeforeMethod, @AfterMethod)
还有两个测试方法(runTest1()和runTest2());其中runTest1()上面有groups=”shopping”的分组标识.
public class TestDBConnection { @Test public void runOtherTest1() { System.out.println("@Test - runOtherTest1"); } @Test public void runOtherTest2() { System.out.println("@Test - runOtherTest2"); } }
TestDBConnection中只有两个测试方法runOtherTest1()和runOtherTest2();
在case2中只有TestDBConnection一个class;
在case3中,首先有一个groups,在run标签下包含了一个include,引用了TestConfiguration文件.
运行文件后得到的输出结果:
@BeforeSuite
@BeforeTest
@BeforeClass
@BeforeMethod
@Test - runTest2
@AfterMethod
@AfterClass
@Test - runOtherTest1
@Test - runOtherTest2
@AfterTest
@Test - runOtherTest1
@Test - runOtherTest2
@BeforeGroups
@Test - runTest1
@AfterGroups
@AfterSuite
在执行中,@BeforeSuite和@AfterSuite分别在开始执行和最后结束执行后执行了一次;上面的输出文件中,红色字体为case1中的执行结果;蓝色内容为case2的执行结果,紫色内容为case的执行结果.
Case1中的TestConfiguration中的@BeforeSuite(),@AfterSuite()作用域在整个测试组的最外层;@BeforeTest()和@AfterTest()作用域在case1的开始和结束时运行;@BeforeClass和@AfterClass作用域在TestConfiguration文件的执行开始和结束时运行;在TestConfiguration中有两个测试方法,但是执行中只有runTest2执行了,那是因为在case1中进行的groups组的排除;
Case2中只有两个输出方法,没有任何的其他注解配置;
Case3中,执行了@BeforeGroups,@AfterGroups和runTest1,TestConfiguration中的runTest2没有执行是由于groups中指定了”shopping”分组的进行执行.