junit4和junit5的区别

发布时间:2023-05-19

一、JUnit是什么

JUnit指的是Java单元测试框架,它有助于在开发过程中解决各种应用程序的异常,确保最终交付的代码质量。JUnit测试用例用于验证类的行为是否符合预期结果,确保代码正确运行。

二、JUnit 4和JUnit 5的主要区别

1. 测试引擎(Test Engines)

JUnit 4使用的测试引擎是JUnit 4.x runner。JUnit 5中,Test Runner和Test Engine被分开了。JUnit 5引入了一个全新JUnit Platform,这个新的平台可以支持多种Test Engine。这意味着有多种方式可以运行测试用例。

2. 注解

在JUnit 4中,所有注解都位于org.junit包下。在JUnit 5中,JUnit Jupiter的注解都位于org.junit.jupiter.api包下。JUnit Vintage的注解都位于org.junit.vintage包下。 Preconditions and assumptions: @Before, @After, @BeforeClass, @AfterClass.
Assertions: @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, @TestTemplate, @TestInstance, @Nested, @DisplayName, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll, @Tag, @Disabled.

3. 断言(Assertions)

JUnit 4使用org.junit.Assert断言类中的静态方法进行编写测试用例的断言。JUnit 5中对JUnit Jupiter进行了改进,断言不再是在Assert类上调用静态方法,并且JUnit Jupiter支持Hamcrest和AssertJ等附加断言库。 例如:

@Test
void testNegativeNumber() {
    int num = -1;
    assertTrue(num < 0);
}

JUnit Jupiter的断言可以选择不止一种:

@Test
void testNegativeNumber() {
    int num = -1;
    assertTrue(num < 0, "The number " + num + " must be negative");
    assertFalse(num > 0, "The number " + num + " must not be positive");
    assertEquals(-1, num);
}

4. 扩展(Extensions)

JUnit 5的扩展模型更加强大,它支持所有测试级别的扩展以及底层的扩展(如TestInstancePreDestroyCallback)。JUnit Jupiter的扩展API是由用于创建JUnit 5测试扩展的注解组成的。 例如:

@ExtendWith(TimingExtension.class)
class TimeExecutionLoggerTest {
    @Test
    void testLogExecutionTime() {
        // This test can be run multiple times
    }
}

5. 数据提供者(Data Providers)

JUnit 5与JUnit 4不同,JUnit 5通过@ParamterizedTest注解支持参数化测试,以及通过@ValueSource@EnumSource@CsvSource@CsvFileSource@MethodSource@ArgumentsSource等提供了更多方式为测试用例提供参数。JUnit 4向用户提供了JUnitParams库来进行一些参数化测试,但是需要另外下载安装,而JUnit 5将它集成在框架中。 例如:

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testWithValueSource(int argument) {
    assertNotNull(argument);
}

6. 测试实例生命周期(Test Instance Lifecycle)

JUnit 5为测试实例引入了生命周期,并用@TestInstance注解表示。@TestInstance注解被用来标注单元测试类中@Test方法和@TestFactory方法之上或是整个测试类上,作为指定测试类作为新建实例或单例模式的标识。 例如:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class MyTestClass {
    private int sum = 0;
    @Test
    void testSum() {
        sum = sum + 1;
        assertEquals(1, sum);
    }
    @Test
    void testSum2() {
        sum = sum + 1;
        assertEquals(2, sum);
    }
}

三、总结

JUnit 5与JUnit 4相比,具有更多的新特性,支持多种运行引擎,更加灵活的扩展支持,参数化测试和添加了测试实例生命周期等特性。可以根据需要选择使用JUnit 4或者JUnit 5中的特性,来达到更好的测试效果。