Java自動化測試框架-11 - TestNG之annotation與並發測試篇 (詳細教程)


1、簡介

TestNG中用到的annotation的快速預覽及其屬性。

2、TestNG基本注解(注釋)

注解 描述
@BeforeSuite 注解的方法只運行一次,在當前suite所有測試執行之前執行
@AfterSuite 注解的方法只運行一次,在當前suite所有測試執行之后執行
@BeforeClass 注解的方法只運行一次,在當前類中所有方法調用之前執行
@AfterClass 注解的方法只運行一次,在當前類中所有方法調用之后執行
@BeforeTest 只運行一次,所有的測試方法運行之前運行
@AfterTest 只運行一次,所有的測試方法運行之后運行
@BeforeGroups 組的列表,這種配置方法將之前運行。此方法是保證在運行屬於任何這些組第一個測試方法,該方法被調用。
@AfterGroups 組的名單,這種配置方法后運行。此方法是保證運行后不久,最后的測試方法,該方法屬於任何這些組被調用。
@BeforeMethod 在每一個測試方法(@test)運行之前運行,例:執行完測試用例后要重置數據才能執行第二條用例時,可用之種方式。
@AfterMethod 在每一個測試方法(@test)運行之后運行
@DataProvider
標志着一個方法,提供數據的一個測試方法。注解的方法必須返回一個Object[] [],其中每個對象[]的測試方法的參數列表中可以分配。
該@Test 方法,希望從這個DataProvider的接收數據,需要使用一個dataProvider名稱等於這個注解的名字。
@Factory 作為一個工廠,返回TestNG的測試類的對象將被用於標記的方法。該方法必須返回Object[]。
@Listeners 定義一個測試類的監聽器
@Parameters 介紹如何將參數傳遞給@Test方法。
@Test 標記一個類或方法作為測試的一部分。

 如上列表中的@Factory、@Linsteners這兩個是不常用的;
前十個注解看起來不太容易區分,順序不太容易看明白,以如下范例做簡單說明,代碼:

package com.course.testng.multiThread;

/**
 * @author 北京-宏哥
 * 
 * Java自動化測試框架-11 - TestNG之annotation與並發測試篇 
 *
 * 2019年11月12日
 */
import org.testng.Assert;
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;

public class NewTest {

  @Test(groups="group1")
  public void test1() {
      System.out.println("test1 from group1");
      Assert.assertTrue(true);
  }
  
  @Test(groups="group1")
  public void test11() {
      System.out.println("test11 from group1");
      Assert.assertTrue(true);
  }
  
  @Test(groups="group2")
  public void test2() 
  {
      System.out.println("test2 from group2");
      Assert.assertTrue(true);
  }
  
  @BeforeTest
  public void beforeTest() 
  {
      System.out.println("beforeTest");
  }
  
  @AfterTest
  public void afterTest() 
  {
      System.out.println("afterTest");
  }
  
  @BeforeClass
  public void beforeClass() 
  {
      System.out.println("beforeClass");
  }
  
  @AfterClass
  public void afterClass() 
  {
      System.out.println("afterClass");
  }
  
  @BeforeSuite
  public void beforeSuite() 
  {
      System.out.println("beforeSuite");
  }
  
  @AfterSuite
  public void afterSuite() 
  {
      System.out.println("afterSuite");
  }
  
  //只對group1有效,即test1和test11
  @BeforeGroups(groups="group1")
  public void beforeGroups() 
  {
      System.out.println("beforeGroups");
  }
  
  //只對group1有效,即test1和test11
  @AfterGroups(groups="group1")
  public void afterGroups() 
  {
      System.out.println("afterGroups");
  }
  
  @BeforeMethod
  public void beforeMethod() 
  {
      System.out.println("beforeMethod");
  }
  
  @AfterMethod
  public void afterMethod() 
  {
      System.out.println("afterMethod");
  }
}

控制台輸出如下:

3、使用注釋/注解的好處

以下是使用注釋/注解的一些好處:

  • TestNG通過查找注釋/注解來識別它感興趣的方法。 因此,方法名稱不限於任何模式或格式。

  • 可以將其他參數傳遞給注釋。

  • 注釋是強類型的,所以編譯器會馬上標記任何錯誤。

  • 測試類不再需要擴展任何東西(如TestCase,對於JUnit3)。

