天天看點

資深測試必備技能!TestNG自動化測試架構實戰詳解

作者:Atstudy網校

1、TestNG導言

在軟體測試工作中,自動測試架構是不可或缺的,之前有Junit和Nunit架構,後有TestNG。TestNG不但吸取了Junit和Nunit架構的思想,而且創造了更強大的功能,它不但是單元測試架構,同時也是內建自動化測試架構。TestNG突破了以前一些測試架構的限制,成為用途最廣泛的自動和單元測試架構之一,大家由淺入深地一起認識TestNG的強大之處,實作從初級測試工程師到資深測試工程師的進階!

1)關注+私信回複:“測試”,可以免費領取一份10G軟體測試工程師面試寶典文檔資料。以及相對應的視訊學習教程免費分享!

資深測試必備技能!TestNG自動化測試架構實戰詳解

2、TestNG-初步認知

軟體測試是檢查應用程式功能以確定其按要求運作的過程。單元測試由開發人員編碼中開展,其中采取了足夠的措施來測試每個實體(類或方法)以確定最終産品滿足要求.TestNG不僅支援單元測試,同時,是很優秀的的自動化測試架構。

JUnit促使開發人員了解與任何其他測試架構相比,測試的有用性,特别是單元測試的有用性.利用相當簡單,實用和嚴格的架構,JUnit能夠"感染"大量的開發人員,JUnit同時也有一些缺點:

最初設計用于啟用機關僅測試,現在用于各種測試.

無法進行依賴性測試.

配置控制不佳(setUp/tearDown).

Intrusive(強制你擴充類并以某種方式命名你的方法).

靜态程式設計模型(強制您不必要地重新編譯).

管理不同的測試套件複雜的項目可能非常棘手.

3、TestNG定義

TestNG是一個受JUnit和NUnit啟發的測試架構,但引入了一些新功能,使其功能更強大,更易于使用。

TestNG是一個開源自動化測試架構,其中NG表示N ext G通氣.TestNG類似于JUnit(尤其是JUnit 4),但它不是JUnit擴充,它的靈感來自JUnit.它的設計優于JUnit,尤其是在自動化測試時.TestNG的建立者是Cedric Beust。

消除舊架構的大多數限制,TestNG使開發人員能夠編寫更靈活,更強大的測試.由于它大量借鑒JavaAnnotations(用JDK 5.0引入)來定義測試,它還可以向您展示如何在真實的生産環境中使用Java語言的這一新功能。

4、TestNG功能

·支援注釋.

·TestNG使用更多Java和OO功能.

·支援測試內建類(例如,預設情況下,不需要為每個測試方法建立新的測試類執行個體).

·将編譯時測試代碼與運作時配置/資料資訊分開.

·靈活的運作時配置.

·介紹'測試組'編譯完測試後,可以讓TestNG運作所有"前端"測試,或"快速","慢速","資料庫"測試等.

·支援相關測試方法,并行測試,負載測試和部分故障.

·靈活的插件API.

·支援多線程測試.

5、TestNG-環境和編輯工具

TestNG是Java的架構,是以第一個要求是在您的計算機上安裝JDK.需要安裝idea開發工具或者eclipse等編碼工具。

6、JDK系統配置要求

資深測試必備技能!TestNG自動化測試架構實戰詳解

7、JDK1.8的安裝及環境變量的配置

1)https://www.oracle.com/java/technologies/downloads/下載下傳JDK安裝包

資深測試必備技能!TestNG自動化測試架構實戰詳解
資深測試必備技能!TestNG自動化測試架構實戰詳解

2)具體安裝步驟

點選下一步:

C槽空間足夠可以傻瓜式安裝到C槽,也可自行更改路徑到D盤

更改路徑的具體步驟:

資深測試必備技能!TestNG自動化測試架構實戰詳解

3)複制紅色框中的名稱并在剛剛建立Java檔案夾中再建立一個為其檔案名的檔案夾(注:檔案名不要任何有其他字元)

資深測試必備技能!TestNG自動化測試架構實戰詳解

4)下一步:

資深測試必備技能!TestNG自動化測試架構實戰詳解

環境變量的配置

這裡以win11系統為例:

1.首先win+E打開檔案管理器,找到此電腦圖示,右擊選擇屬性

資深測試必備技能!TestNG自動化測試架構實戰詳解

2.選擇進階系統設定

資深測試必備技能!TestNG自動化測試架構實戰詳解

3.選擇環境變量

資深測試必備技能!TestNG自動化測試架構實戰詳解

4.配置環境變量(注:這裡選擇配置系統變量而不是使用者變量)

