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

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

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

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.idempotence
    idempotence-maven
    1.0.0-rc-3
    test



添加注释

您的测试类必须使用 @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]删除
最新教程 更多>
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-05-05
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-05-05
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-05-05
  • 如何从2D数组中提取元素?使用另一数组的索引
    如何从2D数组中提取元素?使用另一数组的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    编程 发布于2025-05-05
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-05-05
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-05-05
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    在使用GO MOD时,在GO MOD 中克服模块路径差异时,可能会遇到冲突,其中可能会遇到一个冲突,其中3派对软件包将另一个带有导入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    编程 发布于2025-05-05
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-05-05
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] 剩余_size- = buf_size lines = buffer.split('\ n'....
    编程 发布于2025-05-05
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 中删除一个频繁的问题时,在与Chrome and IE9中的图像一起工作时,遇到了一个频繁的问题。和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下CSS ID块创建带...
    编程 发布于2025-05-05
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-05-05
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-05-05
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-05-05
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-05-05
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-05-05

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

Copyright© 2022 湘ICP备2022001581号-3