」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Java 的 carlspring/idempotence 框架編寫可平行測試

使用 Java 的 carlspring/idempotence 框架編寫可平行測試

發佈於2024-11-08
瀏覽:590

Writing parallelizable tests with the carlspring/idempotence framework for Java

免責聲明

這是我在 Medium.com 上文章的重新發布,希望作為 #Hacktoberfest 的一部分接觸到更多 OSS 開發人員。

介紹

您是否曾經必須處理一些片狀並行測試,這些測試大部分時間都能通過,但隨後突然開始因不一致的隨機錯誤而失敗?您是否曾經必須修復共享相同資源檔案的測試並並行修改它們,以使您和其他測試的結果感到困惑?您是否花了無數個夜晚嘗試重構此類程式碼,使其能夠正確並行化並獲得可重現且有保證的結果?

這是一個複雜的主題,並不總是可以直接解決,特別是在現有的大型程式碼庫中。然而,遵循一組簡單的規則可以幫助您實現這一目標,而 carlspring/idempotence 框架旨在幫助您實現這一點。

什麼是測試隔離?

為了讓測試始終可重現,您需要確保它們的資源檔案僅包含並隔離給它們。這意味著每個測試都應該獨佔其測試資源,其他測試不應修改它們。

什麼是測試冪等性?

測試冪等性意味著您的測試將始終傳回相同的結果。無論它們被執行了多少次,也無論並行運行什麼其他測試。

Java 的 carlspring/idempotence 框架是什麼

這是一個輕量級框架,有助於以隔離的方式為 JUnit5 測試定義和複製測試資源檔案。測試資源透過註解的方式定義,並複製到各自的目錄中,以幫助實現測試資源分離和隔離。

Java carlspring/冪等框架如何運作

所有常用的測試資源照常存放在 src/test/resources 目錄下。然後,每個測試方法使用 @TestResources 註解定義它所需的資源。該框架將這些資源複製到每個測試方法的獨立目錄中。這確保了它能夠獨佔存取所需的資源,從而防止並行運行的其他測試(包括同一測試類別中的其他測試方法)的干擾。

對於每個建置工具,都有一個單獨的依賴項,其中包含該工具的特定目錄佈局的路徑相關轉換邏輯。 (作為一個非常簡單的例子,Maven 將建置的程式碼放在目標下,而 Gradle 使用建置來實現此目的;資源的放置方式不同,等等)。下面將對此進行更多解釋。

如何使用 Java carlspring/idempotence 框架來撰寫測試

以下是您需要開始的步驟。

定義依賴關係

您需要為建置工具定義對應的依賴項。您可以在此處查看最新發布的版本。

  • 對於 Gradle(使用 Groovy DSL):

testImplementation "org.carlspring.testing.idempotence:idempotence-gradle:1.0.0-rc-3"


  • Gradle(使用 Kotlin DSL):

testImplementation("org.carlspring.testing.idempotence:idempotence-gradle:1.0.0-rc-3")


  • 對於 Maven:

org.carlspring.testing.idempotenceidempotence-maven1.0.0-rc-3test

新增註釋

您的測試類別必須使用 @ExtendWith(TestResourceExtension.class) 註解進行註解。該註釋負責資源的實際複製。

您還需要使用@TestResources註解來註解您的測試方法,以指定它們需要的資源。

例如:


package com.foo;

import org.carlspring.testing.idempotence.annotation.TestResource;
import org.carlspring.testing.idempotence.annotation.TestResources;
import org.carlspring.testing.idempotence.extension.TestResourceExtension;

@ExtendWith(TestResourceExtension.class)
class MyTest {

    @Test
    @TestResources({ @TestResource(source = "classpath:/foo.txt"),
                     @TestResource(source = "classpath*:/**/bar.txt")} )
    void testFoo()
    {
        // Perform whatever checks you need using these resources
    }

}


對於每種測試方法,將使用以下格式建立目錄:

  • 對於 Gradle 項目,有一個名為 MyTest 的測試,其方法為 testFoo, 它們將被放置在:

build/test-resources/MyTest-testFoo/nested/dir/foo.txt
build/test-resources/MyTest-testFoo/bar.txt


  • 對於 Maven 項目,有一個名為 MyTest 的測試,其方法為 testFoo, 它們將被放置在:

target/test-resources/MyTest-testFoo/nested/dir/foo.txt
target/test-resources/MyTest-testFoo/bar.txt


