基本的注解都是方法上的注解,意思就是只在测试方法上进行添加,对应注解有以下几种:
| 注解 | 说明 |
|---|---|
@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;}}//平均值 averagepublic 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());@Testvoid 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);}@Testvoid 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);}@Testvoid 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- 断言失败的时候显示说明
@Testvoid 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");;@BeforeEachvoid beforeEach() {mySUT.initId();}@Testvoid addTest1(){logger.info("Begin Add Test");//加法运算int sum = mySUT.sum(5, 8);//所有的统称为运算结果logger.info("Operation result:{}",sum);// expected:期望值, actual:运算的实际值assertEquals(13,sum);}@Testvoid 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);}@Testvoid 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"));}@Testvoid 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 Calculator2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:3b732a76-19e2-4a60-8a34-2b97958948752022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-32022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:69ec586b-6346-4940-8ff9-e061566929752022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result:132022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:0f484eab-7790-473e-a7ba-998ca3a84c5d2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result:12022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:a62e3eff-a172-403b-a4b2-bae6fb4b16f22022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test2022-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");@BeforeEachvoid beforeEach() {mySUT.initId();}@Testvoid addTest1(){logger.info("Begin Add Test");//加法运算int sum = mySUT.sum(5, 8);//所有的统称为运算结果logger.info("Operation result:{}",sum);// expected:期望值, actual:运算的实际值assertEquals(13,sum);}@Testvoid 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);}@Testvoid 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"));}@Testvoid subtractTest1(){logger.info("Begin Subtract Test");//减法运算int subtract = mySUT.subtract(5, 8);logger.info("Operation result:{}",subtract);// expected:期望值, actual:运算的实际值assertEquals(-3,subtract);}@AfterEachvoid afterEach() {mySUT.destroyId();}}
结果显示:
2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:cbc27682-5e33-428c-af48-defa925b657d2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-32022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: cbc27682-5e33-428c-af48-defa925b657d2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:b9f6d56e-ee62-45e8-b6d9-d496975191d02022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result:132022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: b9f6d56e-ee62-45e8-b6d9-d496975191d02022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:bdea4c25-260b-4d40-b9b0-9b49a8887c372022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result:12022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: bdea4c25-260b-4d40-b9b0-9b49a8887c372022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:f81b4ace-02cf-48c2-b590-2ddcbca258232022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test2022-02-09 14:08:50 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: f81b4ace-02cf-48c2-b590-2ddcbca25823
- 每次计算完都释放ID
@BeforeAll
MySUT mySUT ;@BeforeAllvoid 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 ;@BeforeAllstatic void beforeAll() {mySUT = new MySUT("Calculator");}@BeforeEachvoid beforeEach() {mySUT.initId();}@Testvoid addTest1(){logger.info("Begin Add Test");//加法运算int sum = mySUT.sum(5, 8);//所有的统称为运算结果logger.info("Operation result:{}",sum);// expected:期望值, actual:运算的实际值assertEquals(13,sum);}@Testvoid 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);}@Testvoid 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"));}@Testvoid subtractTest1(){logger.info("Begin Subtract Test");//减法运算int subtract = mySUT.subtract(5, 8);logger.info("Operation result:{}",subtract);// expected:期望值, actual:运算的实际值assertEquals(-3,subtract);}@AfterEachvoid afterEach() {mySUT.destroyId();}}
运行测试类,对应运行结果:
2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:c48f445b-b9ce-4a1a-a16c-b9bc2aad19c22022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-32022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: c48f445b-b9ce-4a1a-a16c-b9bc2aad19c22022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:48eb878b-60fa-43b6-b784-09ffc7f9f9b52022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result:132022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 48eb878b-60fa-43b6-b784-09ffc7f9f9b52022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:d4e7e3d8-7e38-45dd-a7e0-dfc5aa06e9aa2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result:12022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: d4e7e3d8-7e38-45dd-a7e0-dfc5aa06e9aa2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:720da8cb-07a1-4a36-9719-fe42af594b482022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test2022-02-09 14:11:01 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 720da8cb-07a1-4a36-9719-fe42af594b48
- 结果显示不变
@AfterAll
@AfterAllvoid 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 ;@BeforeAllstatic void beforeAll() {mySUT = new MySUT("Calculator");}@BeforeEachvoid beforeEach() {mySUT.initId();}@Testvoid addTest1(){logger.info("Begin Add Test");//加法运算int sum = mySUT.sum(5, 8);//所有的统称为运算结果logger.info("Operation result:{}",sum);// expected:期望值, actual:运算的实际值assertEquals(13,sum);}@Testvoid 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);}@Testvoid 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"));}@Testvoid subtractTest1(){logger.info("Begin Subtract Test");//减法运算int subtract = mySUT.subtract(5, 8);logger.info("Operation result:{}",subtract);// expected:期望值, actual:运算的实际值assertEquals(-3,subtract);}@AfterEachvoid afterEach() {mySUT.destroyId();}@AfterAllstatic void afterAll() {mySUT.close();}}
运行测试类,对应运行结果:
2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:e0e5a64c-b66f-4f4b-b9d6-5e730f2c91732022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-32022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: e0e5a64c-b66f-4f4b-b9d6-5e730f2c91732022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:4209abe8-4026-4119-a614-79f700abffa62022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result:132022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 4209abe8-4026-4119-a614-79f700abffa62022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:ab4a1da0-2b86-4f92-8b03-d93cfce00e192022-02-09 14:12:10 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result:12022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: ab4a1da0-2b86-4f92-8b03-d93cfce00e192022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID:bdd4b59d-83cb-4f58-8c37-3688ae228b482022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test2022-02-09 14:12:10 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: bdd4b59d-83cb-4f58-8c37-3688ae228b482022-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 ;@BeforeAllstatic void beforeAll() {mySUT = new MySUT("Calculator");}@BeforeEachvoid beforeEach() {mySUT.initId();}@AfterEachvoid afterEach() {mySUT.destroyId();}@AfterAllstatic 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 {@Testvoid addTest1(){logger.info("Begin Add Test");//加法运算int sum = mySUT.sum(5, 8);logger.info("Addition result:{}",sum);// expected:期望值, actual:运算的实际值assertEquals(13,sum);}@Testvoid 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);}@Testvoid 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"));}@Testvoid subtractTest1(){logger.info("Begin Subtract Test");//减法运算int subtract = mySUT.subtract(5, 8);logger.info("Operation result:{}",subtract);// expected:期望值, actual:运算的实际值assertEquals(-3,subtract);}@Testvoid 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);}@Testvoid csTest1(){logger.info("Begin ConcatStr Test");//字符串拼接String concatStr = mySUT.concatStr("Hello","Junit5");logger.info("Operation result:{}",concatStr);// expected:期望值, actual:运算的实际值assertEquals("Hello Junit5",concatStr);}@Testvoid 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
