本文檔包含自 5.11 GA 以來所有 JUnit 5 版本的變更日誌

關於程式設計師編寫測試、擴充功能作者和引擎作者以及建置工具和 IDE 供應商的綜合參考文檔,請參閱使用者指南

5.12.0

發行日期: 2025 年 2 月 21 日

範圍

  • 測試和容器的輸出檔案附件

  • Open Test Reporting XML 輸出的改進

  • 資源鎖定定義改進

  • 測試超時時的線程轉儲

  • 參數化測試驗證改進

  • 自動註冊擴充功能的篩選支援

  • Kotlin 斷言的契約

  • 可配置的 Jupiter 擴充功能上下文範圍

  • ConsoleLauncher 的增強功能

  • 更好地支援 GraalVM 原生映像檔的使用

  • 改進對基於檔案的測試引擎的發現支援

  • 可自訂的類路徑掃描

  • JUnit Vintage 引擎中的並行執行支援

  • 眾多錯誤修復和其他增強功能

有關此版本所有已關閉問題和提取請求的完整列表,請查閱 GitHub 上 JUnit 儲存庫中的 5.12.0-M15.12.0-RC15.12.0-RC25.12.0 里程碑頁面。

整體改進

新功能和改進

  • 所有受影響的 JAR 檔案現在都包含 native-image.properties 檔案,其中包含 --initialize-at-build-time 選項,以避免在更新到較新版本的 JUnit 時 GraalVM 專案中發生中斷。

JUnit 平台

棄用和重大變更

  • 來自 junit-platform-commonsSearchOptionAnnotationSupport.findAnnotation(Class, Class, SearchOption) 已被棄用。

新功能和改進

  • ConsoleLauncher 現在接受所有 --select 選項的多個值。

  • ConsoleLauncher 現在支援 --select-unique-id 選項,以按唯一 ID 選取容器和測試。

  • ConsoleLauncher 支援新的 --exclude-methodname--include-methodname 選項,以根據不帶參數的完整限定方法名稱包含或排除方法。例如,--exclude-methodname=^org\.example\..+#methodname 將排除 org.example 套件下所有名為 methodName 的方法。

  • ConsoleLauncher--select-file--select-resource 選項現在支援行號和列號。

  • 新的 ReflectionSupport.makeAccessible(Field) 公用程式方法,供第三方使用,而不是直接呼叫內部 ReflectionUtils.makeAccessible(Field) 方法。

  • ReflectionSupport.tryToLoadClass(…​) 公用程式方法現在支援查詢 "void" 偽類型,這間接支援 JUnit Jupiter 中參數化測試中 "void"StringClass 轉換。

  • EngineDiscoveryRequestResolver.Builder 中的新 addResourceContainerSelectorResolver() 方法,支援發現基於類路徑資源的測試,類似於現有的 addClassContainerSelectorResolver() 方法。

  • EngineDiscoveryRequestTestPlan 中的新 getOutputDirectoryProvider() 方法,允許測試引擎透過呼叫 EngineExecutionListener.fileEntryPublished(…​) 將檔案發佈/附加到容器和測試。然後,已註冊的 TestExecutionListeners 可以透過覆寫 fileEntryPublished(…​) 方法來存取這些檔案。

  • 已對 Open Test Reporting XML 輸出進行了以下改進

    • 如果適用,XML 報告現在包含有關 Git 儲存庫、目前分支、提交雜湊和目前工作樹狀態的資訊。

    • 當新增到類路徑/模組路徑時,open-test-reporting 現在會將包含每個測試/容器的 JUnit 特定元數據的部分寫入 HTML 報告

    • 有關已發佈檔案的資訊現在包含為附件。

    • 如果啟用輸出擷取,則寫入 System.outSystem.err 的擷取輸出現在包含在 XML 報告中。

  • 從非測試線程寫入到 System.outSystem.err 的輸出現在歸因於已啟動或已寫入輸出的最新測試或容器。

  • 新的公共介面 ClasspathScanner,允許第三方為掃描類路徑以尋找類別和資源提供自訂實作。

  • 新的 AnnotationSupport.findAnnotation(Class, Class, List) 方法,支援在內部類別及其運行時封閉實例類型上搜尋註解。

  • 新的 TestDescriptor.orderChildren(UnaryOperator<List<TestDescriptor>> orderer) 方法,用於就地排序子項

JUnit Jupiter

