Heim >häufiges Problem >JUnit, 4, 5, Jupiter, Retro

JUnit, 4, 5, Jupiter, Retro

百草
百草Original
2024-03-21 16:23:001208Durchsuche

JUnit 5 的发布简化了将此库集成到项目中,因为无需从 JUnit 4 迁移。然而,在一个同时使用 JUnit 5 和 4 的大型项目中,这种共存可能会带来混淆和维护困难。为了解决这个问题,本文建议采取以下步骤:告知团队 JUnit 5 的新特性,鼓励使用 JUnit 5 编写新测试,并在删除 JUnit 4 时遵循童子军规则。此外,本文探讨了 JUnit 5 中的显著更改,包括注释、方法和测试配置的更新,以及新的 @ParameterizedTest 注释。最后,文章强调了排除依赖项、创建配置类和使用 OpenRewrite 自动重构源代码的重要性,以帮助迁移到 JUnit 5 并保持项目最新。

JUnit, 4, 5, Jupiter, Retro

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 Stream<Arguments> getInvalidSources() {
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 的依赖关系分析器。

JUnit, 4, 5, Jupiter, Retro

正如您所看到的,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。

JUnit, 4, 5, Jupiter, Retro

当你运行一些使用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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn