定义
JUnit 是一个开源
的 Java 编程语言的单元测试框架,用于编写和运行
测试。
JUnit 促进了“先测试后编码”的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一点,测试一点,编码一点……”
,增加了程序员的产量和程序的稳定性,可以减少程序员的压力和花费在排错上的时间。
功能
- 通过
注解
来识别测试方法。 - 通过
断言
来测试预期结果。
测试目标
- 整个对象
- 对象的一部分:交互的方法或者一些方法
- 几个对象间的交互
测试类和测试方法
任何使用元注解@Test、@RepeatedTest、@ParameterizedTest、@ TestFactory或@TestTemplate标注的实例方法都是一个测试方法。任何包含至少一种测试方法的顶级类或静态成员类都是一个测试类。
- 测试方法书写要求
①测试方法上必须使用@Test进行修饰
②测试方法必须使用public void 进行修饰,不能带任何的参数
③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
④测试类所在的包名应该和被测试类所在的包名保持一致
⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
⑥测试类使用Test作为类名的后缀(不是必须)
⑦测试方法使用test作为方法名的前缀(不是必须)
断言(Assert)
-
定义
JUnit断言提供了一些辅助函数,用于帮助开发人员确定某些被测试函数是否工作正常,只有失败的断言才会被记录。 -
分类
junit中的assert方法全部放在Assert类中。 -
assertEquals断言
比较实际的值和用户预期的值是否一样,通过对象的equals()判断。同一个对象一定equal,不同对象,也可能equal。 -
assertArrayEquals断言
查看两个数组是否相等 -
assertTrue与assertFalse断言
判断某个条件是真还是假 -
assertNull与assertNotNull断言
验证所测试的对象是否为空或不为空 -
assertSame与assertNotSame断言
测试预期的值和实际的值是否为同一个引用(看地址) -
assertTrue与assertFalse断言
判断一个条件是true还是false -
assertThat断言
查看实际值是否满足指定的条件 -
fail断言
用于标记某个不应该被到达的分支,使测试立即失败
注解(JUnit5)
- 被@Test、@TestTemplate、@RepeatedTest、@BeforeAll、@AfterAll、@BeforeEach 或 @AfterEach 注解标注的方法不可以有返回值。
- 一个测试类单元测试的执行顺序为:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
每一个测试方法的调用顺序为:
@Before –> @Test –> @After
⚠️ 某些注解目前可能还处于试验阶段。详细信息请参阅 试验性API 中的表格。
常用注解
注解 | 描述 |
---|---|
@Test | 将普通方法变为一个测试方法。与JUnit 4的@Test 注解不同的是,它没有声明任何属性,因为JUnit Jupiter中的测试扩展是基于它们自己的专用注解来完成的。这样的方法会被继承,除非它们被覆盖。 |
@ParameterizedTest | 表示该方法是一个 参数化测试。这样的方法会被继承,除非它们被覆盖。 |
@RepeatedTest | 表示该方法是一个 重复测试 的测试模板。这样的方法会被继承,除非它们被覆盖。 |
@TestFactory | 表示该方法是一个 动态测试 的测试工厂。这样的方法会被继承,除非它们被覆盖。 |
@TestInstance | 用于配置所标注的测试类的 测试实例生命周期。这些注解会被继承。 |
@TestTemplate | 表示该方法是一个 测试模板,它会依据注册的 提供者 所返回的调用上下文的数量被多次调用。 这样的方法会被继承,除非它们被覆盖。 |
@DisplayName | 为测试类或测试方法声明一个自定义的显示名称。该注解不能被继承。 |
@BeforeEach | 表示使用了该注解的方法应该在当前类中每一个使用了@Test 、@RepeatedTest 、@ParameterizedTest 或者@TestFactory 注解的方法之前 执行;类似于JUnit 4的 @Before 。这样的方法会被继承,除非它们被覆盖。 |
@AfterEach | 表示使用了该注解的方法应该在当前类中每一个使用了@Test 、@RepeatedTest 、@ParameterizedTest 或者@TestFactory 注解的方法之后 执行;类似于JUnit 4的 @After 。这样的方法会被继承,除非它们被覆盖。 |
@BeforeAll | 表示使用了该注解的方法应该在当前类中所有使用了@Test 、@RepeatedTest 、@ParameterizedTest 或者@TestFactory 注解的方法之前 执行;类似于JUnit 4的 @BeforeClass 。这样的方法会被继承(除非它们被隐藏 或覆盖),并且它必须是 static 方法(除非"per-class" 测试实例生命周期 被使用)。 |
@AfterAll | 表示使用了该注解的方法应该在当前类中所有使用了@Test 、@RepeatedTest 、@ParameterizedTest 或者@TestFactory 注解的方法之后执行;类似于JUnit 4的 @AfterClass 。这样的方法会被继承(除非它们被隐藏 或覆盖),并且它必须是 static 方法(除非"per-class" 测试实例生命周期 被使用)。 |
@Nested | 表示使用了该注解的类是一个内嵌、非静态的测试类。@BeforeAll 和@AfterAll 方法不能直接在@Nested 测试类中使用,(除非"per-class" 测试实例生命周期 被使用)。该注解不能被继承。 |
@Tag | 用于声明过滤测试的tags,该注解可以用在方法或类上;类似于TesgNG的测试组或JUnit 4的分类。该注解能被继承,但仅限于类级别,而非方法级别。 |
@Disable | 用于禁用一个测试类或测试方法;类似于JUnit 4的@Ignore 。该注解不能被继承。 |
@ExtendWith | 用于注册自定义 扩展。该注解不能被继承。 |
@BeforeClass | 针对所有测试,只执行一次,且必须为static void |
@AfterClass | 针对所有测试,只执行一次,且必须为static void |
@RunWith | 指定测试类使用某个运行器 |
@Parameters | 指定测试类的测试数据集合 |
@Rule | 允许灵活添加或重新定义测试类中的每个测试方法的行为 |
@FixMethodOrder | 指定测试方法的执行顺序 |
示例
package test;
import static org.junit.Assert.*;
import org.junit.*;
public class JDemoTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("in BeforeClass================");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("in AfterClass=================");
}
@Before
public void before() {
System.out.println("in Before");
}
@After
public void after() {
System.out.println("in After");
}
@Test(timeout = 10000)
public void testadd() {
JDemo a = new JDemo();
assertEquals(6, a.add(3, 3));
System.out.println("in Test ----Add");
}
@Test
public void testdivision() {
JDemo a = new JDemo();
assertEquals(3, a.division(6, 2));
System.out.println("in Test ----Division");
}
@Ignore
@Test
public void test_ignore() {
JDemo a = new JDemo();
assertEquals(6, a.add(1, 5));
System.out.println("in test_ignore");
}
@Test
public void teest_fail() {
fail();
}
}
class JDemo extends Thread {
int result;
public int add(int a, int b) {
try {
sleep(1000);
result = a + b;
} catch (InterruptedException e) {
}
return result;
}
public int division(int a, int b) {
return result = a / b;
}
}
输出结果
in BeforeClass================
in Before
in Test ----Add
in After
in Before
in Test ----Division
in After
in AfterClass=================
常用测试实例
参数化测试
打包测试
异常测试
限时测试
Spring测试套件
参考文献
http://sjyuan.cc/junit5/user-guide-cn/#31-注解 —JUnit5用户指南
https://my.csdn.net/wangpeng047 —JUnit使用教程
https://www.jianshu.com/p/91fd39417af9 —断言
https://blog.csdn.net/Zen99T/article/details/50603847 —测试方法
https://blog.csdn.net/Zen99T/article/list/3 —JUnit使用教程