当前位置: 首页 > 质量专栏 > 如何使用JUnit 5执行JUnit 4测试[教程]
如何使用JUnit 5执行JUnit 4测试[教程]
2021-09-01 浏览次数3199

一、JUnit简介

JUnit是一个强大的Selenium测试自动化框架,已被开发人员广泛用于执行单元测试。

通过测试单独的代码块,开发人员能够发现其中的错误或纠正不正确的功能。该测试框架虽然被开发人员广泛使用,但也同样受到了自动化测试人员的一致好评。

在本JUnit 5教程中,我们将深入探讨如何使用JUnit 5(JUnit框架的最新版本)运行JUnit 4测试。

二、什么是JUnit 5?

JUnit 5是JUnit的最新版本,它主要由三个不同的子组件组成——JUnit Platform、JUnit Jupiter和JUnit Vintage。在了解这些组件之前,我们需要明白JUnit 5一项基本要求:运行JUnit 5时需要Java version 8(或任何其他更高级的版本)与之适配。但是,单元测试仍然可以使用以前的Java版本进行编译并使用JUnit 5进行测试。

现在我们了解一下前面提到的三个子组件,JUnit Platform是测试框架的基础,有助于框架的开发。JUnit Jupiter用于编写测试用例,而JUnit Vintage用于运行早期版本的JUnit测试,例如基于JUnit 3和JUnit 4的测试。

三、JUnit 5与JUnit 4

以下是JUnit 5与JUnit 4的差异:

  • 在JUnit 4中,所有组件都是组合和包装在一起的。而JUnit 5由三个组件组成,即JUnit Platform、JUnit Jupiter和JUnit Vintage;

  • JUnit 4需要Java版本5(或更高版本),而JUnit 5需要Java版本8(或更高版本);

  • JUnit 4不支持任何第三方集成插件和IDE。在JUnit 5中,JUnit平台支持构建工具和流行的IDE,如Eclipse、Visual Studio和IntelliJ;

  • JUnit断言是JUnit框架的一个组成部分。在JUnit 4中,断言分在org.junit.Assert包下,该包包含所有断言方法。在JUnit 5中,断言方法被分组并且可以从org.junit.jupiter.Assertions导入。

  • 在断言中返回错误消息时,参数的顺序不同。

在JUnit 4中,

在JUnit 5中,

  • 与断言一样,Assumptions方法也从JUnit 4和JUnit 5的不同包中导入。在 JUnit 4中,它们从org.junit.Assume导入,在JUnit 5中它们从 org.junit.jupi-ter.api.Assumptions导入

以下是 JUnit 5 中更改的一些注释:

JUnit 4中的@Rule和@ClassRule注释被删除。相反,应该使用@ExtendWith和@RegisterExtension。

现在我们了解了JUnit 4和JUnit 5注释,让我们在JUnit 5教程的这一部分中更详细地查看注释:在JUnit 4中,我们使用了可以接受参数的@Test 注解。但是在JUnit 5中,@Test 注释不接受任何参数。

JUnit 4中@Test注释的使用

JUnit 5中@Test注释的使用

四、JUnit 4和JUnit 5中的注解

在JUnit 5教程的这一部分中,我们将了解JUnit 4和JUnit 5中使用的主要JUnit批注。JUnit 5中的大多数批注与JUnit 4中的批注类似。

1.@Test–用于声明测试;

2.@TestFactory–用于定义方法;

3.@RepeatedTest–用于指定该方法重复特定次数;例如,下面的测试方法使用@RepeatedTest进行注释,该方法将自动重复5次;

4.@ParameterizedTest–指示该方法是参数化测试;这些参数化测试类似于普通的测试方法,但我们必须指定一个源来为每个调用提供参数,而这些参数又会在测试中使用;

5.@TestMethodOrder–用于定义测试执行顺序;

6.@DisplayName–用于为方法或类指定自定义显示名称;

7.@Tag–用于通过定义标签在方法或类级别过滤测试;

8.@Disabled–用于禁用测试方法或类;

9.@BeforeEach–用于指定特定测试方法必须在每个@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之前执行;

