有必要介绍一下TestNG注解的生命周期,先看一下官网支持的注解有
@BeforeSuite @AfterSuite @BeforeTest @AfterTest @BeforeGroups @AfterGroups @BeforeClass @AfterClass @BeforeMethod @AfterMethod |
Configuration information for a TestNG class:
@BeforeSuite: The annotated method will be run before all tests in this suite have run. |
英文看到不是很明白,那么我们从挨个实验。
package com.test; import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test; /**
* @author QiaoJiafei
* @version 创建时间:2016年3月24日 下午9:21:00
* 类说明
*/
public class TestNG2 {
@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");
} @BeforeClass
public void beforeclass() {
System.out.println("beforeclass's TestNG2");
} @AfterClass
public void aftertclass() {
System.out.println("afterclass's TestNG2");
} @BeforeMethod
public void beforemethod() {
System.out.println("TestNG2's beforemethod");
} @AfterMethod
public void aftertmethod() {
System.out.println("TestNG2's aftermethod");
} @BeforeGroups
public void beforegroups() {
System.out.println("TestNG2's beforegroups");
} @AfterGroups
public void aftergroups() {
System.out.println("TestNG2's aftergroups");
} @Test
public void test1() {
System.out.println("TestNG2's testt1");
} @Test(groups="gr")
public void test2() {
System.out.println("TestNG2's testt2");
} public void ff() {
System.out.println("nothing");
}
}
运行后的结果:
beforesuite
beforeTest
beforeclass's TestNG2
TestNG2's beforemethod
TestNG2's testt1
TestNG2's aftermethod
TestNG2's beforemethod
TestNG2's testt2
TestNG2's aftermethod
afterclass's TestNG2
aftertest
aftersuite
由此可见,testng运行时,顺序是这样的:
@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite
其中{}内的与多少个@Test,就循环执行多少次。
我们知道了在一个类中注解的生命周期,那么这些注解的作用范围呢,下面我们再建一个类
package com.test; import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test; /**
* @author QiaoJiafei
* @version 创建时间:2016年3月24日 下午9:20:47
* 类说明
*/
public class TestNG1 { @BeforeClass
public void beforeclass() {
System.out.println("beforeclass's TestNG1");
} @AfterClass
public void afterclass() {
System.out.println("afterclass's TestNG1");
} @Test
public void test3() {
System.out.println("TestNG1's test3");
}
@Test(groups="haha")
public void test4() {
System.out.println("TestNG1's test4");
} }
XML中这样配置
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<test name="Test">
<classes>
<class name="com.test.TestNG1"/>
<class name="com.test.TestNG2"/>
</classes>
<!-- <groups>
<run>
<include name="gr" />
</run>
</groups>-->
</test> <!-- Test -->
</suite> <!-- Suite -->
运行的结果是:
beforesuite
beforeTest
beforeclass's TestNG1
TestNG1's test3
TestNG1's test4
afterclass's TestNG1
beforeclass's TestNG2
TestNG2's beforemethod
TestNG2's testt1
TestNG2's aftermethod
TestNG2's beforemethod
TestNG2's testt2
TestNG2's aftermethod
afterclass's TestNG2
aftertest
aftersuite
看到没有,除了@BeforeSuite、@BeforeTest、@AfterTest、@AfterSuite可以对不同的测试类生效外,其他的注解的作用范围只在本类中生效。这样就可以清晰的知道什么样的逻辑应该放在哪个注解中,如只想在测试中只启动、关闭一次浏览器,且再不同的测试类*用,那么我们就可以把启动、关闭浏览器的方法放在suite和test中
至于@BeforeGroups和@AfterGroups笔者目前还没有发现怎么生效。
画了个路程图更直接点。