這樣您的測試將把它們需要的資源複製到它們自己的獨立目錄中。此時,您可以從它們所屬的測試方法中修改這些測試資源,並且您的結果應該是冪等的,前提是它們僅依賴基於文件的資源而不依賴於其他類型的共享資源(資料庫、第三方服務等)。

在哪裡可以找到文檔

冪等項目的文件可以在這裡找到。

您可以查看概念概述,以獲取有關工作原理的更詳細說明。

如何貢獻

這是一個全新項目,核心功能和基礎設施已就位,但始終歡迎幫助。

具有 JUnit、Springframework、MkDocs 經驗的貢獻者可以透過一些出色的想法和解決方案來幫助塑造專案。也非常歡迎能夠提供回饋的嚐鮮者!

標記為 hacktoberfest 或需要幫助的問題可供爭奪,應該可以幫助您快速入門。你可以在這裡找到它們。

結論

編寫測試案例時最重要的事情之一是測試將使用的測試資料並在運行之間保持理智。透過遵循一組簡單的規則來保持測試之間的資料隔離,您可以實現結果的冪等性和可靠性。

carlspring/idempotence 專案提供了易於使用的框架,適用於新建專案和重構遺留專案。

版本聲明 本文轉載於:https://dev.to/carlspring/writing-parallelizable-tests-with-the-carlspringidempotence-framework-for-java-420n?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 使用 Pandas 掌握數據分析:從數據中釋放洞察力
    使用 Pandas 掌握數據分析:從數據中釋放洞察力
    資料分析是資料科學的核心,Python 的 Pandas 函式庫是一個強大的工具,可以讓這項任務變得更輕鬆、更有效率。無論您使用簡單的電子表格還是大型資料集,Pandas 都可以讓您像專業人士一樣靈活地操作、分析和視覺化資料。在本文中,我們將深入探討 Pandas 的基礎知識,涵蓋從資料操作到進階分...
    程式設計 發佈於2024-11-08
  • 使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    使用 GitLab CI/CD 和 Terraform 實作 Lambda 以進行 SFTP 整合、Go 中的 S Databricks
    通过 Databricks 中的流程自动化降低成本 我的客户需要降低在 Databricks 上运行的流程的成本。 Databricks 负责的功能之一是从各种 SFTP 收集文件,解压缩它们并将它们放入数据湖中。 自动化数据工作流程是现代数据工程的重要组成部分。在本文中,我们将探...
    程式設計 發佈於2024-11-08
  • 最佳免費開源圖示庫 4
    最佳免費開源圖示庫 4
    In 2024, finding the best free icon library can significantly enhance the visual appeal of your websites, apps, or digital projects. Whether you're a ...
    程式設計 發佈於2024-11-08
  • React Part 元件、State 和 Props 入門
    React Part 元件、State 和 Props 入門
    歡迎回到我們的 React.js 之旅!在上一篇文章中,我們介紹了 React 的基礎知識,強調了它作為建立動態使用者介面的函式庫的優勢。今天,我們將深入探討創建 React 應用程式所需的三個基本概念:元件、狀態和屬性。讓我們詳細探討這些概念! 什麼是 React 元件? Rea...
    程式設計 發佈於2024-11-08
  • 如何利用原生 ES6 Promises 有效地連結異步 jQuery 函數?
    如何利用原生 ES6 Promises 有效地連結異步 jQuery 函數?
    JavaScript 的互通性承諾實現非同步jQuery 函數的高效連結連結異步jQuery 函數時,通常需要避免jQuery 的內建函數Promises 功能並使用原生ES6 Promises 取代。這種互通性允許 jQuery 操作和您想要的 Promise 實現之間的無縫整合。 使用Nativ...
    程式設計 發佈於2024-11-08
  • 在 Python 中使用 ElementTree 的「find」和「findall」方法時如何忽略 XML 命名空間?
    在 Python 中使用 ElementTree 的「find」和「findall」方法時如何忽略 XML 命名空間?
    在ElementTree 的“find”和“findall”方法中忽略XML 命名空間使用ElementTree 模組解析和定位XML 文件中的元素時,命名空間會帶來複雜性。以下介紹如何在 Python 中使用「find」和「findall」方法時忽略命名空間。 當 XML 文件包含命名空間時,會導...
    程式設計 發佈於2024-11-08
  • Bitbucket 綜合指南:功能、整合和最佳實踐
    Bitbucket 綜合指南:功能、整合和最佳實踐
    Bitbucket简介 Bitbucket 是 Atlassian 旗下基于 Git 的源代码存储库托管服务,以其强大的集成能力和强大的协作功能而闻名。它适合各种规模的团队,提供可简化开发工作流程、提高生产力并确保安全代码管理的解决方案。无论您是小型团队还是大型企业的一部分,Bitbucket 都...
    程式設計 發佈於2024-11-08
  • 用於 PDF 處理的 PHP 庫:評估和用例指南
    用於 PDF 處理的 PHP 庫:評估和用例指南
    PDF generation and processing is a common requirement in many web applications, especially for generating invoices, reports, or documents dynamically....
    程式設計 發佈於2024-11-08
  • 如何在 Python 中用逗號連接清單中的字串?
    如何在 Python 中用逗號連接清單中的字串?
    從列表中用逗號連接字符串將字符串列表映射到逗號分隔的字符串是編程中的常見任務。可以採用各種方法來實現此目標,每種方法都有自己的優點和缺點。 一種流行的方法是將 join 方法與映射函數結合使用。此方法需要建立一個中間字串,用作各個字串之間的分隔符號。例如:my_list = ['a', 'b', '...
    程式設計 發佈於2024-11-08
  • 如何處理 AngularJS 應用程式中的錨點哈希連結?
    如何處理 AngularJS 應用程式中的錨點哈希連結?
    AngularJS 中的錨點哈希處理使用錨點瀏覽網頁是一種常見的做法,特別是對於具有多個部分的長頁面。然而,在 AngularJS 應用程式中,錨連結處理可能會出現問題。 當點擊 AngularJS 中的錨定連結時,預設行為是攔截點擊並將使用者重新導向到不同的頁面。為了解決這個問題,AngularJ...
    程式設計 發佈於2024-11-08
  • 用 Java 編寫多執行緒應用程式:綜合指南
    用 Java 編寫多執行緒應用程式:綜合指南
    在軟體開發領域,效率和速度至關重要。隨著應用程式複雜性的增加以及需要處理的資料量的增加,利用現代多核心處理器的功能變得至關重要。這就是 Java 的並發特性發揮作用的地方,它允許開發人員編寫可以同時執行多個任務的多執行緒應用程序,從而顯著提高效能。 了解 Java 並發 Java...
    程式設計 發佈於2024-11-08
  • JavaScript 中的 Promise,4 人指南
    JavaScript 中的 Promise,4 人指南
    隨著 JavaScript 的不斷發展,理解非同步程式設計對於現代開發至關重要。 Promise 是一個強大的工具,可讓您更有效地處理非同步操作。這是有關如何在 JavaScript 專案中使用 Promise 的指南。 什麼是 Promise? Promise 是一個對象,表示非同步操作的最終...
    程式設計 發佈於2024-11-08
  • 關於 React useState Hook 你需要了解的一切 - 裡面的實際例子
    關於 React useState Hook 你需要了解的一切 - 裡面的實際例子
    ReactJS useState Hook:初学者指南 介绍 ReactJS 是一个用于构建用户界面的流行 JavaScript 库,引入了 hooks 来简化和增强组件逻辑。 React 中最常用的钩子之一是 useState 钩子,它管理组件的状态。了解其工作原...
    程式設計 發佈於2024-11-08
  • **何時在 JavaScript 中使用 Mouseover 與 Mouseenter?
    **何時在 JavaScript 中使用 Mouseover 與 Mouseenter?
    了解 Mouseover 和 Mouseenter 事件之間的差異mouseover 和 mouseenter 事件都回應滑鼠遊標在元素上的移動。然而,它們之間有一個微妙的區別。 Mouseover每次滑鼠遊標進入或在元素(包括後代)的邊界內移動時,都會觸發 mouseover 事件元素。這意味著,...
    程式設計 發佈於2024-11-08
  • 在 Gmail 中使用 PHPmailer 時如何解決「SMTP Connect() Failed」錯誤?
    在 Gmail 中使用 PHPmailer 時如何解決「SMTP Connect() Failed」錯誤?
    PHPmailer 中SMTP 連線失敗:解決問題透過PHPmailer 傳送電子郵件時,開發者可能會遇到錯誤:「Mailer Error : SMTP連線()失敗。 解決方案在於 Google 實施了新的授權機制 XOAUTH2。若要允許 PHPmailer 連線到 Gmail 的 SMTP,您必...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3