10.@AfterEach–用于指定特定测试方法必须在每个@Test、@RepeatedTest.@ParameterizedTest或@TestFactory方法之后执行;

11.@BeforeAll–用于指定特定测试方法必须在所有@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之前执行;

12.@AfterAll–用于指定特定测试方法必须在所有@Test、@RepeatedTest、@ParameterizedTest或@TestFactory方法之后;

五、JUnit 5中注解的顺序执行流程

让我们看看这些注解在JUnit 5中的执行顺序。

第一步: @BeforeAll注解下实现的方法执行一次;

第二步: @BeforeEach注解下实现的方法在第一次测试之前执行;

第三步: 执行@Test注解下实现的方法;

第四步: @AfterEach注解下实现的方法在测试用例执行后运行;

第五步: @AfterAll注解下实现的方法会在最后执行。

在使用JUnit的Selenium自动化测试中,你可能希望在同一类(或不同类)下实现多个测试场景。正如JUnit 5教程的前面部分所见,了解在不同注解下实现方法的执行顺序非常重要。

如果类中有两个或多个测试方法,则执行顺序如下:

第一步: @BeforeAll注解下实现的方法执行一次。

第二步: @BeforeEach注解下实现的方法在第一次测试之前执行。

第三步:执行@Test注解下实现的方法。

第四步: @AfterEach注解下实现的方法在测试用例执行后运行。

第五步: @BeforeEach注解下实现的方法在第二个测试用例之前执行。

第六步:执行@Test注解下实现的方法。

第七步: @AfterEach注解下实现的方法在第二个测试用例执行后执行。

第八步:在最后执行一次@AfterAll注解的方法。

因此,对于多个测试用例,@BeforeAll和@AfterAll注释下实现的方法只在测试开始和结束时执行一次。另一方面,@BeforeEach和@AfterEach注释下实现的测试方法在之前执行和之后分别用于每个测试用例。

到目前为止,在本JUnit 5教程中,我们已经涵盖JUnit 5框架的基础知识、JUnit 5的注释以及注释的生命周期。

六、如何从JUnit 4迁移到JUnit 5?

以下是执行迁移的步骤:

1. JUnit 5中的JUnit Vintage引擎有助于使用JUnit平台运行用JUnit 4(或JUnit 3)编写的现有测试用例;

2. 现有JUnit 4测试中的@Before和@After等注释必须替换为JUnit 5中的等效注释(即分别为@BeforeEach 和@AfterEach);

3. 断言(即org.junit.jupiter.Assertions)和假设(即 org.junit.jupiter.api.Assumpt-ions)导入正确的包;

4. 删除JUnit 5中不再支持的JUnit 4批注,并将这些批注替换为JUnit 5中支持的批注;

5. 如果你的JUnit 4项目定义了某些规则,则必须逐步完成迁移。JUnit 4的一些规则与JUnit Jupiter兼容;

6. junit-jupiter-migration支持模块为JUnit 4中的@Ignore注释提供支持,它相当于Jupiter的@Disabled注释,然而,这仍处于试验阶段。

七、使用JUnit 5进行单元测试的优势

到目前为止,在本JUnit 5教程中,我们已经涵盖了JUnit 4和Junit 5的所有基本方面,包括正面的JUnit 5与JUnit 4比较。现在你已经了解了JUnit 5中的注释,让我们看看使用JUnit 5进行单元测试的优势。下面提到了一些主要的优点:

1. 与以前的版本相比,它提供了独特的功能来定义测试;

2. 它有助于在断言和假设的测试中利用lambda函数;

3. 它提供了具有明确目的的突出注释,可用于增强单元测试;

4. 它具有独特的可扩展架构;

5. 它支持迁移以前的JUnit版本编写的现有测试。

在本JUnit 5教程中,我们研究了JUnit 5组件及其特性、新引入的注释以及将测试从JUnit 4迁移到Junit 5的方法。如果你是现有JUnit用户,则可以将本JUnit 5教程用作将测试迁移到JUnit 5以及开始使用JUnit框架的便捷指南。

 参考文章:https://www.lambdatest.com/blog/execute-junit4-tests-with-junit5/

文章标签: 测试框架
咨询软件测试