TestNG和Junit5測試框架梳理

一、testNG

1. testNG優勢

注解驅動: TestNG 使用注解來標識測試方法、測試類和配置方法,使得測試更具可讀性。
并行執行: TestNG 支持多線程并行執行測試,可以加速測試套件的執行。
豐富的配置: 可以通過 XML 配置文件來定義測試套件的執行順序、依賴關系等。
分組測試: 可以將測試方法分組,實現對特定測試分組的執行。
參數化測試: 可以使用 @Parameters 和@ DataProvider注解實現參數化測試
依賴管理: 可以通過 dependsOnMethods 或 dependsOnGroups 設置測試方法之間的依賴關系。
斷言靈活: TestNG 提供了豐富的斷言方法,用于驗證測試結果。

2. testNG常用注解

@Test:用于標識測試方法,執行單元測試。
@BeforeSuite:在測試套件之前執行。
@AfterSuite:在測試套件之后執行。
@BeforeTest:在測試類之前執行。
@AfterTest:在測試類之后執行。
@BeforeClass:在測試類中的所有測試方法之前執行。
@AfterClass:在測試類中的所有測試方法之后執行。
@BeforeMethod:在每個測試方法之前執行。
@AfterMethod:在每個測試方法之后執行。
@DataProvider:用于提供測試數據。
@Parameters:用于參數化測試。
@dependsOnMethods:設置測試方法的依賴關系。
package AI.Test.testNG;import org.testng.annotations.*;public class TestNGCheck {@BeforeSuitepublic void beforeSuite(){System.out.println("beforeSuite");}@BeforeTestpublic void beforeTest() {System.out.println("Before Test");}@BeforeClasspublic void beforeClass() {System.out.println("Before Class");}@BeforeMethodpublic void beforeMethod() {System.out.println("Before Method");}@Test(groups="Performance")public void testMethod1() {System.out.println("Test Method 1");}@AfterMethodpublic void afterMethod() {System.out.println("After Method");}@AfterClasspublic void afterClass() {System.out.println("After Class");}@AfterTestpublic void afterTest() {System.out.println("After Test");}@AfterSuitepublic void afterSuite() {System.out.println("After Suite");}}

3. testNG中@Test有哪些參數

1. 常用的:
groups: 用于將測試方法分組,可以在 XML 配置中選擇性地執行指定組的測試。
timeOut: 指定方法的超時時間,單位為毫秒。
alwaysRun: 如果設置為 true,則無論依賴的方法是否失敗,當前方法都會執行。
dependsOnMethods: 指定測試方法的依賴關系,被依賴的方法會在當前方法之前執行。
enabled: 控制測試方法是否啟用,設置為 false 則禁用該方法。
description: 提供關于測試方法的簡要描述。
invocationCount: 指定測試方法被調用的次數。2. 數據驅動,需要結合@DataProvider注解對應獲取參數的方法:
dataProvider: 指定使用哪個數據提供者來提供測試數據。
dataProviderClass: 指定數據提供者所在的類。3.并發:
invocationCount: 指定測試方法被調用的次數。
threadPoolSize: 指定線程池的大小,用于并行執行測試方法。
dataProviderThreadCount: 指定數據提供者線程的數量。

舉例:

    @Test(groups="Performance")public void testMethod1() {System.out.println("Test Method 1");}@Test(priority=1)public void testMethod2() {System.out.println("Test Method 2");}@Test(dependsOnMethods = "testMethod4", alwaysRun = false)public void testMethod3(){System.out.println("Test Method 3");}@Test(timeOut = 3000)public void testMethod4() throws InterruptedException {Thread.sleep(4000);System.out.println("Test Method 4");}@Test(enabled = false, description = "用于測試enable注解")public void testMethod5() {System.out.println("Test Method 5");}

4.?在 TestNG 中實現參數化測試

以Yaml文件為例

創建一個Yaml文件testdata.yaml

testdata:- parameters: [2, 3, 5]- parameters: [10, 20, 30]

獲取測試數據及使用