資深測試必備技能!TestNG自動化測試架構實戰詳解
資深測試必備技能!TestNG自動化測試架構實戰詳解

5.以此輸入變量名和變量值後點選确認

變量名:JAVA_HOME

變量值:這裡是剛剛你安裝jdk的路徑,如果是一步一步跟着安裝的可以輸入:

D:\Java\jdk1.8.0_131

資深測試必備技能!TestNG自動化測試架構實戰詳解

6.點選path并進行編輯

資深測試必備技能!TestNG自動化測試架構實戰詳解

7.點選建立

資深測試必備技能!TestNG自動化測試架構實戰詳解

8.輸入

%JAVA_HOME%\bin

資深測試必備技能!TestNG自動化測試架構實戰詳解

9.點選确認

資深測試必備技能!TestNG自動化測試架構實戰詳解

確定jdk是否安裝并配置成功

1.win+r輸入cmd打開指令視窗輸入javac,如果出現以下提示表示安裝配置成功

javac

java-version

資深測試必備技能!TestNG自動化測試架構實戰詳解
資深測試必備技能!TestNG自動化測試架構實戰詳解

8、TestNG-基本注釋

在JUnit 3中訓示測試方法的傳統方法是在名稱前加上test.這是一種非常有效的方法,用于将類中的某些方法标記為具有特殊含義,但命名不能很好地擴充(如果我們想為不同的架構添加更多标記,會怎樣?)并且相當不靈活(如果我們怎麼辦?想要将其他參數傳遞給測試架構?).

注釋在JDK 5中正式添加到Java語言中,TestNG可以選擇使用注釋來注釋測試類.

以下是TestNG支援的注釋清單:

資深測試必備技能!TestNG自動化測試架構實戰詳解
資深測試必備技能!TestNG自動化測試架構實戰詳解
資深測試必備技能!TestNG自動化測試架構實戰詳解

9、使用注釋的優點

以下是使用注釋和減号的一些好處:

·TestNG識别通過查找注釋,它感興趣的方法.是以,方法名稱不限于任何模式或格式。

·我們可以将其他參數傳遞給注釋。

·注釋是強類型的,是以編譯器會立即标記任何錯誤。

·測試類不再需要擴充任何内容(如作為TestCase,用于JUnit 3)。

10、TestNG-執行程式案例示範

TestNgExecutionOrder.java案例代碼如下:

package com.test;

import org.testng.annotations.*;

/**

*@author Fson

*@date 2024/1/26 14:06

*/

public class TestNgExecutionOrder{

//test case1

@Test

public void testCase1(){

System.out.println("in test case1");

}

//test case2

@Test

public void testCase2(){

System.out.println("in test case2");

}

//test beforeMethod

@BeforeMethod

public void testBeforeMethod(){

System.out.println("in beforeMethod每次執行Test方法前執行");

}

//test afterMethod

@AfterMethod

public void testAfterMethod(){

System.out.println("in afterMethod每次執行test方法後執行");

}

//test beforeClass

@BeforeClass

public void testBeforeClass(){

System.out.println("in beforeClass testcase1執行注釋方法隻會在調用目前類的第一個測試方法之前運作一次");

}

//test AfterClass

@AfterClass

public void testAferClass(){

System.out.println("in afterClass testcase1執行帶注釋的方法僅會運作一旦所有目前類的測試方法都已運作.");

}

//test BeforeTest

@BeforeTest

public void testBeforeTest(){

System.out.println("in BeforeTest(比如先登入)執行完suit執行BeforeTest帶注釋的方法将在任何屬于該方法的測試方法之前運作裡面的課程LT;試驗>标簽運作.");

}

//test AfterTest

@AfterTest

public void TestAfterTest(){

System.out.println("in afterTest(比如登出)帶注釋的方法将在屬于<test>内的類的所有測試方法之後運作.标簽已經運作.");

}

//test beforeSuite

@BeforeSuite

public void testBeforeSuite(){

System.out.println("in beforeSuite最早執行在此套件中的所有測試運作之前,帶注釋的方法隻運作一次.");

}

//test@AfterSuite

@AfterSuite

public void testAfterSuite(){

System.out.println("in afterSuite最後執行在此套件中的所有測試運作後,帶注釋的方法隻運作一次.");

}

}

代碼中直接運作效果如下:

資深測試必備技能!TestNG自動化測試架構實戰詳解

根據以上輸出,執行程式如下:

·首先,beforeSuite()方法隻執行一次.

·最後,afterSuite()方法隻執行一次.

·甚至方法beforeTest(),beforeClass(),afterClass()和afterTest()方法也隻執行一次.