4、 Concurrenttesting(注解方式):

@Test注解上可通過配置threadPoolSize來實現並發,threadPoolSize和invocationCount是結合使用的,當invocationCount=1的時候,threadPoolSize沒有意義。invocationCount表示方法被調用的次數,如果不配置threadPoolSize,該方法會被順序執行5次,如果配置threaPoolSize=4,下圖所示的方法會一次以4個線程並發執行,縮短執行時間。

下面的例子是輸出進程ID,threadPoolSize用來指明線程池的大小,也就是並發的線程數目是多少

5次調用,有3個線程可調用

1、新建com.course.testng.multiThread包,包里新建MuitiThreadOnAnnotion類,如下

2、參考代碼

package com.course.testng.multiThread;

import org.testng.annotations.Test;

/**
 * @author 北京-宏哥
 * 
 * Java自動化測試框架-11 - TestNG之annotation與並發測試篇
 *
 * 2019年11月11日
 */
//多線程測試,沒有關聯的用例可以使用多線程減少執行時間
public class MuitiThreadOnAnnotion {
    @Test(invocationCount = 5,threadPoolSize = 3)
    public void test() {
        System.out.println(1);
        System.out.printf("Thrad Id : %s%n",Thread.currentThread().getId());
    }
}

3、控制台頁面輸出

4、若改成5次調用,有5個線程可調用

5、testng.xml配置文件

TestNG可以以多線程的模式運行所有的test,這樣可以獲得最大的運行速度,最大限度的節約執行時間。當然,並發運行也是有代價的,就是需要我們的代碼是線程安全的。

並發運行測試的話,需要我們指定運行的配置文件,一個示例如下:

<suite name="My suite" parallel="methods" thread-count="4">

說明:在當前測試規划的執行過程中,為每個測試方法的執行使用單獨的線程,最多並發4個線程。

<suite name="My suite" parallel="tests" thread-count="4">

說明:在當前測試規划的執行過程中,為每個測試用例的執行使用單獨的線程(該測試用例中的測試方法共享一個線程),最多並發4個線程。

<suite name="My suite" parallel="classes" thread-count="4">

說明:在當前測試規划的執行過程中,為每個測試類的執行使用單獨的線程(該測試類中的測試方法共享一個線程),最多並發4個線程。

<suite name="My suite" parallel="instances" thread-count="4">

說明:在當前測試規划的執行過程中,為每個測試類實例的執行始終使用唯一的線程(該測試實例中的測試方法共享一個線程),最多並發4個線程。

注意:這里的parallel默認值為"none"。曾經的"true", "false"已經過時了,不建議使用。

1.Parallel=”methods”的意思是指TestNG會將method作為並發的元子單位,即每個method運行在自己的thread中。如果parallel=”tests”,則指會將test 作為並發的元子單位

2.Thread-count=”2”是指,運行的時候,並發度為2,同時會有兩個線程在運行。

1、新建一個測試類,例如:Test1

 2、參考代碼

package com.course.testng.multiThread;

import org.testng.annotations.Test;

/**
 * @author 北京-宏哥
 * 
 * Java自動化測試框架-11 - TestNG之annotation與並發測試篇 
 *
 * 2019年11月12日
 */
public class Test1 {
    @Test(groups = { "t8"})  
    public void aThreadPool() {  
        System.out.println("#ThreadA: " +Thread.currentThread().getId());  
    }  
    @Test(groups = { "t8"})  
    public void bThreadPool() {  
        System.out.println("#ThreadB: " +Thread.currentThread().getId());  
    }  
    @Test(groups = { "t8"})  
    public void cThreadPool() {  
        System.out.println("#ThreadC: " +Thread.currentThread().getId());  
    }  
}

3、testng.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <test name="Test" parallel="methods" thread-count="2">
    <classes>
      <class name="com.course.testng.multiThread.Test1"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

4、控制台輸出結果:

5、修改testng.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <test name="Test" parallel="tests" thread-count="2">
    <classes>
      <class name="com.course.testng.multiThread.Test1"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

6、控制台頁面輸出(因為aThreadPool(),bThreadPool(),cThreadPool()都在一個test下面)

6、小結

     好了,今天關於TestNG之annotation與並發測試篇 ,就分享到這里。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM