这是我在 Medium.com 上文章的重新发布,希望作为 #Hacktoberfest 的一部分接触到更多 OSS 开发人员。
您是否曾经不得不处理一些片状并行测试,这些测试大部分时间都能通过,但随后突然开始因不一致的随机错误而失败?您是否曾经不得不修复共享相同资源文件的测试并并行修改它们,以使您和其他测试的结果感到困惑?您是否花了无数个夜晚尝试重构此类代码,使其能够正确并行化并获得可重现且有保证的结果?
这是一个复杂的主题,并不总是可以直接解决,特别是在现有的大型代码库中。然而,遵循一组简单的规则可以帮助您实现这一目标,而 carlspring/idempotence 框架旨在帮助您实现这一点。
为了使测试始终可重现,您需要确保它们的资源文件仅包含并隔离给它们。这意味着每个测试都应该独占其测试资源,其他测试不应修改它们。
测试幂等性意味着您的测试将始终返回相同的结果。无论它们被执行了多少次,也无论并行运行什么其他测试。
这是一个轻量级框架,有助于以隔离的方式为 JUnit5 测试定义和复制测试资源文件。测试资源通过注解的方式定义,并复制到各自的目录中,以帮助实现测试资源分离和隔离。
所有常用的测试资源照常存放在 src/test/resources 目录下。然后,每个测试方法使用 @TestResources 注释定义它所需的资源。该框架将这些资源复制到每个测试方法的独立目录中。这确保了它能够独占访问所需的资源,从而防止并行运行的其他测试(包括同一测试类中的其他测试方法)的干扰。
对于每个构建工具,都有一个单独的依赖项,其中包含该工具的特定目录布局的路径相关转换逻辑。 (作为一个非常简单的例子,Maven 将构建的代码放在目标下,而 Gradle 使用构建来实现此目的;资源的放置方式不同,等等)。下面将对此进行更多解释。
以下是您需要开始的步骤。
您需要为构建工具定义相应的依赖项。您可以在此处查看最新发布的版本。
testImplementation "org.carlspring.testing.idempotence:idempotence-gradle:1.0.0-rc-3"
testImplementation("org.carlspring.testing.idempotence:idempotence-gradle:1.0.0-rc-3")
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 } }
对于每种测试方法,将使用以下格式创建一个目录:
build/test-resources/MyTest-testFoo/nested/dir/foo.txt build/test-resources/MyTest-testFoo/bar.txt
target/test-resources/MyTest-testFoo/nested/dir/foo.txt target/test-resources/MyTest-testFoo/bar.txt
这样您的测试将把它们需要的资源复制到它们自己的独立目录中。此时,您可以从它们所属的测试方法中修改这些测试资源,并且您的结果应该是幂等的,前提是它们仅依赖于基于文件的资源而不依赖于其他类型的共享资源(数据库、第三方服务等)。
幂等项目的文档可以在这里找到。
您可以查看概念概述,以获取有关工作原理的更详细说明。
这是一个全新项目,核心功能和基础设施已就位,但始终欢迎帮助。
具有 JUnit、Springframework、MkDocs 经验的贡献者可以通过一些出色的想法和解决方案帮助塑造项目。也非常欢迎能够提供反馈的尝鲜者!
标记为 hacktoberfest 或需要帮助的问题可供争夺,应该可以帮助您快速入门。你可以在这里找到它们。
编写测试用例时最重要的事情之一是测试将使用的测试数据并在运行之间保持理智。通过遵循一组简单的规则来保持测试之间的数据隔离,您可以实现结果的幂等性和可靠性。
carlspring/idempotence 项目提供了易于使用的框架,适用于新建项目和重构遗留项目。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3