·beforeMethod()方法為每個測試用例執行但在執行測試用例之前.

·afterMethod()方法在執行測試用例後執行每個測試用例.

·在beforeMethod()和afterMethod()之間,每個測試用例都會執行.

通過testng.xml配置檔案運作程式

讓我們在其中建立testng.xml檔案/work/testng/src,執行測試用例。此檔案以XML格式捕獲您的整個測試。該檔案使您可以輕松地在一個檔案中描述所有測試套件及其參數,您可以将其簽入代碼存儲庫或通過電子郵件發送給同僚。它還可以輕松提取測試的子集或拆分多個運作時配置(例如,testngdatabase.xml将僅運作測試您的資料庫的測試)。

<?xml version="1.0"encoding="UTF-8"?>

<!--@beforeSuite-->

<suite name="tester">

<test name="case1">

<classes>

<class name="com.test.TestNgExecutionOrder"/>

</classes>

</test>

</suite>

右鍵--->run TestNgExecution.xml

資深測試必備技能!TestNG自動化測試架構實戰詳解

建立testng.xml檔案

運作TestNG測試腳本有兩種方式:一種是直接通過IDE運作(例如使用eclipse中的“Run TestNG tests”),另一種是從指令行運作(通過使用xml配置檔案)。當我們想執行某個包或者某個類中的一部分測試腳本的時候,使用xml配置檔案是非常便利的。在xml配置檔案裡,不僅可以選擇某些需要執行的測試腳本,還可以排除某些不需要運作的測試腳本。

建立xml檔案很容易,隻需要在其中填充一些内容。可以同時執行多個類中間的測試方法。

首先要聲明一個suite的名字,用于描述将要運作的測試腳本集,可以根據自己需要任意命名,最終這個名字會在testng的測試報告中看到。

<!DOCTYPE suite SYSTEM"http://testng.org/testng-1.0.dtd">

<suite name="SuiteName"verbose="1">

<test name="TestName">

</test>

</suite>

如果選擇的測試腳本是基于組的(使用了@Test(groups={"student"})這樣的注解),那麼接下來需要聲明如何使用這些組:包含或者排除。如果使用了include标簽标注某些組,那麼在選擇的測試腳本中,隻有屬于那些組的測試腳本會被運作。那些未被選中的測試腳本,或者被選中卻不屬于某些組的測試腳本都不會被運作。需要注意,一個測試腳本可以屬于很多個組,隻要有一個組被include标簽标注,那麼它就會被運作。

如果使用了exclude标簽标注某些組,那麼在選擇的腳本中,隻有不屬于那些組的測試腳本會被運作。如果同時使用了include标簽和exclude标簽,那麼擁有被include标注的組的那些腳本會被運作,擁有被exclude标注的腳本不會被運作。有一個例外是,一個組同時被include和exclude标注了,那麼擁有這個組的腳本會被運作。include和exclude标簽的使用方式如下:

<groups>

<run>

<include name="includedGroupName"/>

<exclude name="excludedGroupName"/>

</run>

</groups>

11、TestNG include

include在testng.xml中間指定需要執行的方法,如果隻執行類中間的指定方法,需要通過testng.xml配置檔案選中需要執行的方法,未包含的方法将不會執行.

IncludeTest.java案例代碼

package com.test;

import org.testng.annotations.Test;

/**

*@author Fson

*@date 2024/2/20 14:20

*include在testng.xml中間指定需要執行的方法

*/

public class IncludeTest{

@Test

public void testRun(){

System.out.println("+++++++++++++++testRun+++++++++++");

}

@Test

public void testNotRun(){

System.out.println("+++++++++++testNotRun+++++++++++++++++++++++");

}

@Test

public void testTwoRun(){

System.out.println("++++++++testTwoRun++++++++++++++");

}

}

testng xml案例配置檔案

<?xml version="1.0"encoding="UTF-8"?>

<!--@beforeSuite-->

<suite name="IncludeTestNG">

<test name="IncludeTest">

<classes>

<class name="com.test.IncludeTest"/>

<methods>

<include name="testRun"></include>

<include name="testTwoRun"></include>

</methods>

</classes>

</test>

</suite>

案例運作效果如下:

資深測試必備技能!TestNG自動化測試架構實戰詳解

TestNG exclude

與include對立的是exclude,比如除去test01方法以外其他都運作,就用exclude,如果需要排除某個方法不執行,其他的方法都需要執行,就需要在testng.xml配置檔案中間用該關鍵字。

ExcludeTest.java案例代碼

package com.test;

import org.testng.annotations.Test;

