基本的注解都是方法上的注解,意思就是只在测试方法上进行添加,对应注解有以下几种:
注解 | 说明 |
---|---|
@Test |
测试方法的入口;可单独运行 |
@BeforeEach |
每个测试方法前运行;不可以单独运行该方法 |
@AfterEach |
每个测试方法后运行;不可以单独运行该方法 |
@BeforeAll |
在类中所有方法前运行;static修饰;不可单独运行该方法 |
@AfterAll |
在类中所有方法后运行;static修饰;不可单独运行该方法 |
对应业务代码如下:
package top.testeru;
import org.slf4j.Logger;
import java.util.Arrays;
import java.util.UUID;
import java.util.stream.IntStream;
import static java.lang.invoke.MethodHandles.lookup;
import static org.slf4j.LoggerFactory.getLogger;
/**
* @program: tutorials
* @author: testeru.top
* @description: 我的被测系统软件
* @Version 1.0
* @create: 2022/1/17 4:58 下午
*/
public class MySUT {
//获得具有所需名称的记录器
static final Logger logger = getLogger(lookup().lookupClass());
//用例名
String name;
//唯一ID标识
String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public MySUT(String name) {
this.name = name;
logger.info("Open {} ", name);
}
public void initId(){
id = UUID.randomUUID().toString();
logger.info("Generate ID:{} ", id);
}
public void destroyId() {
if (id == null) {
throw new IllegalArgumentException(name + " 没有初始化对应ID");
}
logger.info("Release ID: {} ", id);
id = null;
}
public void close() {
logger.info("Close {} ", name);
}
//连续添加
public int sum(int... numbers) {
if(Arrays.stream(numbers).anyMatch(u -> u > 99) | Arrays.stream(numbers).anyMatch(u -> u < -99)){
// 请输入范围内的整数
logger.warn("Please enter an integer in the range");
throw new IllegalArgumentException("Please enter an integer in the range!");
}else {
return IntStream.of(numbers).sum();
}
}
//从100进行减法
public int subtract(int... numbers) {
if(Arrays.stream(numbers).anyMatch(u -> u > 99) | Arrays.stream(numbers).anyMatch(u -> u < -99)){
logger.warn("请输入范围内的整数");
throw new IllegalArgumentException("请输入范围内的整数!");
}else {
return IntStream.of(numbers).reduce(100, (a, b) -> a-b);
}
}
public int subtract(int x,int y) {
if(x>99 | x<-99 | y>99 | y<-99){
logger.warn("请输入范围内的整数");
throw new IllegalArgumentException("请输入范围内的整数!");
}else {
return x-y;
}
}
//平均值 average
public double average(int... numbers) {
if(Arrays.stream(numbers).anyMatch(u -> u > 99) | Arrays.stream(numbers).anyMatch(u -> u < -99)){
logger.warn("请输入范围内的整数");
throw new IllegalArgumentException("请输入范围内的整数!");
}else {
return IntStream.of(numbers).average().getAsDouble();
}
}
//连续拼接
public String concatStr(String... words) {
return String.join(" ", words);
}
}
@Test
我们首先来看第一个注解,是Test
注解。这个注解放在方法上,对应的方法就称为测试方法。并且该测试方法可以直接运行,在Idea中可以看到添加完@Test
注解后,对应的左边出现了可运行的绿色按钮,点击该按钮就可运行对应的方法。
我们可以把它看作一个类似Java中main
方法的入口,但是又和main方法有区别,对应的一个Java类中只能有一个main方法,但是@Test
注解可以在一个Java类中有多个。
同样由于对应的和main方法类似,都是没有返回值「void」的方法。
总结以上内容就是如下四点:
- 可直接运行
- 一个类里可以有多个
- 类似main方法入口
- @Test注解的方法没有返回值,
void
assertEquals
在这里我们首先要简单介绍一个junit5自带的一个基本断言,就是assertEquals
。该断言只是判断传入的期望值和实际值是否完全一样,如果不一样,则报错,如果message有内容,报错就是message的描述信息。
assertEquals(expected, actual,message)
里面最少是2个参数,一个自己的期望值「expected
」,一个程序的实际值「 actual
」。如果想要断言失败的情况下显示自定义的说明,则加上第3个参数,即断言失败说明「message
」。
assertEquals(expected, actual,message)
- 断言「判断」预期的内容和实际的内容是否相等
expected
- 期望值
actual
- 代码业务逻辑的实际值
message
- 断言失败的时候显示说明
代码块
package top.testeru.basic;
import top.testeru.MySUT;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import static java.lang.invoke.MethodHandles.lookup;
import static org.junit.jupiter.api.Assertions.*;
import static org.slf4j.LoggerFactory.getLogger;
/**
* @program: tutorials
* @author: testeru.top
* @description: 基本注解「方法注解」测试
* 加法测试用例「正常、边界值、超出边界值」
* @Version 1.0
* @create: 2022/1/17 5:01 下午
*/
public class BasicAnnotation1sTest {
static final Logger logger = getLogger(lookup().lookupClass());
@Test
void addTest1(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(5, 8);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(13,sum);
}
@Test
void addTest2(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(99, -98);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(1,sum);
}
@Test
void addTest3(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(100, -98);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(0,sum);
}
}
这个时候发现,对应的超出边界值不能进行断言校验,甚至是相关的业务逻辑都无法进行,那我们应该怎么办呢?
这个时候我们就需要用到下面的assertThrows来处理代码抛出异常的断言:
assertThrows
assertThrows
去判断代码抛出的异常是业务代码自定义的异常不,对应的期望值变成了异常类型「Class<T>
」的期望值,实际的值也是抛出异常的实际值「Executable
」,同样如果想要断言失败的情况下显示自定义的说明,则加上第3个参数,即断言失败说明「message
」。
assertThrows(Class<T> expectedType, Executable executable, String message)
- 断言提供的业务逻辑的执行是否会引发预期类型的异常并返回异常对象。
expectedType
- 报错的类型的类
executable
- 执行的业务流
message
- 断言失败的时候显示说明
@Test
void addTest3(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
/*
//加法运算
int sum = mySUT.sum(100, -98); logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(0,sum); */ Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () ->
mySUT.sum(100, -98));
assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
}
@BeforeEach
这个注解同样也是放在方法上,对应的也是一个没有返回值「void」的方法,和Test注解不同的是,在方法上添加了该注解可以看到对应idea左边没有运行的按钮,说明这个注解对应的方法是不可以单独的运行。
既然这个注解对应的方法不能单独运行,那对应的应该在什么时候运行呢?
该注解的方法其实是在每个@Test
注解方法前面运行。既然知道了什么时候运行,那这个注解有什么作用呢?一般什么情况下我们才会用到这个注解呢?
这个主要就是看大家的业务需求了,比如我们目前这个测试系统,那我可以把生成ID放在每个测试方法之前进行生成, 这个是一个重复的代码,那我们就可以把它提取到@BeforeEach
这个注解对应的方法内去运行,以减少我们的重复代码量。
总结
总结为以下三点:
- 不可单独运行,需要运行测试类/方法
- 在每一个test()前运行
- @BeforeEach注解的方法没有返回值,
void
示例
对应示例代码:
package top.testeru.basic;
import top.testeru.MySUT;
import org.junit.jupiter.api.*;
import org.slf4j.Logger;
import static java.lang.invoke.MethodHandles.lookup;
import static org.junit.jupiter.api.Assertions.*;
import static org.slf4j.LoggerFactory.getLogger;
/**
* @program: tutorials
* @author: testeru.top
* @description: 基本注解「方法注解」测试
* 加法测试用例「正常、边界值、超出边界值」
* 减法测试用例「正常」
* @Version 1.0
* @create: 2022/1/17 5:01 下午
*/
public class BasicAnnotation2Test {
static final Logger logger = getLogger(lookup().lookupClass());
MySUT mySUT = new MySUT("Calculator");;
@BeforeEach
void beforeEach() {
mySUT.initId();
}
@Test
void addTest1(){
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(5, 8);
//所有的统称为运算结果
logger.info("Operation result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(13,sum);
}
@Test
void addTest2(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(99, -98);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(1,sum);
}
@Test
void addTest3(){
logger.info("Begin Add Test");
//超过边界值的加法运算
Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
// expected:期望值, actual:运算的实际值
assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
}
@Test
void subtractTest1(){
logger.info("Begin Subtract Test");
//减法运算
int subtract = mySUT.subtract(5, 8);
logger.info("Operation result:{}",subtract);
// expected:期望值, actual:运算的实际值
assertEquals(-3,subtract);
}
}
结果显示:
2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:3b732a76-19e2-4a60-8a34-2b9795894875
2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test
2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-3
2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:69ec586b-6346-4940-8ff9-e06156692975
2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test
2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result:13
2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:0f484eab-7790-473e-a7ba-998ca3a84c5d
2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test
2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result:1
2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:a62e3eff-a172-403b-a4b2-bae6fb4b16f2
2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test
2022-02-09 14:04:22 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range
@AfterEach
- 不可单独运行,需要运行测试类/方法
- 在每一个test()后运行
- @AfterEach注解的方法没有返回值,
void
package top.testeru.basic;
import top.testeru.MySUT;
import org.junit.jupiter.api.*;
import org.slf4j.Logger;
import static java.lang.invoke.MethodHandles.lookup;
import static org.junit.jupiter.api.Assertions.*;
import static org.slf4j.LoggerFactory.getLogger;
/**
* @program: tutorials
* @author: testeru.top
* @description: 基本注解「方法注解」测试
* 加法测试用例「正常、边界值、超出边界值」
* 减法测试用例「正常」
* @Version 1.0
* @create: 2022/1/17 5:01 下午
*/
public class BasicAnnotation2Test {
static final Logger logger = getLogger(lookup().lookupClass());
MySUT mySUT = new MySUT("Calculator");
@BeforeEach
void beforeEach() {
mySUT.initId();
}
@Test
void addTest1(){
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(5, 8);
//所有的统称为运算结果
logger.info("Operation result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(13,sum);
}
@Test
void addTest2(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(99, -98);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(1,sum);
}
@Test
void addTest3(){
logger.info("Begin Add Test");
//超过边界值的加法运算
Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
// expected:期望值, actual:运算的实际值
assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
}
@Test
void subtractTest1(){
logger.info("Begin Subtract Test");
//减法运算
int subtract = mySUT.subtract(5, 8);
logger.info("Operation result:{}",subtract);
// expected:期望值, actual:运算的实际值
assertEquals(-3,subtract);
}
@AfterEach
void afterEach() {
mySUT.destroyId();
}
}
结果显示:
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:cbc27682-5e33-428c-af48-defa925b657d
2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test
2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-3
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: cbc27682-5e33-428c-af48-defa925b657d
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:b9f6d56e-ee62-45e8-b6d9-d496975191d0
2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test
2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result:13
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: b9f6d56e-ee62-45e8-b6d9-d496975191d0
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:bdea4c25-260b-4d40-b9b0-9b49a8887c37
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test
2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result:1
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: bdea4c25-260b-4d40-b9b0-9b49a8887c37
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:f81b4ace-02cf-48c2-b590-2ddcbca25823
2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test
2022-02-09 14:08:50 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: f81b4ace-02cf-48c2-b590-2ddcbca25823
- 每次计算完都释放ID
@BeforeAll
MySUT mySUT ;
@BeforeAll
void beforeAll() {
mySUT = new MySUT("计算器");
}
报错信息:
org.junit.platform.commons.JUnitException: @BeforeAll method 'void com.testeru.base.BasicAnnotation2Test.beforeAll()' must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).
- 对应@BeforeAll需要static关键字修饰
- 不可单独运行,需要运行测试类/方法
- 在所有的方法前运行,包含BeforeEach
- @BeforeAll注解的方法没有返回值,
void
package top.testeru.basic;
import top.testeru.MySUT;
import org.junit.jupiter.api.*;
import org.slf4j.Logger;
import static java.lang.invoke.MethodHandles.lookup;
import static org.junit.jupiter.api.Assertions.*;
import static org.slf4j.LoggerFactory.getLogger;
/**
* @program: tutorials
* @author: testeru.top
* @description: 基本注解「方法注解」测试
* 加法测试用例「正常、边界值、超出边界值」
* 减法测试用例「正常」
* @Version 1.0
* @create: 2022/1/17 5:01 下午
*/
public class BasicAnnotation2Test {
static final Logger logger = getLogger(lookup().lookupClass());
static MySUT mySUT ;
@BeforeAll
static void beforeAll() {
mySUT = new MySUT("Calculator");
}
@BeforeEach
void beforeEach() {
mySUT.initId();
}
@Test
void addTest1(){
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(5, 8);
//所有的统称为运算结果
logger.info("Operation result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(13,sum);
}
@Test
void addTest2(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(99, -98);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(1,sum);
}
@Test
void addTest3(){
logger.info("Begin Add Test");
//超过边界值的加法运算
Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
// expected:期望值, actual:运算的实际值
assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
}
@Test
void subtractTest1(){
logger.info("Begin Subtract Test");
//减法运算
int subtract = mySUT.subtract(5, 8);
logger.info("Operation result:{}",subtract);
// expected:期望值, actual:运算的实际值
assertEquals(-3,subtract);
}
@AfterEach
void afterEach() {
mySUT.destroyId();
}
}
运行测试类,对应运行结果:
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:c48f445b-b9ce-4a1a-a16c-b9bc2aad19c2
2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test
2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-3
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: c48f445b-b9ce-4a1a-a16c-b9bc2aad19c2
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:48eb878b-60fa-43b6-b784-09ffc7f9f9b5
2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test
2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result:13
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 48eb878b-60fa-43b6-b784-09ffc7f9f9b5
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:d4e7e3d8-7e38-45dd-a7e0-dfc5aa06e9aa
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test
2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result:1
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: d4e7e3d8-7e38-45dd-a7e0-dfc5aa06e9aa
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:720da8cb-07a1-4a36-9719-fe42af594b48
2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test
2022-02-09 14:11:01 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 720da8cb-07a1-4a36-9719-fe42af594b48
- 结果显示不变
@AfterAll
@AfterAll
void afterAll() {
mySUT.close();
}
报错信息:
org.junit.platform.commons.JUnitException: @AfterAll method 'void com.testeru.base.BasicAnnotation2Test.afterAll()' must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).
- 对应@AfterAll需要static关键字修饰
- 不可单独运行,需要运行测试类/方法
- 在所有的方法后运行,包含AfterEach
- @AfterAll注解的方法没有返回值,
void
package top.testeru.basic;
import top.testeru.MySUT;
import org.junit.jupiter.api.*;
import org.slf4j.Logger;
import static java.lang.invoke.MethodHandles.lookup;
import static org.junit.jupiter.api.Assertions.*;
import static org.slf4j.LoggerFactory.getLogger;
/**
* @program: tutorials
* @author: testeru.top
* @description: 基本注解「方法注解」测试
* 加法测试用例「正常、边界值、超出边界值」
* 减法测试用例「正常」
* @Version 1.0
* @create: 2022/1/17 5:01 下午
*/
public class BasicAnnotation2Test {
static final Logger logger = getLogger(lookup().lookupClass());
static MySUT mySUT ;
@BeforeAll
static void beforeAll() {
mySUT = new MySUT("Calculator");
}
@BeforeEach
void beforeEach() {
mySUT.initId();
}
@Test
void addTest1(){
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(5, 8);
//所有的统称为运算结果
logger.info("Operation result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(13,sum);
}
@Test
void addTest2(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(99, -98);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(1,sum);
}
@Test
void addTest3(){
logger.info("Begin Add Test");
//超过边界值的加法运算
Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
// expected:期望值, actual:运算的实际值
assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
}
@Test
void subtractTest1(){
logger.info("Begin Subtract Test");
//减法运算
int subtract = mySUT.subtract(5, 8);
logger.info("Operation result:{}",subtract);
// expected:期望值, actual:运算的实际值
assertEquals(-3,subtract);
}
@AfterEach
void afterEach() {
mySUT.destroyId();
}
@AfterAll
static void afterAll() {
mySUT.close();
}
}
运行测试类,对应运行结果:
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:e0e5a64c-b66f-4f4b-b9d6-5e730f2c9173
2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test
2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-3
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: e0e5a64c-b66f-4f4b-b9d6-5e730f2c9173
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:4209abe8-4026-4119-a614-79f700abffa6
2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test
2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result:13
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 4209abe8-4026-4119-a614-79f700abffa6
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:ab4a1da0-2b86-4f92-8b03-d93cfce00e19
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test
2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result:1
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: ab4a1da0-2b86-4f92-8b03-d93cfce00e19
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:bdd4b59d-83cb-4f58-8c37-3688ae228b48
2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test
2022-02-09 14:12:10 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: bdd4b59d-83cb-4f58-8c37-3688ae228b48
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.close(66) -- Close Calculator
项目编写规则
- 对应前置操作放在基础BaseTest测试类中
- 对应业务逻辑测试代码在业务测试类中
BaseTest
package top.testeru.util;
import top.testeru.MySUT;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.slf4j.Logger;
import static java.lang.invoke.MethodHandles.lookup;
import static org.slf4j.LoggerFactory.getLogger;
/**
* @program: tutorials
* @author: testeru.top
* @description: 基本测试类
* @Version 1.0
* @create: 2022/1/17 5:29 下午
*/
public class BaseTest {
public static final Logger logger = getLogger(lookup().lookupClass());
public void get(){
//获取当前类名
String name = new Exception().getStackTrace()[1].getClassName(); //获取调用者的类名
//获取调用者的方法名
String methodName = new Exception().getStackTrace()[1].getMethodName();
System.out.println(name+":"+methodName);
}
public static MySUT mySUT ;
@BeforeAll
static void beforeAll() {
mySUT = new MySUT("Calculator");
}
@BeforeEach
void beforeEach() {
mySUT.initId();
}
@AfterEach
void afterEach() {
mySUT.destroyId();
}
@AfterAll
static void afterAll() {
mySUT.close();
}
}
业务逻辑代码
package top.testeru.basic;
import org.junit.jupiter.api.Test;
import top.testeru.util.BaseTest;
import top.testeru.MySUT;
import static org.junit.jupiter.api.Assertions.*;
/**
* @program: tutorials
* @author: testeru.top
* @description: 基本注解「方法注解」测试
* 加法测试用例「正常、边界值、超出边界值」
* 减法测试用例「2数相减、100连续减、」
* 字符串拼接
* 平均值
* @Version 1.0
* @create: 2022/1/17 5:01 下午
*/
public class BasicAnnotation3sTest extends BaseTest {
@Test
void addTest1(){
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(5, 8);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(13,sum);
}
@Test
void addTest2(){
MySUT mySUT = new MySUT("Calculator");
logger.info("Begin Add Test");
//加法运算
int sum = mySUT.sum(99, -98);
logger.info("Addition result:{}",sum);
// expected:期望值, actual:运算的实际值
assertEquals(1,sum);
}
@Test
void addTest3(){
logger.info("Begin Add Test");
//超过边界值的加法运算
Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
// expected:期望值, actual:运算的实际值
assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
}
@Test
void subtractTest1(){
logger.info("Begin Subtract Test");
//减法运算
int subtract = mySUT.subtract(5, 8);
logger.info("Operation result:{}",subtract);
// expected:期望值, actual:运算的实际值
assertEquals(-3,subtract);
}
@Test
void subtractTest2(){
logger.info("Begin Continuous Subtract Test");
//100连续减
int subtract = mySUT.subtract(50,30,10,60);
logger.info("Operation result:{}",subtract);
// expected:期望值, actual:运算的实际值
assertEquals(-50,subtract);
}
@Test
void csTest1(){
logger.info("Begin ConcatStr Test");
//字符串拼接
String concatStr = mySUT.concatStr("Hello","Junit5");
logger.info("Operation result:{}",concatStr);
// expected:期望值, actual:运算的实际值
assertEquals("Hello Junit5",concatStr);
}
@Test
void avTest1(){
logger.info("Begin Average Test");
//平均值
double average = mySUT.average(55,44,86,72,64);
logger.info("Operation result:{}",average);
// expected:期望值, actual:运算的实际值
assertEquals(64.2,average);
}
}
运行顺序
- 如果在业务逻辑测试类和Base测试类中都有
@BeforeAll
,@BeforeEach
,@AfterEach
,@AfterAll
- 对应执行顺序???
结论:
- B 继承 A
- before开头的顺序都是A-B
- after开头的顺序都是B-A