錯誤修復

  • DisplayNameGenerator 實作提供 @Nested 測試類別和包含的測試方法的運行時封閉類型。在此變更之前,此類產生器只能存取宣告 @Nested 的封閉類別,但它們無法存取封閉實例的具體運行時類型。

  • 現在在 @Nested 測試類別的運行時封閉類型上發現 @DisplayNameGeneration 註解,而不是在宣告 @Nested 類別的編譯時封閉類別上發現。

  • 修復 Windows 上在 @TempDir 清理期間處理「連接點」的問題:刪除目錄時將不再跟隨連接點,並且將刪除損壞的連接點。

棄用和重大變更

  • 當將 TestInfo 注入測試類別建構函式時,TestInfo 現在包含正在建立測試類別實例的測試方法的資料,除非測試實例生命週期設定為 PER_CLASS(在這種情況下,它會繼續包含測試類別的資料)。如果您需要測試類別的 TestInfo,您可以實作 @BeforeAll 生命週期方法並將 TestInfo 注入到該方法中。

  • 當將 TestReporter 注入測試類別建構函式時,發佈的報告條目現在與測試方法而不是測試類別關聯,除非測試實例生命週期設定為 PER_CLASS(在這種情況下,發佈的報告條目將繼續與測試類別關聯)。如果您想為測試類別發佈報告條目,您可以實作 @BeforeAll 生命週期方法並將 TestReporter 注入到該方法中。

新功能和改進

  • Kotlin 契約,用於 Assertions 中的 Kotlin 特定斷言方法。

  • 現在在測試類別建構函式上支援 @TempDir

  • 現在可以透過新的 @ResourceLock#providers 屬性以程式設計方式在運行時確定共用資源鎖定,該屬性接受 ResourceLocksProvider 的實作。

  • 現在可以透過新的 @ResourceLock(target = CHILDREN) 屬性配置直接子節點的共用資源鎖定。當測試類別宣告 READ 鎖定時,但只有少數方法持有 READ_WRITE 鎖定時,這可能會改善並行化。

  • @EnumSource 具有新的 fromto 屬性,支援選取指定範圍內的列舉常數。

  • @ParameterizedTest 方法中,如果將 @JavaTimeConversionPattern 中的新 nullable 屬性設定為 true,則現在可以為 Java Date/Time 類型(例如 LocalDate)提供 null 值。

  • 新的 @ParameterizedTest(allowZeroInvocations = true) 屬性允許指定在某些情況下預期沒有調用,並且不應導致測試失敗。

  • 參數化測試現在支援引數計數驗證。如果設定了 junit.jupiter.params.argumentCountValidation=strict 配置參數或 @ParameterizedTest(argumentCountValidation = STRICT) 屬性,則宣告的引數數量與引數來源提供的引數數量之間的任何不符都將導致錯誤。預設情況下,只有在提供的引數少於宣告的引數時才會出現錯誤。

  • ArgumentsProvider(透過 @ArgumentsSource 宣告)、ArgumentConverter(透過 @ConvertWith 宣告)和 ArgumentsAggregator(透過 @AggregateWith 宣告)實作現在可以使用來自已註冊 ParameterResolver 擴充功能的建構函式注入。

  • TestTemplateInvocationContextProvider 擴充功能現在可以透過覆寫新的 mayReturnZeroTestTemplateInvocationContexts() 方法來發出信號,表明它們可能返回零調用上下文。

  • 實作 TestInstancePreConstructCallbackTestInstanceFactoryTestInstancePostProcessorParameterResolverInvocationInterceptor 的擴充功能可以覆寫 getTestInstantiationExtensionContextScope() 方法,以在測試類別實例化期間呼叫的 Extension 方法中啟用接收測試範圍的 ExtensionContext。此行為將在未來版本的 JUnit 中成為預設行為。

  • 新的 PreInterruptCallback 介面定義了希望在 @Timeout 擴充功能調用 Thread#interrupt() 之前被調用的 Extensions 的 API。

  • 當透過 junit.jupiter.execution.timeout.threaddump.enabled 配置參數啟用時,將註冊 PreInterruptCallback 的實作,該實作會在由於超時而中斷測試線程之前將線程轉儲寫入 System.out

  • TestReporter 現在允許為測試方法或測試類別發佈檔案,這些檔案可用於將其包含在測試報告中,例如 Open Test Reporting 格式。

  • 現在可以使用可以指定為配置參數的包含和排除模式篩選自動註冊的擴充功能。

  • 基於 JRE 的條件(例如 @EnabledOnJre@DisabledForJreRange)現在支援任意 Java 版本。有關詳細資訊,請參閱使用者指南

  • @TempDir 擴充功能現在在清理期間警告刪除目標位置在臨時目錄之外的符號連結,以表明目標檔案或目錄刪除,僅刪除了指向它的連結。

