2. 動態測試


一、動態測試是什么?

動態測試(Dynamic Test)允許在運行時生成測試用例,而不是在編譯時通過 @Test 靜態定義。它通過 @TestFactory 注解標記的方法動態生成一組測試用例,適用于需要靈活生成測試場景的場景。

核心特點:
  • 運行時生成測試:測試用例在運行時動態創建。
  • 靈活性強:可根據外部數據、條件或復雜邏輯生成測試。
  • 獨立執行:每個動態測試作為獨立用例運行,失敗不影響其他用例。

二、動態測試 vs 靜態測試

特性靜態測試(@Test動態測試(@TestFactory
定義時機編譯時固定運行時動態生成
用例數量固定可動態變化
生命周期支持 @BeforeEach/@AfterEach不觸發 @BeforeEach/@AfterEach
適用場景簡單、固定的測試邏輯復雜數據驅動、條件組合測試

三、動態測試的核心組件

  1. @TestFactory
    標記一個方法為動態測試工廠,該方法返回 DynamicTest 的集合(如 StreamCollectionIterable)。

  2. DynamicTest
    表示單個動態測試用例,包含:

    • 名稱:測試的顯示名稱。
    • 可執行體:測試邏輯(Lambda 或方法引用)。

四、使用場景

1. 數據驅動測試

從外部數據源(如 CSV、數據庫)讀取數據,動態生成測試用例。

2. 組合測試

生成多個參數組合的測試用例,覆蓋不同輸入組合。

3. 條件性測試

根據運行時環境或條件動態決定是否生成測試用例。

4. 動態錯誤處理

例如遍歷一組操作,每個操作作為獨立測試用例,即使部分失敗也不影響其他用例。


五、使用示例

示例 1:基本動態測試
import org.junit.jupiter.api.*;import java.util.stream.Stream;class DynamicTestDemo {@TestFactoryStream<DynamicTest> dynamicTestsBasic() {return Stream.of(DynamicTest.dynamicTest("動態測試 1", () -> {Assertions.assertEquals(4, 2 + 2);}),DynamicTest.dynamicTest("動態測試 2", () -> {Assertions.assertTrue("Hello".startsWith("H"));}));}
}
示例 2:基于外部數據的動態測試(CSV 文件)

假設 test-data.csv 內容:

2,3,5
5,5,10

動態測試代碼:

import org.junit.jupiter.api.*;
import java.nio.file.*;
import java.util.stream.*;class CsvDynamicTest {@TestFactoryStream<DynamicTest> dynamicTestsFromCsv() throws Exception {return Files.lines(Paths.get("src/test/resources/test-data.csv")).map(line -> line.split(",")).map(columns -> DynamicTest.dynamicTest("測試加法: " + columns[0] + "+" + columns[1],() -> {int a = Integer.parseInt(columns[0]);int b = Integer.parseInt(columns[1]);int expected = Integer.parseInt(columns[2]);Assertions.assertEquals(expected, a + b);}));}
}
示例 3:組合參數測試

生成多個參數的組合測試:

@TestFactory
Stream<DynamicTest> dynamicTestsWithParameters() {List<Integer> aList = List.of(1, 2, 3);List<Integer> bList = List.of(4, 5, 6);return aList.stream().flatMap(a -> bList.stream().map(b -> new int[]{a, b})).map(pair -> DynamicTest.dynamicTest("測試 " + pair[0] + " + " + pair[1],() -> Assertions.assertEquals(pair[0] + pair[1], pair[0] + pair[1])));
}
示例 4:條件性動態測試

根據條件決定是否生成測試:

@TestFactory
Stream<DynamicTest> conditionalDynamicTests() {boolean isProduction = checkEnvironment();Stream<DynamicTest> baseTests = Stream.of(DynamicTest.dynamicTest("基礎測試", () -> Assertions.assertTrue(true)));if (isProduction) {Stream<DynamicTest> prodTests = Stream.of(DynamicTest.dynamicTest("生產環境測試", () -> Assertions.assertFalse(false)));return Stream.concat(baseTests, prodTests);}return baseTests;
}private boolean checkEnvironment() {return "prod".equals(System.getProperty("env"));
}

六、動態測試的注意事項

  1. 生命周期方法不觸發
    動態測試不會執行 @BeforeEach@AfterEach,需手動管理資源。

  2. 返回值類型
    @TestFactory 方法必須返回 StreamCollectionIterable 類型的 DynamicTest

  3. 命名清晰
    動態測試的名稱應明確描述測試內容,便于失敗時快速定位。


七、動態測試 vs 參數化測試

特性動態測試參數化測試(@ParameterizedTest
靈活性高(可自由生成用例)中(依賴預定義的參數源)
生命周期@BeforeEach/@AfterEach支持生命周期方法
適用場景復雜邏輯生成用例固定參數組合測試

八、總結

動態測試在以下場景中尤為強大:

  • 需要從外部數據源動態生成測試。
  • 測試用例數量或參數組合在編譯時未知。
  • 需要根據條件動態決定測試邏輯。

通過結合 @TestFactoryDynamicTest,可以極大提升測試的靈活性和覆蓋率。建議在復雜數據驅動或條件組合測試時優先選擇動態測試!

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

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

相關文章

33.Word:國家中長期人才發展規劃綱要【33】

目錄 NO1.2樣式? NO3? 圖表 ? NO4.5.6? 開始→段落標記視圖→導航窗格→檢查有無遺漏 NO1.2樣式 F12/另存為&#xff1a;Word.docx&#xff1a;考生文件夾樣式的復制樣式的修改 樣式的應用&#xff08;沒有相似/超級多的情況下&#xff09;——替換 [ ]通配符&#x…

Qt展廳播放器/多媒體播放器/中控播放器/幀同步播放器/硬解播放器/監控播放器

一、前言說明 音視頻開發除了應用在安防監控、視頻網站、各種流媒體app開發之外&#xff0c;還有一個小眾的市場&#xff0c;那就是多媒體展廳場景&#xff0c;這個場景目前處于壟斷地位的軟件是HirenderS3&#xff0c;做的非常早而且非常全面&#xff0c;都是通用的需求&…

2021版小程序開發5——小程序項目開發實踐(1)

2021版小程序開發5——小程序項目開發實踐(1) 學習筆記 2025 使用uni-app開發一個電商項目&#xff1b; Hbuidler 首選uni-app官方推薦工具&#xff1a;https://www.dcloud.io/hbuilderx.htmlhttps://dev.dcloud.net.cn/pages/app/list 微信小程序 管理后臺&#xff1a;htt…

【零拷貝】

目錄 一&#xff1a;了解IO基礎概念 二&#xff1a;數據流動的層次結構 三&#xff1a;零拷貝 1.傳統IO文件讀寫 2.mmap 零拷貝技術 3.sendFile 零拷貝技術 一&#xff1a;了解IO基礎概念 理解CPU拷貝和DMA拷貝 ? 我們知道&#xff0c;操作系統對于內存空間&…

全棧開發:使用.NET Core WebAPI構建前后端分離的核心技巧(一)

目錄 cors解決跨域 依賴注入使用 分層服務注冊 緩存方法使用 內存緩存使用 緩存過期清理 緩存存在問題 分布式的緩存 cors解決跨域 前后端分離已經成為一種越來越流行的架構模式&#xff0c;由于跨域資源共享(cors)是瀏覽器的一種安全機制&#xff0c;它會阻止前端應用…

《Linux服務與安全管理》| 數據庫服務器安裝和配置

《Linux服務與安全管理》| 數據庫服務器安裝和配置 目錄 《Linux服務與安全管理》| 數據庫服務器安裝和配置 任務一&#xff1a; 安裝PostgreSQL數據庫&#xff0c;設置遠程登錄&#xff0c;客戶端可以成功登錄并操作數據庫。 任務二&#xff1a; 安裝MySQL數據庫&#xf…

Linux系統之whereis命令的基本使用

Linux系統之whereis命令的基本使用 一、whereis命令介紹二、whereis命令的使用幫助2.1 whereis命令的幫助信息2.2 whereis命令幫助解釋 三、whereis命令的基本使用3.1 查找命令的位置3.2 僅查找二進制文件3.3 僅查找手冊頁3.4 輸出實際使用的查找路徑3.5 指定自定義搜索路徑 四…

Autosar-以太網是怎么運行的?(Davinci配置部分)

寫在前面&#xff1a; 入行一段時間了&#xff0c;基于個人理解整理一些東西&#xff0c;如有錯誤&#xff0c;歡迎各位大佬評論區指正&#xff01;&#xff01;&#xff01; 目錄 1.Autosar ETH通訊軟件架構 2.Ethernet MCAL配置 2.1配置對應Pin屬性 2.2配置TXD引腳 2.3配…

2024年度總結

首先&#xff0c;我是在2023年結束高中生涯進入大學的&#xff0c;難免會有固化的“高中生”思維&#xff0c;我等著老師的安排&#xff0c;看著課表上課&#xff0c;跟著時間吃飯&#xff0c;睡覺&#xff0c;偶爾會熬夜&#xff0c;但整體跟高中沒差太多。我對社團沒興趣&…

【Block總結】CSAM,包含分割、關鍵點、切分等均適用!|即插即用

論文信息 標題: CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation 論文鏈接: https://arxiv.org/pdf/2311.04942 GitHub鏈接: https://github.com/aL3x-O-o-Hung/CSAM 創新點 CSAM&#xff08;跨切片注意力模塊&#xff…

解決PyG安裝中torch-sparse安裝失敗問題:詳細指南

1 問題描述 最近在學習GNN&#xff0c;需要使用PyTorch Geometric&#xff08;PyG&#xff09;庫。在安裝PyG的過程中&#xff0c;遇到了torch-sparse安裝失敗的問題&#xff0c;錯誤提示為&#xff1a; ERROR: Failed building wheel for torch-sparse本文將詳細記錄問題的解…

鳥哥Linux私房菜筆記(三)

鳥哥Linux私房菜筆記&#xff08;三&#xff09; 該第三部分和第四部分主要為原書的第十一章&#xff08;正則表達式與文件格式化處理&#xff09;&#xff0c;第十二章學習shell腳本&#xff0c;第十六章&#xff08;進程管理與SElinux初探部分&#xff09;&#xff0c;第十七…

學習日記-250203

一.論文 看師兄寫好的一稿。 二、計劃&#xff1a; 繼續看論文里的問題。 然后繼續看promptCD相關&#xff0c;明天要看論文啦,今天家里有些事比較忙&#xff08;碎碎念&#xff09; 三. &#xff09;——&#xff08; 注冊了 openreview,ORCID,Google scholar&…

python學opencv|讀取圖像(五十四)使用cv2.blur()函數實現圖像像素均值處理

【1】引言 前序學習進程中&#xff0c;對圖像的操作均基于各個像素點上的BGR值不同而展開。 對于彩色圖像&#xff0c;每個像素點上的BGR值為三個整數&#xff0c;因為是三通道圖像&#xff1b;對于灰度圖像&#xff0c;各個像素上的BGR值是一個整數&#xff0c;因為這是單通…

Kafka ACL(訪問控制列表)介紹

文章目錄 Kafka ACL&#xff08;訪問控制列表&#xff09;介紹1. Kafka ACL 的基本概念1.1 Kafka ACL 的目標1.2 Kafka ACL 的組成部分 2. Kafka 支持的資源類型2.1 Topic&#xff08;主題&#xff09;2.2 Consumer Group&#xff08;消費者組&#xff09;2.3 Cluster&#xff…

在 WSL2 中重啟 Ubuntu 實例

在 WSL2 中重啟 Ubuntu 實例&#xff0c;可以按照以下步驟操作&#xff1a; 方法 1: 使用 wsl 命令 關閉 Ubuntu 實例: 打開 PowerShell 或命令提示符&#xff0c;運行以下命令&#xff1a; wsl --shutdown這會關閉所有 WSL2 實例。 重新啟動 Ubuntu: 再次打開 Ubuntu&#x…

Spring Boot 2 快速教程:WebFlux處理流程(五)

WebFlux請求處理流程 下面是spring mvc的請求處理流程 具體步驟&#xff1a; 第一步&#xff1a;發起請求到前端控制器(DispatcherServlet) 第二步&#xff1a;前端控制器請求HandlerMapping查找 Handler &#xff08;可以根據xml配置、注解進行查找&#xff09; 匹配條件包括…

小程序設計和開發:如何研究同類型小程序的優點和不足。

一、確定研究目標和范圍 明確研究目的 在開始研究同類型小程序之前&#xff0c;首先需要明確研究的目的。是為了改進自己的小程序設計和開發&#xff0c;還是為了了解市場趨勢和用戶需求&#xff1f;不同的研究目的會影響研究的方法和重點。例如&#xff0c;如果研究目的是為了…

使用 Numpy 自定義數據集,使用pytorch框架實現邏輯回歸并保存模型,然后保存模型后再加載模型進行預測,對預測結果計算精確度和召回率及F1分數

1. 導入必要的庫 首先&#xff0c;導入我們需要的庫&#xff1a;Numpy、Pytorch 和相關工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定義數據集 …

Unity-編譯構建Android的問題記錄

文章目錄 報錯&#xff1a;AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout報錯信息解讀&#xff1a;原因分析最終處理方法 報錯&#xff1a;AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout 報錯信息解讀&#xff1…