import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.yaml.snakeyaml.Yaml;import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class ParameterizedTest {@DataProvider(name = "testData")public Object[][] getYamlData() {List<Object[]> testData = new ArrayList<>();Yaml yaml = new Yaml();InputStream inputStream = getClass().getClassLoader().getResourceAsStream("testdata.yaml");Map<String, List<List<Integer>>> dataMap = yaml.load(inputStream);List<List<Integer>> parametersList = dataMap.get("testdata");for (List<Integer> parameters : parametersList) {testData.add(parameters.toArray());}return testData.toArray(new Object[testData.size()][]);}@Test(dataProvider = "testData")public void testParameterized(int param1, int param2, int param3) {System.out.println("Test with parameters: " + param1 + ", " + param2 + ", " + param3);// 執行測試邏輯,使用參數化數據進行測試}
}

5. 執行順序

TestNG 默認情況下會按照測試方法的名稱升序執行。
可以通過設置 priority 屬性來指定執行順序。
也可以使用dependsOnMethods

6. testNG斷言

assertEquals(expected, actual):
驗證兩個值是否相等。如果不相等,會拋出 AssertionError。assertNotEquals(expected, actual):
驗證兩個值是否不相等。如果相等,會拋出 AssertionError。assertTrue(condition):
驗證給定的條件是否為真。如果條件為假,會拋出 AssertionError。assertFalse(condition):
驗證給定的條件是否為假。如果條件為真,會拋出 AssertionError。assertNull(object):
驗證給定的對象是否為 null。如果對象不為 null,會拋出 AssertionError。assertNotNull(object):
驗證給定的對象是否不為 null。如果對象為 null,會拋出 AssertionError。assertSame(expected, actual):
驗證兩個引用是否指向同一個對象。如果不指向同一個對象,會拋出 AssertionError。assertNotSame(expected, actual):
驗證兩個引用是否指向不同的對象。如果指向同一個對象,會拋出 AssertionError。

二、Junit5

1. junit5的優勢

現代化的設計: JUnit 5 的架構更加模塊化和現代化,采用了模塊化體系結構,使得集成和擴展更加容易。它引入了 Jupiter(新的測試引擎)和 Vintage(支持 JUnit 4)兩個模塊,具有更好的靈活性。Lambda 表達式支持: JUnit 5 充分利用了 Java 8 的 Lambda 表達式特性,使測試代碼更加簡潔。TestNG 也支持 Lambda 表達式,但 JUnit 5 的設計更加貼合現代 Java 特性。參數化測試: JUnit 5 提供了內置的參數化測試功能,使用 @ParameterizedTest 注解,可以輕松地對測試方法使用不同的參數運行。動態測試: JUnit 5 引入了動態測試,允許在運行時生成和執行測試。使用 @TestFactory 注解,可以動態生成測試方法,以適應更加靈活的測試需求。擴展機制: JUnit 5 的擴展機制更加強大和靈活,使用 @ExtendWith 注解,可以輕松應用自定義擴展,甚至可以自定義擴展來修改測試運行時的行為。條件測試: JUnit 5 允許根據條件決定是否執行測試方法,使用 @EnabledOnOs、@DisabledIf 等注解,可以根據操作系統、環境變量等條件來控制測試執行。并行執行: TestNG 在并行執行方面有很強的功能,但 JUnit 5 也在逐步增強并行執行的支持,對于簡單的并行需求,JUnit 5 也可以勝任。靈活性: JUnit 5 允許更多的自定義配置,使得測試執行的控制更加靈活,可以根據不同的項目需求進行調整。

2. 常用注解

@Test: 用于標記測試方法。@DisplayName: 為測試方法或測試類指定一個可讀的名稱。@BeforeEach: 在每個測試方法之前執行的方法。@AfterEach: 在每個測試方法之后執行的方法。@BeforeAll: 在所有測試方法之前執行的方法,必須是靜態方法。@AfterAll: 在所有測試方法之后執行的方法,必須是靜態方法。@Disabled: 標記測試方法或測試類為禁用狀態。@ParameterizedTest: 用于參數化測試的注解。@RepeatedTest: 用于指定重復執行測試方法的次數。@Timeout: 用于設置測試方法執行的最大時間。時間是s@Tag: 為測試方法添加標簽,用于分組和過濾測試。@Nested: 用于嵌套測試類。@TestFactory: 用于動態測試,返回動態生成的測試方法。
package AI.Test.testNG;import org.junit.jupiter.api.*;public class Junit5TestCheck {@BeforeAllstatic void beforeAll() throws InterruptedException {System.out.println("Before All");Thread.sleep(3000);}@BeforeEachvoid beforeEach(){System.out.println("BeforeEach");}@Test@DisplayName("Junit5TestCheck test1")void test1(){System.out.println("test1");}@Test@RepeatedTest(2)@DisplayName("Junit5TestCheck test2")void test2(){System.out.println("test2");}@Test@Disabled@DisplayName("Junit5TestCheck test3")void test3(){System.out.println("test3");}@Test@Timeout(3)void test4() throws InterruptedException {Thread.sleep(4);System.out.println("test4");}@AfterEachvoid afterEach(){System.out.println("AfterEach");}@AfterAllstatic void afterAll(){System.out.println("After All");}}

3.?TestFactory使用示例

TestFactory其實就是參數化執行同一條用例

通常情況下,我們會使用 @ParameterizedTest 注解來參數化執行不同的測試用例,每次測試會使用不同的參數進行運行。而 @TestFactory 則是一種更為動態和靈活的方式,它允許你在運行時生成測試用例。

import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;import java.util.stream.Stream;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;public class DynamicTestExample {@TestFactoryStream<DynamicTest> dynamicTestFactory() {return Stream.of(dynamicTest("Test 1", () -> assertEquals(2, add(1, 1))),dynamicTest("Test 2", () -> assertEquals(4, add(2, 2))),dynamicTest("Test 3", () -> assertEquals(6, add(3, 3))));}int add(int a, int b) {return a + b;}
}

4.?ParameterizedTest

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.assertEquals;public class ParameterizedTestExample {@ParameterizedTest@CsvSource({"1, 2, 3", "0, 0, 0", "-1, -2, -3"})void testAddition(int a, int b, int result) {assertEquals(result, add(a, b));}int add(int a, int b) {return a + b;}
}

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

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

相關文章

Qt下載安裝及配置教程

進入qt中文網站&#xff1a;https://www.qt.io/zh-cn/ 下載開源版 往下滑&#xff0c;下載Qt在線安裝程序 它已經檢測出我的是windows系統&#xff0c;直接點擊download就好。如果是其它的系統&#xff0c;需要找到對應自己系統的安裝包。 然后跟網速有關&#xff0c;等…

Gitlab CI/CD筆記-第三天-使用主機docker in docker 進行構建并push鏡像。

一、啥叫docker in docker 就是允許的鏡像里頭有一個docker,但這個docekr鏡像只有docker的cli和/var/lib/docker.sock的套接字&#xff0c;沒有允許build.然后里頭又運行了一個docker&#xff0c;這個docker有build的能力&#xff0c;此時構建時就是里頭的docker使用外部的dock…

登錄驗證碼實現

Hutool代碼改造 Hutool 有參考文檔&#xff1b;很多工具類&#xff1b;把一些功能都封裝好&#xff1b;都不用你自己去寫&#xff1b;直接調用它的工具類 它這里會詳細告訴你引入方式Hutool <dependency><groupId>cn.hutool</groupId><artifactId>hu…

STM32F429IGT6使用CubeMX配置SPI通信(W25Q256芯片)

1、硬件電路 需要系統性的看一下W25Q256芯片手冊 2、設置RCC&#xff0c;選擇高速外部時鐘HSE,時鐘設置為180MHz 3、配置SPI 4、生成工程配置 5、相關代碼 #define sFLASH_ID 0XEF4019 // W25Q256#define SPI_FLASH_PageSize 256 #define SPI_FLASH_PerWritePageSize 256#def…

《雷達像智能識別對抗研究進展》閱讀記錄

&#xff08;1&#xff09;引言 ? 神經網絡通常存在魯棒性缺陷&#xff0c;易受到對抗攻擊的威脅。攻擊者可以隱蔽的誘導雷達智能目標識別做出錯誤預測&#xff0c;如&#xff1a; ? a圖是自行車&#xff0c;加上對抗擾動后神經網絡就會將其識別為挖掘機。 &#xff08;2&a…

【Quarkus技術系列】打造基于Quarkus的云原生微服務框架實踐(1)

前提介紹 本系列文章主要講解如何基于Quarkus技術搭建和開發"專為Kubernetes而優化的Java微服務框架"的入門和實踐&#xff0c;你將會學習到如何搭建Quarkus微服務腳環境及腳手架&#xff0c;開發Quarkus的端點服務&#xff0c;系統和應用層級的配置介紹與Quarkus的…

單芯片3路CC管理的VR轉接器解決方案

VR眼鏡即VR頭顯&#xff0c;也稱虛擬現實頭戴式顯示設備&#xff0c;隨著元宇宙概念的傳播&#xff0c;VR眼鏡的熱度一直只增不減&#xff0c;但是頭戴設備的續航一直被人詬病&#xff0c;如果增大電池就會讓頭顯變得笨重影響體驗&#xff0c;所以目前最佳的解決方案還是使用VR…

C# BeginInvoke 加 EndInvoke實現異步操作

1、定義一個委托 delegate long MyDel(int first, int second); 2、 需異步操作的函數 static int sum(int x,int y) {Console.WriteLine("InSide Sum1");Thread.Sleep(1000);Console.WriteLine("InSide Sum2");return x y;} 3、回調方法…

[HDLBits] Exams/m2014 q3

Consider the function f shown in the Karnaugh map below. Implement this function. d is dont-care, which means you may choose to output whatever value is convenient. //empty

gitui 解決 git error:Bad credentials.

問題描述 cat .git/config """ [remote "origin"]url gitgitcode.net:xxx.gitfetch refs/heads/*:refs/remotes/origin/* """ls -lh ~/.ssh/ """ -rw------- 1 z z 2.6K 8月 12 15:04 id_rsa -rw-r--r-- 1 z z 56…

學習左耳聽風欄目90天——第六天 6/90(學習左耳朵耗子的工匠精神,對技術的熱愛)【如何擁有技術領導力】

學習左耳聽風欄目90天——第六天 6/90&#xff08;學習左耳朵耗子的工匠精神&#xff0c;對技術的熱愛&#xff09;【如何擁有技術領導力】

【第358場周賽】限制條件下元素之間的最小絕對差,Java解密。

LeetCode 第358場周賽 恒生專場。 文章目錄 劍指Offer:限制條件下元素之間的最小絕對差示例:限制:解題思路:劍指Offer:限制條件下元素之間的最小絕對差 【題目描述】 給你一個下標從 0 開始的整數數組 nums 和一個整數 x 。 請你找到數組中下標距離至少為 x 的兩個元素的…

虛擬機內搭建CTFd平臺搭建及CTF題庫部署,局域網內機器可以訪問

一、虛擬機環境搭建 1、安裝docker、git、docker-compose ubuntu&#xff1a; sudo apt-get update #更新系統 sudo apt-get -y install docker.io #安裝docker sudo apt-get -y install git #安裝git sudo apt-get -y install python3-pip #安裝pip3 sudo pip install dock…

SQL筆記

最近的工作對SQL的應用程度較高&#xff0c;而且寫的sql類型基本沒怎么涉及過&#xff0c;把用到的幾個關鍵字記錄下。 使用環境&#xff1a;達夢數據庫 達夢數據庫有個特點&#xff0c;他有一個叫模式的說法&#xff0c;在圖形化工具里直接點擊創建查詢窗口&#xff0c;不用像…

Kubeadm安裝K8s集群

一、硬件環境 準備3臺Linux服務器&#xff0c;此處用Vmware虛擬機。 主機名CPU內存k8smaster2核4Gk8snode12核4Gk8snode22核4G 二、系統前置準備 配置三臺主機的hosts文件 cat << EOF > /etc/hosts 192.168.240.130 k8smaster 192.168.240.132 k8snode1 192.168.…

Sql奇技淫巧之ROWNUM偽列

ROWNUM偽列 ROWNUM是一個偽列&#xff0c;它是根據每次查詢的結果動態生成的一列遞增編號&#xff0c;表示 Oracle 從表中選擇該行的順序&#xff0c;選擇的第一行ROWNUM為1&#xff0c;第二行ROWNUM為2&#xff0c;以此類推。 注意1&#xff1a; ROWNUM偽列是在WHERE子句之…

torch.profiler

什么是torch.profiler PyTorch Profiler 是一個工具&#xff0c;它允許在訓練和推理期間收集性能指標。Profiler 的上下文管理器 API 可用于更好地了解哪些模型操作最昂貴&#xff0c;檢查它們的輸入形狀和調用堆棧&#xff0c;研究設備內核活動并可視化執行跟蹤。 性能指標&…

騰訊出品Pag動畫框架在Android端的使用-初級

Pag動畫框架作為一個第三方框架&#xff0c;它的優缺點與Lottie是相似&#xff0c;此處不過多贅述。如果你們的項目中打算用了&#xff0c;肯定是經過了一定的調研的。Pag動畫框架分幾個版本&#xff0c;有免費的有收費的。我們目前用的社區免費版&#xff0c;只用來展示Pag動畫…

項目實戰 — 消息隊列(8){網絡通信設計②}

目錄 一、客戶端設計 &#x1f345; 1、設計三個核心類 &#x1f345; 2、完善Connection類 &#x1f384; 讀取請求和響應、創建channel &#x1f384; 添加掃描線程 &#x1f384; 處理不同的響應 &#x1f384; 關閉連接 &#x1f345; 3、完善Channel類 &#x1f384; 編…

廣州華銳互動:VR3D課程在線教育平臺為職業院校提供沉浸式的虛擬現實學習體驗

隨著科技的飛速發展&#xff0c;虛擬現實(VR)和增強現實(AR)技術已經逐漸滲透到我們生活的各個領域。其中&#xff0c;VR3D課程在線教育平臺作為一種新興的教育方式&#xff0c;正在逐漸改變我們的學習方式和體驗。本文將詳細介紹VR3D課程在線教育平臺的應用前景及特點。 VR3D課…