有必要介紹一下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. @AfterSuite: The annotated method will be run after all tests in this suite have run. @BeforeTest: The annotated method will be run before any test method belonging to the classes inside the <test> tag is run. @AfterTest: The annotated method will be run after all the test methods belonging to the classes inside the <test> tag have run. @BeforeGroups: The list of groups that this configuration method will run before. This method is guaranteed to run shortly before the first test method that belongs to any of these groups is invoked. @AfterGroups: The list of groups that this configuration method will run after. This method is guaranteed to run shortly after the last test method that belongs to any of these groups is invoked. @BeforeClass: The annotated method will be run before the first test method in the current class is invoked. @AfterClass: The annotated method will be run after all the test methods in the current class have been run. @BeforeMethod: The annotated method will be run before each test method. @AfterMethod: The annotated method will be run after each test method. |
|
英文看到不是很明白,那么我們從挨個實驗。
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筆者目前還沒有發現怎么生效。
畫了個路程圖更直接點。

