JUnit 5 的发布简化了将此库集成到项目中,因为无需从 JUnit 4 迁移。然而,在一个同时使用 JUnit 5 和 4 的大型项目中,这种共存可能会带来混淆和维护困难。为了解决这个问题,本文建议采取以下步骤:告知团队 JUnit 5 的新特性,鼓励使用 JUnit 5 编写新测试,并在删除 JUnit 4 时遵循童子军规则。此外,本文探讨了 JUnit 5 中的显著更改,包括注释、方法和测试配置的更新,以及新的 @ParameterizedTest 注释。最后,文章强调了排除依赖项、创建配置类和使用 OpenRewrite 自动重构源代码的重要性,以帮助迁移到 JUnit 5 并保持项目最新。
JUnit 5发布后,很多开发人员只是将这个很棒的新库添加到他们的项目中,因为与其他版本不同,在这个新版本中,不需要从 JUnit 4 迁移到 5,只需包含新库即可在您的项目中,通过 JUnit 5 的所有引擎,您可以使用 JUnit 5 进行新测试,而使用 JUnit 4 或 3 的旧测试将继续运行,不会出现问题。
但是,在一个大项目中,一个 10 年前构建的项目,两个版本的 JUnit 并行运行,会发生什么呢?
新的开发人员已经开始参与该项目,其中一些有 JUnit 经验,另一些则没有。新测试是使用 JUnit 5 创建的,新测试是使用 JUnit 4 创建的,在某些时候,开发人员在不知情的情况下,当他们在已创建的 JUnit 5 测试中创建新场景时,他们只包含 JUnit 4 注释,并且测试变成了混合体,一些@Test是 JUnit 4,一些@Test是 JUnit 5,而且每天都更难删除 JUnit 4 库。
那么,如何解决这个问题呢?首先,您需要向您的团队展示什么来自 JUnit 5,什么来自 JUnit 4,以便使用 JUnit 5 而不是 JUnit 4 创建新测试。之后,无论何时,都需要遵循 Boy Scout 规则他们通过了 JUnit 4 测试,他们必须迁移到 JUnit 5。
让我们看看 JUnit 5 中发布的主要更改。一切都从名称开始,在 JUnit 5 中,您看不到名为 org.junit5 的包,而是看到 org.junit.jupiter。总而言之,你看到的所有东西都带有“Jupiter”,这意味着来自 JUnit 5。他们之所以选择这个名字,是因为 Jupiter 以“JU”开头,是距离太阳第五颗行星。
另一个变化是关于@Test,这个注释被移动到一个新的包:org.junit.jupiter.api,现在不再使用像“expected”或“timeout”这样的属性,而是使用扩展。例如,对于超时,现在您有一个注释: @Timeout(value = 100, unit = TimeUnit.MILLISECONDS)。另一个变化是测试方法和类都不需要公开。
@Before现在,您必须使用and ,而不是@After在测试配置中使用@BeforeEachand @AfterEach,并且您还拥有@BeforeAlland @AfterAll。
要忽略测试,现在您必须使用@Disable而不是@Ignore.
JUnit 5 中发布的一个好消息是注释@ParameterizedTest,它可以使用不同的参数多次运行一个测试。例如,如果您想要测试创建某个对象的方法,并且想要验证字段是否填写正确,您只需执行以下操作:
@ParameterizedTest @MethodSource("getInvalidSources") void shouldCheckInvalidFields(String name, String job, String expectedMessage) { Throwable exception = catchThrowable(() -> new Client(name, job)); assertThat(exception).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining(expectedMessage); } static StreamgetInvalidSources() { return Stream.of(Arguments.arguments("Jean Donato", "", "Job is empty"), Arguments.arguments("", "Dev", "Name is empty")); }
JUnit 5 中有很多不错的功能,我建议您查看 JUnit 5用户指南,以分析哪些功能对您的项目有用。
现在所有开发人员都知道 JUnit 5 中发生了哪些更改,您可以开始从项目中删除 JUnit 4 的过程了。因此,如果您在 2024 年仍在使用 JUnit 4,并且您的项目是一个大项目,那么您可能会有一些使用 JUnit 4 的依赖项。我建议您分析您的库以检查其中某些库是否正在使用 JUnit 4。
在下图中,我使用 IntelliJ 的依赖关系分析器。
正如您所看到的,jersey-test 使用的是 JUnit 4,也就是说,即使我从项目中删除 JUnit 4,JUnit 4 仍然可以使用,因为 Jersey. 更简单的方法是将 jersey 升级到 2.35,因为 JUnit 5 是在 jersey-test 2.35 中引入的,但我无法更新jersey-test 框架,因为其他库会在我的项目中中断。那么,在这种情况下,我能做什么呢?
我可以通过 Maven 的依赖排除从 Jersey 中排除 JUnit(如下图所示)。这样就不再使用 JUnit 4,而是使用我们的 JUnit 5。
当你运行一些使用Jersey的测试时,它们不会被加载,因为Jersey中有使用JUnit 4注释的方法,setUpand tearDown,using@Before和@After。为了解决这个问题,您可以创建一个“配置类”,其扩展JerseyTest实现setUpandtearDown并@BeforeEach调用@AfterEachand 。super.setUp()super.TearDown()
public class JerseyConfigToJUnit5 extends JerseyTest { @BeforeEach public void setUp() throws Exception { super.setUp(); } @AfterEach public void tearDown() throws Exception { super.tearDown(); } }
因此,如果您已经检查了您的库并且没有人对 JUnit 4 有更多依赖,那么您终于可以将所有测试迁移到 JUnit 5,对于此过程,有一个很好的工具可以帮助您节省大量工作,那就是OpenRewrite,一个源代码的自动重构生态系统,它们会将您所有的旧包、旧注释和所有内容更改为新包。
就是这样,伙计们,现在您和您的队友可以享受 JUnit 5 并放松心情,因为知道将使用 JUnit 5 创建新测试,并且该项目不会成为弗兰肯斯坦。所以,记住,保持你的项目是最新的,因为如果你忘记了你的库,每一天都会更难更新,总是使用规范,以及遵循规范的框架,并且在你的代码中有一个好的设计,这允许您随设施改变和移动。
Das obige ist der detaillierte Inhalt vonJUnit, 4, 5, Jupiter, Retro. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!