JUnit 5 和 JUnit 4 之间的区别

后端 潘老师 6个月前 (10-25) 142 ℃ (0) 扫码查看

JUnit 5的目标是适应Java 8的编码风格,并且比JUnit 4更健壮和灵活。在本文中,我们将重点介绍JUnit 4和JUnit 5之间的一些主要区别。

1.不同的注解

两个版本的大多数注解都是相同的,但有一些不同。这里是一个快速的比较。

特性 JUnit 4 JUnit 5
声明一个测试方法 @Test @Test
在当前类的所有测试方法之前执行 @BeforeClass @BeforeAll
在当前类的所有测试方法之后执行 @AfterClass @AfterAll
在每个测试方法之前执行 @Before @BeforeEach
在每个测试方法之后执行 @After @AfterEach
禁用一个测试方法/类 @Ignore @Disabled
动态测试的测试工厂 不适用 @TestFactory
嵌套测试 不适用 @Nested
标记和过滤 @Category @Tag
注册自定义扩展 不适用 @ExtendWith

2.JUnit 5和JUnit 4之间的更多区别

2.1架构

JUnit 4将所有内容捆绑到一个单独的jar文件中。

JUnit 5由三个子项目组成,即JUnit Platform,JUnit Jupiter和JUnit Vintage。

  • JUnit Platform:它定义了TestEngine API,用于开发新的测试框架,该框架可在平台上运行。
  • JUnit Jupiter:它具有所有新的JUnit注解和TestEngine实现,用于运行使用这些注解编写的测试。
  • JUnit Vintage:支持在JUnit 5平台上运行JUnit 3和JUnit 4编写的测试。

2.2 所需的JDK版本

JUnit 4需要Java 5或更高版本。

JUnit 5需要Java 8或更高版本。

2.3 断言

在JUnit 4中,org.junit.Assert具有所有assert方法来验证预期和结果。
它们接受额外的参数作为方法签名的第一个参数以用于错误消息。例如,

public static void assertEquals(long expected, long actual)
public static void assertEquals(String message, long expected, long actual)

在JUnit 5中,org.junit.jupiter.Assertions包含大多数assert()方法,包括额外的assertThrows()和assertAll()方法。

JUnit 5断言方法还具有重载方法来支持解析错误消息以便在测试失败时打印出来,例如:

public static void assertEquals(long expected, long actual)
public static void assertEquals(long expected, long actual, String message)
public static void assertEquals(long expected, long actual, Supplier messageSupplier)

2.4. 假设

JUnit 4中的org.junit.Assume包含用于说明测试条件有意义的方法。它具有以下五个方法:

  • assumeFalse()
  • assumeNoException()
  • assumeNotNull()
  • assumeThat()
  • assumeTrue()

JUnit 5中的org.junit.jupiter.api.Assumptions包含用于说明测试条件有意义的方法。它具有以下三个方法:

  • assumeFalse()
  • assumingThat​()
  • assumeTrue()

2.5 标记和过滤

JUnit 4中使用@Category注解。

JUnit 5中使用@Tag注解。

2.6 测试套件

JUnit 4中使用的@RunWith和@Suite注解。例如:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
        ExceptionTest.class,
        TimeoutTest.class
})
public class JUnit4Example
{
}

JUnit 5中使用的@Suite,@SelectPackages和@SelectClasses注解。例如:

import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.runner.RunWith;
@Suite
@SelectPackages("com.howtodoinjava.junit5.examples")
public class JUnit5Example
{
}

2.7 允许非公共测试方法

  • JUnit 5中的测试类和测试方法不需要是公共的。现在可以将它们设置为包级保护。JUnit内部使用反射来查找测试类和测试方法。即使它们具有有限的可见性,反射也可以发现它们,因此它们不需要是公共的。
  • JUnit测试类也可以具有非公共构造函数。它们甚至可以有参数。这意味着拥有一个公共的无参数构造函数在JUnit 5中不是强制性的。
class AppTest {
    private AppTest(TestInfo testInfo) {
        System.out.println("Working on test " + testInfo.getDisplayName());
    }
  @Test
  void test(){
        assertTrue(true);
    }
}

2.8第三方集成

JUnit 4没有对第三方插件和IDE的集成支持。它们必须依靠反射。

JUnit 5为此定义了一个专门的子项目,即JUnit Platform。它定义了TestEngine API,用于开发在平台上运行的测试框架。

3. 结论

在本JUnit教程中,我们学习了JUnit 4和JUnit 5框架之间的重大区别以及用它们编写的测试。尽管在幕后存在许多差异,但主要区别在于JUnit 5中引入的模块化以及对第三方提供商编写自定义运行时引擎的支持。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10361.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】