/**

*@author Fson

*@date 2024/2/20 14:42

*exclude排除該方法之外所有的方法都執行比如該類中間有3個方法test01 test02 test03除了test01方法外其他的方法都執行

*就可以用該關鍵詞

*/

public class ExcludeTest{

@Test

public void test01(){

System.out.println("test01()");

}

@Test

public void test02(){

System.out.println("test02()");

}

@Test

public void test03(){

System.out.println("test03()");

}

}

ExcludeTestNG.xml案例配置檔案

<?xml version="1.0"encoding="UTF-8"?>

<!--@beforeSuite-->

<suite name="IncludeTestNG">

<test name="IncludeTest">

<classes>

<class name="com.test.ExcludeTest"/>

<methods>

<exclude name="test01"></exclude>

</methods>

</classes>

</test>

</suite>

案例運作效果:

資深測試必備技能!TestNG自動化測試架構實戰詳解

12、TestNG自動化測試架構完整案例并輸出報告

Testng_before_after_class.java案例代碼

package com.test;

import org.testng.annotations.AfterTest;

import org.testng.annotations.BeforeClass;

import org.testng.annotations.Test;

/**

*@author Fson

*@date 2024/1/16 14:06

*/

/*

注解說明

TestNG支援多種注解,可以進行各種組合,如下進行簡單的說明

注解描述

@BeforeSuite在該套件的所有測試都運作在注釋的方法之前,僅運作一次

@AfterSuite在該套件的所有測試都運作在注釋方法之後,僅運作一次

@BeforeClass在調用目前類的第一個測試方法之前運作,注釋方法僅運作一次

@AfterClass在調用目前類的第一個測試方法之後運作,注釋方法僅運作一次

@BeforeTest注釋的方法将在屬于test标簽内的類的所有測試方法運作之前運作

@AfterTest注釋的方法将在屬于test标簽内的類的所有測試方法運作之後運作

@BeforeGroups配置方法将在之前運作組清單。此方法保證在調用屬于這些組中的任何一個的第一個測試方法之前不久運作

@AfterGroups此配置方法将在之後運作組清單。該方法保證在調用屬于任何這些組的最後一個測試方法之後不久運作

@BeforeMethod注釋方法将在每個測試方法之前運作

@AfterMethod注釋方法将在每個測試方法之後運作

@DataProvider标記一種方法來提供測試方法的資料。注釋方法必須傳回一個Object[][],其中每個Object[]可以被配置設定給測試方法的參數清單。要從該DataProvider接收資料的@Test方法需要使用與此注釋名稱相等的dataProvider名稱

@Factory将一個方法标記為工廠,傳回TestNG将被用作測試類的對象。該方法必須傳回Object[]

@Listeners定義測試類上的偵聽器

@Parameters描述如何将參數傳遞給@Test方法

@Test将類或方法标記為測試的一部分,此标記若放在類上,則該類所有公共方法都将被作為測試方法

常用注解使用:

1.@BeforeClass@AfterClass在運作類之前或之後執行一次

@BeforeClass中可寫入初始資料

@AfterClass清除資料

testng_before_after_class.java

public class Testng_before_after_class{

//運作testng_before_after_class類的時,會執行一次

@BeforeClass

public void BeforeClass(){

System.out.println("BeforeClass被運作登入");

}

@AfterTest

public void AfterClass(){

System.out.println("AfterClass被運作登出");

}

//運作每個測試方法進都會被執行到

@Test

public void abc(){

System.out.println("這裡是abc");

}

@Test

public void abc1(){

System.out.println("這裡是abc1");

}

@Test

public void abc2(){

System.out.println("這裡是abc2");

}

@Test

public void exportBaogao(){

System.out.println("+++++++++++檢視輸出報告+++++");

}

}

testng_before.xml案例配置檔案

<suite name="tester_before_suite1"parallel="methods"thread-count="2">

<test name="test_before">

<classes>

<class name="com.test.Testng_before_after_class"/>

</classes>

</test>

</suite>

案例運作效果:

資深測試必備技能!TestNG自動化測試架構實戰詳解

生成TestNG自帶的預設報告Use Default Reportters

設定報告輸出路徑run-->Edit configuration

資深測試必備技能!TestNG自動化測試架構實戰詳解

html檔案存放路徑:

資深測試必備技能!TestNG自動化測試架構實戰詳解

可以直接把該檔案複制出來,浏覽器打開開一下效果,TestNG自動生成測試報告如下:

資深測試必備技能!TestNG自動化測試架構實戰詳解

最後:

1)關注+私信回複:“測試”,可以免費領取一份10G軟體測試工程師面試寶典文檔資料。以及相對應的視訊學習教程免費分享!

繼續閱讀