TestNG 單元測試詳解

1、測試環境

jdk1.8.0 121

myeclipse-10.0-offline-installer-windows.exe

TestNG 插件

org.testng.eclipse 6.8.6.20130607 0745

2、介紹

套件(suite):由一個 XML 文件表示,通過<suite>標簽定義,包含一個或更多測試(test)。測試(test):由<test>定義,包含一個或更多 TestNG 類(class)。TestNG類(class):至少包含一個TestNG注釋(annotation)的java 類,由<class>標簽定義,包含一個或多個測試方法(test medthod)。測試方法(test method):一個附注了@Test 的 java 方法。

3. Annotation

?

更多解釋,可以查看官方文檔的介紹

?4、testng.xml介紹

4.1.例 1

?注:test-output是運行后自動生成的。xmltest.xm1是在對應目錄下新建的,testng-1.0.dtd 也是下載后,手動放進去的。

Test1.java 代碼:

package unittests;
import org.testng.annotations.*
public class Test1 {
@Test
public void func1(){System.out.println("test in func1");
public void func2(){System.out.println("test in func2");

?testng-1.0.dtd下載地址:http://testng.org/testng-1.0.dtd

右鍵 xmltest.xml-> Run As TestNG Suite,運行套件,輸出如下:

?說明:
1、只有被附注了@Test 的方法才會被執行。
2、如果右鍵只能看到 Run As Run Configurations,則右鍵項目,選擇 refresh 刷新

3、TestNG 類沒有歸屬 package,也可以如下編寫 xml(當前版本的插件是不允許新建TestNG Class 時不提供包名的,通常建議提供包名)

?4.2.例 2

也可以指定包名,而非類名,TestNG將查找 unittests 包中所有 class,且僅保留攜帶TestNG 注解的類。

運行結果同上

?4.3.例3
還可以指定需要包含/排除的 group 和方法。

修改 Test1.java 代碼

package unittests;
import org.testng.annotations.*;
public class Test1 {@Test(groups={"functest","checkintest"})public void func1(){System.out.println("test in func1");
@Test(groups={"functest""checkintest"})
public void func2(){
System.out.println("test in func2");
@Test(groups={"functest"})public void func3(){System.out.println("test in func3");

問題:保存代碼后,編輯器中,代碼 package unittests;右側會提示“紅叉”解決方法:

?

?

?

?修改 xmltest.xml

?

?運行結果:未執行任何一個測試方法。
再修改下,把

?

?說明:
1、例中的<include>和<exclude>是 and 關系,而非 or 的關系

2、僅提供 groups 元素配置,不提供 class 元素,執行后不調用任何測試方法

3、還可以為 group 添加其它屬性,比如是否并發運行,使用多少線程,是否運行Junit

?

?運行結果:只執行了 func1 測試方法

說明:
同時設置了groups 和method元素,且同時為groups和method設置了include、exclude為 method 元素設置 include 屬性,那么 groups 元素的設置不起作用,僅執行 method中需要 include 的方法

只為method元素設置exclude屬性,那么根據groups 元素設置得出需要運行的測試方法然后在此基礎上過濾掉 method 元素的 exclude 屬性設置的方法。

4.4.例 4

默認的,TestNG 依據出現在 xm1 中的順序執行測試。可以設置 preserve-order 屬性為false 來改變這一行為。
修改xmltest.xml如下

?5.測試方法(Test method),測試類(Test class),測試組(Test groups)

5.1.測試方法(Test method)

默認的,被附注了@Test 的測試方法,其返回值被忽略,除非設置 allow-return-values值為 true。
<suite allow-return-values="true">
or
<test allow-return-values="true">

5.2.測試組(test groups)

groups 可以位于<test>、<suite>元素內。如果在<suite>標簽下指定 groups,那么 group設置作用于該 suite 下的所有<test>。

5.2.1.例 1

修改 Test1.java 內容下

package unittests;
import org.testng.annotations.*
public class Test1 {@Test(groups={"functest","checkintest"})public void testMethod1(){System.out.println("test in func1");
@Test(groups={"functest","checkintest"})public void testMethod2(){System.out.println("test in func2");
@Test(groups={"functest"})public void testMethod3(){System.out.println("test in func3");

groups 元素放在<test>標簽下

?

?groups 元素放在<suite>標簽下

?5.2.2.例 2

使用正則表達式。
修改 Test1.java 內容下

package unittests;
import org.testng.annotations.*;
public class Test1 {
@Test(groups={"windows.functest"})public void testMethod1(){System.out.println("test in func1");
@Test(groups={"linux.functest"})public void testMethod2(){System.out.println("test in func2");
@Test(groups={"functest"})public void testMethod3(){System.out.println("test in func3");

修改 xmltest.xml如下

?運行結果:
只執行了 testMethod1

5.2.3.例 3

方法組(method groups)包含、排除單個測試方法修改 xmltest.xm1 內容如下:

?

?運行結果:testMethod1,testMethod2,testMethod3 都被執行了。

嵌套組
組可以包含組。
修改 Test1.java 如下

package unittests;
import org.testng.annotations.*;
public class Test1 {@Test(groups={"functest","checkintest"})public void testMethod1(){System.out.println("test in func1");
@Test(groups={"functest","checkintest"})public void testMethod2(){System.out.println("test in func2");
@Test(groups={"functest"})public void testMethod3(){System.out.println("test in func3");

修改xmltest.xm1

?

?運行結果:
3個測試方法都被執行了,為何?難道是 bug?不理解

排除組

?運行結果:
只執行了 testMethod3 測試方法

Partial 組
可在 class級別添加組,然后在方法級別添加組修改 Test1.java 內容如下

package unittests;
import org.testng.annotations.*.
@Test(groups="functest")
public class Test1 {
@Test(groups={"checkintest"})public void testMethod1(){System.out.println("test in func1");
@Test(groups={"checkintest"})public void testMethod2(){System.out.println("test in func2");
@Test
public void testMethod3(){System.out.println("test in func3");

xmltest.xml 內容如下

?運行結果:僅執行了 testMethod3

說明:TestNG類中所有被附注了@Test的測試方法,默認都歸屬在類級別定義的group

6. 參數
6.1.來自 testng.xml 的參數
6.1.1.例 1
修改 Test1.java

?修改 xmltest.xml

?

?

?參數還可以用于@Before/After 和@Factory

6.1.2.例 2可用@0ptional 來聲明參數可選

修改 Test1.java

?說明:如果在 xm1 文件中找不到參數 arg_in_xm1,那么使用 0ptional 括號中的值作為參都
修改 testxml.xm1

?

?6.2.攜帶 DataProvider 的參數

6.2.1.例 1

修改 Test1.java

?

?注意:必須用 dataProvider 屬性指明 Data Provider,屬性值必須和@DataProvider(name="...")中 name 的值保持一致。另外,參數個數得保持一致。

修改 xmltest.xm1

?運行結果,輸出如下數據:
rebort 36
2014 37
默認的,TestNG 會在當前測試類、其某個父類中査找 Data Provider。如果想把 dataprovider 放在其它的類中,那么被附注的方法必須是靜態方法、或者攜帶無參構造器的類,并在 dataProviderClass 屬性中指定該類。

6.2.2.例 2

在 unittests 包下新建一個 StaticProvider.java,代碼內容如下

?

?

?運行結果,輸出:
42

data provider 返回以下類型之一:
1)返回一個 object[][],數組第一維度的大小,代表了測試方法被調用的次數,第二維度則包含了和測試方法的參數類型匹配的任意對象數組。
2)返回一個迭代器 Iterator<0bject[]>。
eg:

@DataProvider(name ="test1")public Iterator<Object[]>createData(){return new MyIterator(DATA);

6.2.3.例 3

如果聲明@DataProvider接收一個java.lang.reflect.Method作為第一個參數,TestNG將會把當前測試方法傳遞給該參數。
修改 Test1.java 內容如下

?

?如果想在不同的線程池中運行多個 data provider,需要從 xm1 文件中運行它們。

7. 依賴

7.1.使用注解的依賴

7.1.1.例 1
依賴方法
修改 Test1.java 內容如下

?

?運行結果,先后輸出:test2
test1

說明:test1的運行依賴 test2 的運行注意:這種依賴,如果被依賴者運行失敗,那么依賴者的不被執行,報告中被標記為 SKIPeg:修改 test2方法如下,再次運行

?

?7.1.2.例 2
利用@Test 的屬性設置 alwaysRun=true 解決例2中被依賴者運行失敗,不執行依賴者的
問題
修改 Test1.java

?

?7.1.3.例 3
依賴組

?

更多資料參考:?Otaku – Cedric's blog

默認的,依賴方法按組分類,如果方法 test1 和方法 test2 都是同一個測試類的測試方法,test1依賴test2,那么當該類的多個實例被調用時,會先執行完所有test2,再執行test1.

7.1.4.例 4
新建 testNG 測試類

?

?

?

?

?運行結果

?

運行結果

?

?7.2.XML 中的依賴
可選的,可在 testng.xm1 文件中指定組依賴。使用<dependencies>標簽來實現這個。修改 Test1.java 內容如下

?

?修改 xmltest.xml 內容如下

?注意:被依賴的多個組之間用空格分隔。

8. 工廠模式
動態的創建測試。
8.1.例1
假設,你想創建一個測試方法,使用不同的值,多次訪問某個web站點的頁面

?

?如果繼續按這個思路繼續,很快就會變得難以管理。所以考慮使用工廠模式新建 TestNG 類文件 WebTest.java

?新建 TestNG 類文件 WebTestFactory.java

?

?修改 xmltest.xml 如下

?運行結果:webTest 中的測試方法也被執行了
說明:附注@Factory 注解的方法中構造某測試類的實例,會自動調用該測試類中帶有@Test注解的方法
當然,也可以在 java 程序中通過代碼來運行新建 Test2.java,內容如下:

?factory 方法接收類似@Test 和@Before/After 的參數,且必須返回 0bject[]。返回的對象可以是任何類實例(注:對象所在類,不含@xxxx注解的方法不被執行)。

@Factory 也可以配合 data provider 使用,可用于構造器或者普通方法
8.2.例 2
修改 WebTestFactory.java 內容如下

?

?結果:運行了 30 次測試,即 testServer 被調用了 38 次。

9.類級別的注解

?

?

?運行結果:test1,test2都被執行了,也就是說類級別的@Test 注解會把該類的所有公有方法都當作測試方法,不管是否有注解。這種情況下,依舊可為單個類方法進行注解以添加其他屬性,比如歸屬的組別

10.并行和超時
10.1. 并行套件
假如有多個套件需要運行。修改 xmltest.xml如下,復制xmltest.xml分別為xmltest2.xml,xmltest3.xml,修改套件名分別為suite2,suite3

?注意:要先 javac 對類文件進行編譯,否則會報錯,類似如下:ITestNG] [ERROR]
Cannot find class in classpath:unittests.Test1
運行套件

?且想讓每個套件在單獨的線程中運行,可添加-suitethreadpoolsize選項java org.testng.TestNG -suitethreadpoolsize 3 testng.xml testng2.xmltestng3.xml

10.2.并行test,class,method

11.返回失敗測試
TestNG 會為每次運行套件失敗的測試,在結果輸出目錄(如果為用 -d outpu_dir 指定目錄則結果輸出目錄為在當前工作目錄下的生成的 test-outputs)下創建一個名為testng-failed.xm1 的文件。可按如下方式運行失敗的用例。src>java org.testng.TestNG test-output/testng-failed.xml

12.JUnit tests

?13.Annotation 轉換略
14.Method Interceptors略
15. TestNG Listeners

16. Dependency injection

17.重寫測試方法

18.更改套件、方法略

19.通過編程方式運行 TestNG

?

?

?

?假設想同運行如下假設的 xm1 一樣,通過編程方式運行 TestNG 可如下操作

?

?

?20.測試結果

20.1. 成功,失敗斷言

20.1.1.例 1

修改 Test1.java 內容如下

?為了滿足更復雜對象的斷言,可導入 JUnit 的 Assert 類。20.1.2.例 2
修改 Test1.java 內容如下

?注意:使用 static import 是為了在使用斷言方法,如 assertEquals 時,不用攜帶包名類名,如果不用 static,則需要這么使用:org.testng.AssertJUnit.assertEquals
20.2. Logging和結果
20.2.1.logging 監聽器
例:

?

?

?運行結果

?說明:
1、-listener 選項指定使用的監聽器
也可以在 xm1 中指定監聽器修改 xmltest.xm1 內容如下

?

?運行結果:

?意:命令行運行,testng 自帶的 assert 似乎不起作用,為何?
還可以在.java 文件中指定

?

?

注:如果同時在.java 代碼中和 xm1中指定同一個監聽器,則針對每個測試方法的測試結果,會運行兩次 1og 方法
20.2.2.Logging Reporters略
20.2.3.JUnitReports略
20.2.4.Reporter API略
20.2.5.XML Reports略

參考連接:
http://testng.org/doc/documentation-main.htm1

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76088.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C復習(主要復習)

指針和數組 指針數組是一個數組&#xff0c;數組的每個元素都是指針。它適用于需要存儲多個指針的場景&#xff0c;如字符串數組。數組指針是一個指針&#xff0c;指向一個數組。它適用于需要傳遞整個數組給函數或處理多維數組的場景。 函數指針&#xff1a;函數指針的定義需要…

探索大語言模型(LLM):定義、發展、構建與應用

文章目錄 引言大規模語言模型的基本概念大規模語言模型的發展歷程1. 基礎模型階段&#xff08;2018年至2021年&#xff09;2. 能力探索階段&#xff08;2019年至2022年&#xff09;3. 突破發展階段&#xff08;以2022年11月ChatGPT的發布為起點&#xff09; 大規模語言模型的構…

5. k8s 之 pod原理與使用

Kubernetes Pod 原理詳解 1. Pod 的部署方式 Pod 是 Kubernetes 的最小調度單元&#xff0c;其部署方式分為 聲明式&#xff08;YAML&#xff09; 和 命令式&#xff08;kubectl&#xff09; 兩種&#xff1a; (1) 聲明式部署&#xff08;推薦&#xff09; 通過 YAML 文件定…

使用PyTorch實現目標檢測邊界框轉換與可視化

一、引言 在目標檢測任務中&#xff0c;邊界框&#xff08;Bounding Box&#xff09;的坐標表示與轉換是核心基礎操作。本文將演示如何&#xff1a; 實現邊界框的兩種表示形式&#xff08;角點坐標 vs 中心坐標&#xff09;之間的轉換 使用Matplotlib在圖像上可視化邊界框 驗…

電影推薦及數據分析可視化系統(Python+Echarts+Mysql+Flask框架)

提升自己&#xff0c;掌握數據分析的能力&#xff0c;最快的方式就是實踐&#xff01; 下面是對本項目的一些功能展示、介紹以及部分核心代碼的展示,附項目系統展示的視頻,制作不易如需完整代碼后臺私信我有償獲取! 一 、系統分析及功能介紹 1.系統分析 系統采用Python作為開發…

Android Jetpack Compose 高級開發核心技術

Android Compose 高級技術總結 1. 性能優化 1.1 狀態管理優化 狀態提升原則&#xff1a;將狀態提升到共享的最近共同父組件derivedStateOf&#xff1a;當需要基于多個狀態計算派生狀態時使用 val scrollState rememberScrollState() val showButton by remember {derivedS…

Java堆結構深度解析:原理、實現與應用全指南

一、堆的核心概念體系 1. 堆的定義與性質 graph TBROOT((最大堆)) --> A[父節點 ≥ 子節點]ROOT --> B[完全二叉樹結構]ROOT --> C[數組存儲]ROOT --> D[快速獲取極值] 2. 堆類型對比 類型特性典型應用場景最大堆父節點值 ≥ 子節點值獲取前K大元素最小堆父節點…

SpringMVC學習(請求與響應。常見參數類型接收與響應。@RequestParam、@RequestBody的使用)(詳細示例)

目錄 一、請求與響應。(RequestMapping) &#xff08;1&#xff09;使用注解RequestMapping對業務模塊區分。 StudentController。 TeacherController。 &#xff08;2&#xff09;Apifox請求與響應。 "/student/login"。 "/teacher/login"。 二、常見參數…

回溯算法+對稱剪枝——從八皇后問題到數獨問題(二)

引入&#xff1a; 本節我們進一步完善八皇后問題&#xff0c;學習剪枝、八皇后殘局問題 進一步領會邏輯編程的概念&#xff0c;深入體會回溯算法&#xff0c;回顧上一節提到的啟發搜索策略。 回顧&#xff1a; 八皇后問題&#xff1a;我們需要在一個空棋盤上放置 n 個皇后&a…

【玩泰山派】MISC(雜項)- 使用vscode遠程連接泰山派進行開發

文章目錄 前言流程1、安裝、啟動sshd2、配置一下允許root登錄3、vscode中配置1、安裝remote插件2、登錄 **注意** 前言 有時候要在開發板中寫一寫代碼&#xff0c;直接在終端中使用vim這種工具有時候也不是很方便。這里準備使用vscode去通過ssh遠程連接泰山派去操作&#xff0…

【VsCode】設置文件自動保存

目錄 一、前言 二、操作步驟 一、前言 VSCode中開啟自動保存功能可以通過訪問設置、修改settings.json文件、使用自動保存延遲功能來實現。這些方法能有效提升編程效率、避免數據丟失、實時同步更改。 二、操作步驟 在 Visual Studio Code (VS Code) 中設置自動保存功能非…

Adobe After Effects的插件--------Optical Flares之Options概述

Optical Flares插件的Options是對整個效果的組裝和設置。點擊該按鈕會彈出一個組裝室彈窗。 Options組裝室就是對每個【鏡頭對象】進行加工處理,再將其組裝在一起,拼湊成完整的光效。 接下來是我對組裝室的探索: 面板 面板中有預覽、堆棧、編輯和瀏覽按鈕,其作用是調節窗…

如何用 esProc 補充數據庫 SQL 的缺失能力

某些數據庫 SQL 缺失必要的能力&#xff0c;通常要編寫大段的代碼&#xff0c;才能間接實現類似的功能&#xff0c;有些情況甚至要改用存儲過程&#xff0c;連結構都變了。常見的比如&#xff1a;生成時間序列、保持分組子集、動態行列轉換、自然序號、相對位置、按序列和集合生…

迷你世界腳本腳本常見問題

腳本常見問題 彼得兔 更新時間: 2024-05-22 17:54:44 在查閱開發者學院中的腳本API時&#xff0c;若有任何問題或建議&#xff0c;歡迎通過問卷進行反饋&#xff01;【點我填寫問卷】 1.Block中的data在什么地方使用 data使用有具體需求,此處不建議開發者使用。開發者盡可能使…

四、Appium Inspector

一、介紹 Appium Inspector 是一個用于移動應用自動化測試的圖形化工具&#xff0c;主要用于檢查和交互應用的 UI 元素&#xff0c;幫助生成和調試自動化測試腳本。類似于瀏覽器的F12(開發者工具),Appium Inspector 的主要作用包括&#xff1a;? 1.?檢查 UI 元素? …

android11通過白名單卸載安裝應用

目錄 1.源碼路徑: 2.準備文件package.conf: 3.安裝方法installPackagesLI 4.卸載方法deletePackageX 1.源碼路徑: frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java public static final String WHITELIST_PATH="/data/misc/pa…

qt mapFrom返回的QPoint和event->pos()區別和globalPos區別

mousePressEvent 和 eventFilter 里 event.pos 不一樣&#xff0c;一定要注意 eventFilter里event.pos 直接返回相對于label左上角的坐標&#xff0c;就不要再mapFrom mousePressEvent 里event.pos 返回是相對于窗口左上角的坐標&#xff0c;需要用mapFrom返回label左上角的…

Hadoop四 Hive語法

一 數據庫操作 Hive數據庫操作&#xff0c;與MySql有很多都是一致的 創建數據庫 create database if not exists myhive; use myhive;查看數據庫詳細信息 desc database myhive;數據庫本質上就是在HDFS之上的文件夾&#xff0c;是一個以.db結尾的目錄&#xff0c;默認存…

前端VUE框架理論與應用(10)

1、記住全局注冊的行為必須在根 Vue 實例 (通過 new Vue) 創建之前發生。 2、要注意,以 / 開頭的嵌套路徑會被當作根路徑。 這讓你充分的使用嵌套組件而無須設置嵌套的路徑。 3、注意:在 Vue 實例內部,你可以通過 $router 訪問路由實例。因此你可以調用 this.$router.push…

leetcode-單調棧26

關于單調棧的順序總結&#xff1a; 尋找右邊第一個比我大的&#xff1a;從左到右遍歷&#xff0c;棧單調遞減 尋找左邊第一個比我小的&#xff1a;從左到右遍歷&#xff0c;棧單調遞增 尋找右邊第一個比我小的&#xff1a;從右到左遍歷&#xff0c;棧單調遞增 尋找左邊第一個比…