JUnit 5 的核心注解
JUnit 5 引入了许多新的注解来支持更丰富的测试场景,以下是一些核心注解:
@Test
:标记一个方法作为测试方法。@BeforeEach
:在每个测试方法执行之前运行。@AfterEach
:在每个测试方法执行之后运行。@BeforeAll
:在所有测试方法执行之前运行(只运行一次)。@AfterAll
:在所有测试方法执行之后运行(只运行一次)。@Disabled
:禁用一个测试方法或测试类。@Nested
:用于表示嵌套测试类。@ParameterizedTest
:用于参数化测试。
实例
import org.junit.jupiter.api.*;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {
@Order(2)
@Test
public void test01() {
System.out.println("first test");
}
@Order(1)
@Test
public void test02() {
System.out.println("second test");
}
@BeforeAll
public static void Start() {
System.out.println("Start");
}
@AfterAll
public static void End() {
System.out.println("End");
}
@BeforeEach
public void Before() {
System.out.println("Before");
}
@AfterEach
public void After() {
System.out.println("After");
}
}
执行顺序
传参
在JUnit中,测试方法通常不直接接受参数,因为JUnit框架设计用于测试类的独立方法,并假设这些测试方法是自包含的。然而,如果你需要在测试中使用不同的参数来测试相同的方法,有几种方法可以实现这一目标。
1. 使用@ParameterizedTest
(JUnit 5)
JUnit 5 引入了@ParameterizedTest
,它允许你使用不同的参数多次运行相同的测试方法。这需要使用@ValueSource
、@CsvSource
、@MethodSource
或@EnumSource
等注解来提供参数。
示例:
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ExampleTest {
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testWithDifferentValues(int value) {
assertTrue(value > 0, "Value should be positive");
}
}
在这个例子中,testWithDifferentValues
方法会使用@ValueSource
注解提供的三个值(1, 2, 3)分别运行。
2. 使用@DataProvider
(JUnit 4 + TestNG 风格)
虽然JUnit 4原生不支持参数化测试像JUnit 5那样直接,但你可以使用第三方库如TestNG的@DataProvider
特性(需要一些调整或集成)或使用JUnit 4的扩展如Parameterized
类。
JUnit 4 + Parameterized 示例:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
import static org.junit.Assert.assertTrue;
@RunWith(Parameterized.class)
public class ExampleParameterizedTest {
private int input;
public ExampleParameterizedTest(int input) {
this.input = input;
}
@Parameterized.Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{ 1 },
{ 2 },
{ 3 }
});
}
@Test
public void testWithDifferentValues() {
assertTrue(input > 0);
}
}
3. 使用工厂方法或构造函数
在JUnit 4中,你也可以通过构造函数或工厂方法来传递测试数据,但这需要一些额外的设置,如使用@RunWith(Parameterized.class)
注解。
4. 编写多个测试方法
如果参数集很小,你也可以简单地编写多个测试方法,每个方法使用不同的参数值。虽然这种方法在参数数量增加时会变得繁琐,但它对于少量测试参数来说是简单且有效的。
结论
根据你的JUnit版本和具体需求,选择最适合你情况的方法来传递参数给测试方法。JUnit 5的@ParameterizedTest
提供了非常灵活和强大的参数化测试功能,是推荐的方式(如果你使用的是JUnit 5)。对于JUnit 4,你可以使用Parameterized
类或考虑升级到JUnit 5。