JUnit Vintage

新功能和改進

  • 新增了對並行執行測試類別和/或方法的支援。有關更多資訊,請參閱使用者指南

5.11.4

發行日期: 2024 年 12 月 16 日

範圍: 自 5.11.3 以來的錯誤修復和增強功能

有關此版本所有已關閉問題和提取請求的完整列表,請查閱 GitHub 上 JUnit 儲存庫中的 5.11.4 里程碑頁面。

JUnit 平台

錯誤修復

  • 在 Console Launcher 產生的舊版 XML 報告中,逸出 XML 屬性值(例如異常訊息)中的空白字元(例如換行符)。此變更確保下游工具可以處理產生的 XML 檔案,同時保留空白字元。

  • ConsoleLauncher 中啟用輸出的自動刷新,以修復緩衝問題,尤其是在使用 --details=testfeed 選項時。

JUnit Jupiter

新功能和改進

  • JAVA_25 已新增至 JRE 列舉,以用於基於 JRE 的執行條件。

JUnit Vintage

無變更。

5.11.3

發行日期: 2024 年 10 月 21 日

範圍: 自 5.11.2 以來的錯誤修復和增強功能

有關此版本所有已關閉問題和提取請求的完整列表,請查閱 GitHub 上 JUnit 儲存庫中的 5.11.3 里程碑頁面。

JUnit 平台

錯誤修復

  • 修復了 5.11.0 中引入的方法搜尋演算法中的回歸問題,當類別位於預設套件中並使用 Java 8 運行時。

JUnit Jupiter

錯誤修復

  • 擴充功能可以再次透過欄位上同一個組成的註解上的多個 @ExtendWith 元註解來註冊。

  • 當直接在欄位和參數上使用時,@ExtendWith 註解現在也可以重複。

  • 參數化測試的所有 @…​Source 註解現在也可以在用作元註解時重複。

JUnit Vintage

無變更。

5.11.2

發行日期: 2024 年 10 月 4 日

範圍: 自 5.11.1 以來的錯誤修復和增強功能

有關此版本所有已關閉問題和提取請求的完整列表,請查閱 GitHub 上 JUnit 儲存庫中的 5.11.2 里程碑頁面。

JUnit 平台

錯誤修復

  • 修復了 5.11.1 中引入的並行執行中的回歸問題,關於全域讀寫鎖定。當在測試樹中頂層節點的後代(例如 Cucumber 場景)上宣告此類鎖定時,測試執行失敗。

JUnit Jupiter

無變更。

JUnit Vintage

無變更。

5.11.1

發行日期: 2024 年 9 月 25 日

範圍: 自 5.11.0 以來的錯誤修復和增強功能

有關此版本所有已關閉問題和提取請求的完整列表,請查閱 GitHub 上 JUnit 儲存庫中的 5.11.1 里程碑頁面。

JUnit 平台

錯誤修復

  • 修復了當 NO_COLOR 環境變數可用時,禁用控制台上 ANSI 顏色的支援。

  • 如果透過 get(…​)getOrComputeIfAbsent(…​) 方法查詢儲存區,NamespacedHierarchicalStore 在關閉後不再拋出異常;但是,如果 getOrComputeIfAbsent(…​) 調用導致計算新值,仍然會拋出異常。

  • 修復了 HierarchicalTestExecutorServiceExclusiveResource 的潛在鎖定問題,這可能導致某些情況下的死鎖。

新功能和改進

  • 當啟用並行執行並使用全域讀寫鎖定時,提高並行性並減少 HierarchicalTestEngine 實作使用的阻塞線程數。

JUnit Jupiter

錯誤修復

  • TestWatcher 回呼方法可以再次存取 ExtensionContext.Store 中的資料。

新功能和改進

  • 在啟用並行執行時,在存在 @Isolated 測試的情況下,提高並行性並減少阻塞線程數

JUnit Vintage

無變更。

5.11.0

發行日期: 2024 年 8 月 14 日

範圍

  • 用於 @ParameterizedTest 方法的 @FieldSource 註解

  • 參數化測試的可重複 @..Source 註解

  • 用於撰寫動態和參數化測試的增強功能

  • 用於自動關閉測試中欄位資源的 @AutoClose 註解

  • 用於從字串轉換為支援目標類型的 ConversionSupport 公用程式

  • 用於指定發現選擇器的可擴展語法

  • @BeforeSuite@AfterSuite 註解

  • 引擎的類路徑資源掃描支援

  • 關於欄位和方法搜尋演算法的眾多錯誤修復和增強功能

如需完整詳細資訊,請參閱線上 5.11.0 發行說明