一、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中的特性,来达到更好的测试效果。