”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Java 的 carlspring/idempotence 框架编写可并行测试

使用 Java 的 carlspring/idempotence 框架编写可并行测试

发布于2024-11-08
浏览:285

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]删除
最新教程 更多>
  • 如何解决 PHP 中 file_get_contents() 的 SSL 超时和加密启用错误?
    如何解决 PHP 中 file_get_contents() 的 SSL 超时和加密启用错误?
    解决了 file_get_contents() 的 SSL 超时和加密启用错误在 PHP 中,当使用 file_get_contents() 从 HTTPS 页面检索内容时,可能会遇到与 SSL 加密启用相关的错误。此类错误之一是:Warning: file_get_contents(): SSL:...
    编程 发布于2024-11-08
  • 如何监控 Guzzle Http 客户端 – PHP 快速提示
    如何监控 Guzzle Http 客户端 – PHP 快速提示
    Guzzle 是一款流行的 PHP HTTP 客户端,可以轻松发送 HTTP 请求和创建 Web 服务库。最流行的 PHP 框架提供了内部 Http Client 服务,它们只是 Guzzle Http Client 的定制实现: Laravel Http 客户端 Symfony Http 客户端 ...
    编程 发布于2024-11-08
  • 为什么 Python 在方法中需要显式的“Self”参数?
    为什么 Python 在方法中需要显式的“Self”参数?
    揭秘Python方法中的“Self”参数与某些编程语言不同,对象引用是用“this”关键字隐式定义的, Python 要求在方法定义中显式包含“self”参数。这种设计决策提出了一个问题:它是故意的还是实现限制的问题。在 Python 中,“self”参数显式地建立了方法与其类实例之间的关系。它提供...
    编程 发布于2024-11-08
  • 使用 Gin/Golang 时如何处理空请求主体:绑定和调试技术指南
    使用 Gin/Golang 时如何处理空请求主体:绑定和调试技术指南
    Gin/Golang 中请求正文为空使用 Gin 处理 POST 请求时,偶尔可能会遇到请求正文显示为空的问题是空的。这可能会令人沮丧,尤其是当您希望从客户端接收数据时。此问题的一个常见原因是尝试直接打印正文。Gin 将请求正文表示为接口类型 ReadCloser。但打印该接口的字符串值并不会泄露实...
    编程 发布于2024-11-08
  • Python 列表理解
    Python 列表理解
    Python 最酷的事情之一是列表推导式如何让在一行代码中创建和操作列表变得非常容易。列表理解是一种通过转换和过滤现有列表中的元素来构建新列表的简洁方法。这个特性是 Python 使代码更具可读性和高效性的众多方法之一,对于初学者来说是一个很好的学习工具。在这里阅读更多示例...... 奥利弗 |图...
    编程 发布于2024-11-08
  • 如何在 Gin 中组织路由:分组路由定义指南?
    如何在 Gin 中组织路由:分组路由定义指南?
    如何在 Gin 中组织路由为了避免路由定义使主文件混乱,您可以将路由分组到单独的文件中。这种方法可以实现更好的代码组织和可维护性。要创建嵌套路由分组,您可以将路由器变量存储在结构体或全局变量中。然后,各个文件可以将处理程序添加到此共享路由器实例。示例实现routes.gopackage app im...
    编程 发布于2024-11-08
  • Leetcode链表问题
    Leetcode链表问题
    反向链表(LeetCode #206) 难度:简单 概念:迭代和递归方法。 合并两个排序列表 (LeetCode #21) 难度:简单 概念:链表遍历和合并技术。 从列表末尾删除第 N 个节点 **(LeetCode #19) **难度:中等 概念:两指针技术(慢指针和快指针)。 链表循环 **(...
    编程 发布于2024-11-08
  • 如何在 C++ 容器中存储异构对象:boost::any 或自定义实现?
    如何在 C++ 容器中存储异构对象:boost::any 或自定义实现?
    在 C 容器中存储异构对象C 容器通常需要同质元素,这意味着它们只能保存单一类型的对象。但是,在某些情况下,您可能需要一个可以容纳混合数据类型的容器。本文探讨了如何使用 boost::any 库和自定义方法来实现此目的。使用 boost::anyboost::any 是一个模板类可以容纳任何 C 类...
    编程 发布于2024-11-08
  • 使用 Pandas 掌握数据分析:从数据中释放洞察力
    使用 Pandas 掌握数据分析:从数据中释放洞察力
    数据分析是数据科学的核心,Python 的 Pandas 库是一个强大的工具,可以使这项任务变得更轻松、更高效。无论您使用简单的电子表格还是大型数据集,Pandas 都可以让您像专业人士一样灵活地操作、分析和可视化数据。在本文中,我们将深入探讨 Pandas 的基础知识,涵盖从数据操作到高级分析技术...
    编程 发布于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 组件? React ...
    编程 发布于2024-11-08
  • 如何利用原生 ES6 Promises 有效地链接异步 jQuery 函数?
    如何利用原生 ES6 Promises 有效地链接异步 jQuery 函数?
    JavaScript 的互操作性承诺实现异步 jQuery 函数的高效链接链接异步 jQuery 函数时,通常需要避免 jQuery 的内置函数Promises 功能并使用原生 ES6 Promises 代替。这种互操作性允许 jQuery 操作和您想要的 Promise 实现之间的无缝集成。使用 ...
    编程 发布于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
  • 如何在 Python 中用逗号连接列表中的字符串?
    如何在 Python 中用逗号连接列表中的字符串?
    从列表中用逗号连接字符串将字符串列表映射到逗号分隔的字符串是编程中的常见任务。可以采用各种方法来实现此目标,每种方法都有自己的优点和缺点。一种流行的方法是将 join 方法与映射函数结合使用。此方法需要创建一个中间字符串,用作各个字符串之间的分隔符。例如:my_list = ['a', 'b', '...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3