JUnit

定义

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使用教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值