基本的注解都是方法上的注解,意思就是只在测试方法上进行添加,对应注解有以下几种:

注解 说明
@Test 测试方法的入口;可单独运行
@BeforeEach 每个测试方法前运行;不可以单独运行该方法
@AfterEach 每个测试方法后运行;不可以单独运行该方法
@BeforeAll 在类中所有方法前运行;static修饰;不可单独运行该方法
@AfterAll 在类中所有方法后运行;static修饰;不可单独运行该方法

对应业务代码如下:

  1. package top.testeru;
  2. import org.slf4j.Logger;
  3. import java.util.Arrays;
  4. import java.util.UUID;
  5. import java.util.stream.IntStream;
  6. import static java.lang.invoke.MethodHandles.lookup;
  7. import static org.slf4j.LoggerFactory.getLogger;
  8. /**
  9. * @program: tutorials
  10. * @author: testeru.top
  11. * @description: 我的被测系统软件
  12. * @Version 1.0
  13. * @create: 2022/1/17 4:58 下午
  14. */
  15. public class MySUT {
  16. //获得具有所需名称的记录器
  17. static final Logger logger = getLogger(lookup().lookupClass());
  18. //用例名
  19. String name;
  20. //唯一ID标识
  21. String id;
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public String getId() {
  29. return id;
  30. }
  31. public void setId(String id) {
  32. this.id = id;
  33. }
  34. public MySUT(String name) {
  35. this.name = name;
  36. logger.info("Open {} ", name);
  37. }
  38. public void initId(){
  39. id = UUID.randomUUID().toString();
  40. logger.info("Generate ID:{} ", id);
  41. }
  42. public void destroyId() {
  43. if (id == null) {
  44. throw new IllegalArgumentException(name + " 没有初始化对应ID");
  45. }
  46. logger.info("Release ID: {} ", id);
  47. id = null;
  48. }
  49. public void close() {
  50. logger.info("Close {} ", name);
  51. }
  52. //连续添加
  53. public int sum(int... numbers) {
  54. if(Arrays.stream(numbers).anyMatch(u -> u > 99) | Arrays.stream(numbers).anyMatch(u -> u < -99)){
  55. // 请输入范围内的整数
  56. logger.warn("Please enter an integer in the range");
  57. throw new IllegalArgumentException("Please enter an integer in the range!");
  58. }else {
  59. return IntStream.of(numbers).sum();
  60. }
  61. }
  62. //从100进行减法
  63. public int subtract(int... numbers) {
  64. if(Arrays.stream(numbers).anyMatch(u -> u > 99) | Arrays.stream(numbers).anyMatch(u -> u < -99)){
  65. logger.warn("请输入范围内的整数");
  66. throw new IllegalArgumentException("请输入范围内的整数!");
  67. }else {
  68. return IntStream.of(numbers).reduce(100, (a, b) -> a-b);
  69. }
  70. }
  71. public int subtract(int x,int y) {
  72. if(x>99 | x<-99 | y>99 | y<-99){
  73. logger.warn("请输入范围内的整数");
  74. throw new IllegalArgumentException("请输入范围内的整数!");
  75. }else {
  76. return x-y;
  77. }
  78. }
  79. //平均值 average
  80. public double average(int... numbers) {
  81. if(Arrays.stream(numbers).anyMatch(u -> u > 99) | Arrays.stream(numbers).anyMatch(u -> u < -99)){
  82. logger.warn("请输入范围内的整数");
  83. throw new IllegalArgumentException("请输入范围内的整数!");
  84. }else {
  85. return IntStream.of(numbers).average().getAsDouble();
  86. }
  87. }
  88. //连续拼接
  89. public String concatStr(String... words) {
  90. return String.join(" ", words);
  91. }
  92. }

@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
      • 断言失败的时候显示说明

代码块

  1. package top.testeru.basic;
  2. import top.testeru.MySUT;
  3. import org.junit.jupiter.api.Test;
  4. import org.slf4j.Logger;
  5. import static java.lang.invoke.MethodHandles.lookup;
  6. import static org.junit.jupiter.api.Assertions.*;
  7. import static org.slf4j.LoggerFactory.getLogger;
  8. /**
  9. * @program: tutorials
  10. * @author: testeru.top
  11. * @description: 基本注解「方法注解」测试
  12. * 加法测试用例「正常、边界值、超出边界值」
  13. * @Version 1.0
  14. * @create: 2022/1/17 5:01 下午
  15. */
  16. public class BasicAnnotation1sTest {
  17. static final Logger logger = getLogger(lookup().lookupClass());
  18. @Test
  19. void addTest1(){
  20. MySUT mySUT = new MySUT("Calculator");
  21. logger.info("Begin Add Test");
  22. //加法运算
  23. int sum = mySUT.sum(5, 8);
  24. logger.info("Addition result:{}",sum);
  25. // expected:期望值, actual:运算的实际值
  26. assertEquals(13,sum);
  27. }
  28. @Test
  29. void addTest2(){
  30. MySUT mySUT = new MySUT("Calculator");
  31. logger.info("Begin Add Test");
  32. //加法运算
  33. int sum = mySUT.sum(99, -98);
  34. logger.info("Addition result:{}",sum);
  35. // expected:期望值, actual:运算的实际值
  36. assertEquals(1,sum);
  37. }
  38. @Test
  39. void addTest3(){
  40. MySUT mySUT = new MySUT("Calculator");
  41. logger.info("Begin Add Test");
  42. //加法运算
  43. int sum = mySUT.sum(100, -98);
  44. logger.info("Addition result:{}",sum);
  45. // expected:期望值, actual:运算的实际值
  46. assertEquals(0,sum);
  47. }
  48. }

一」基本的注解、断言 - 图1

这个时候发现,对应的超出边界值不能进行断言校验,甚至是相关的业务逻辑都无法进行,那我们应该怎么办呢?

这个时候我们就需要用到下面的assertThrows来处理代码抛出异常的断言:

assertThrows

assertThrows去判断代码抛出的异常是业务代码自定义的异常不,对应的期望值变成了异常类型「Class<T>」的期望值,实际的值也是抛出异常的实际值「Executable」,同样如果想要断言失败的情况下显示自定义的说明,则加上第3个参数,即断言失败说明「message」。

  • assertThrows(Class<T> expectedType, Executable executable, String message)
  • 断言提供的业务逻辑的执行是否会引发预期类型的异常并返回异常对象。
    • expectedType
      • 报错的类型的类
    • executable
      • 执行的业务流
    • message
      • 断言失败的时候显示说明
  1. @Test
  2. void addTest3(){
  3. MySUT mySUT = new MySUT("Calculator");
  4. logger.info("Begin Add Test");
  5. /*
  6. //加法运算
  7. int sum = mySUT.sum(100, -98); logger.info("Addition result:{}",sum);
  8. // expected:期望值, actual:运算的实际值
  9. assertEquals(0,sum); */ Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () ->
  10. mySUT.sum(100, -98));
  11. assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
  12. }

一」基本的注解、断言 - 图2

@BeforeEach

这个注解同样也是放在方法上,对应的也是一个没有返回值「void」的方法,和Test注解不同的是,在方法上添加了该注解可以看到对应idea左边没有运行的按钮,说明这个注解对应的方法是不可以单独的运行。

既然这个注解对应的方法不能单独运行,那对应的应该在什么时候运行呢?
该注解的方法其实是在每个@Test注解方法前面运行。既然知道了什么时候运行,那这个注解有什么作用呢?一般什么情况下我们才会用到这个注解呢?

这个主要就是看大家的业务需求了,比如我们目前这个测试系统,那我可以把生成ID放在每个测试方法之前进行生成, 这个是一个重复的代码,那我们就可以把它提取到@BeforeEach这个注解对应的方法内去运行,以减少我们的重复代码量。

总结

总结为以下三点:

  • 不可单独运行,需要运行测试类/方法
  • 在每一个test()前运行
  • @BeforeEach注解的方法没有返回值,void

示例

对应示例代码:

  1. package top.testeru.basic;
  2. import top.testeru.MySUT;
  3. import org.junit.jupiter.api.*;
  4. import org.slf4j.Logger;
  5. import static java.lang.invoke.MethodHandles.lookup;
  6. import static org.junit.jupiter.api.Assertions.*;
  7. import static org.slf4j.LoggerFactory.getLogger;
  8. /**
  9. * @program: tutorials
  10. * @author: testeru.top
  11. * @description: 基本注解「方法注解」测试
  12. * 加法测试用例「正常、边界值、超出边界值」
  13. * 减法测试用例「正常」
  14. * @Version 1.0
  15. * @create: 2022/1/17 5:01 下午
  16. */
  17. public class BasicAnnotation2Test {
  18. static final Logger logger = getLogger(lookup().lookupClass());
  19. MySUT mySUT = new MySUT("Calculator");;
  20. @BeforeEach
  21. void beforeEach() {
  22. mySUT.initId();
  23. }
  24. @Test
  25. void addTest1(){
  26. logger.info("Begin Add Test");
  27. //加法运算
  28. int sum = mySUT.sum(5, 8);
  29. //所有的统称为运算结果
  30. logger.info("Operation result:{}",sum);
  31. // expected:期望值, actual:运算的实际值
  32. assertEquals(13,sum);
  33. }
  34. @Test
  35. void addTest2(){
  36. MySUT mySUT = new MySUT("Calculator");
  37. logger.info("Begin Add Test");
  38. //加法运算
  39. int sum = mySUT.sum(99, -98);
  40. logger.info("Addition result:{}",sum);
  41. // expected:期望值, actual:运算的实际值
  42. assertEquals(1,sum);
  43. }
  44. @Test
  45. void addTest3(){
  46. logger.info("Begin Add Test");
  47. //超过边界值的加法运算
  48. Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
  49. // expected:期望值, actual:运算的实际值
  50. assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
  51. }
  52. @Test
  53. void subtractTest1(){
  54. logger.info("Begin Subtract Test");
  55. //减法运算
  56. int subtract = mySUT.subtract(5, 8);
  57. logger.info("Operation result:{}",subtract);
  58. // expected:期望值, actual:运算的实际值
  59. assertEquals(-3,subtract);
  60. }
  61. }

结果显示:

  1. 2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  2. 2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID3b732a76-19e2-4a60-8a34-2b9795894875
  3. 2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test
  4. 2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-3
  5. 2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID69ec586b-6346-4940-8ff9-e06156692975
  6. 2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test
  7. 2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result13
  8. 2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID0f484eab-7790-473e-a7ba-998ca3a84c5d
  9. 2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  10. 2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test
  11. 2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result1
  12. 2022-02-09 14:04:22 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDa62e3eff-a172-403b-a4b2-bae6fb4b16f2
  13. 2022-02-09 14:04:22 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test
  14. 2022-02-09 14:04:22 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range

@AfterEach

  • 不可单独运行,需要运行测试类/方法
  • 在每一个test()后运行
  • @AfterEach注解的方法没有返回值,void
  1. package top.testeru.basic;
  2. import top.testeru.MySUT;
  3. import org.junit.jupiter.api.*;
  4. import org.slf4j.Logger;
  5. import static java.lang.invoke.MethodHandles.lookup;
  6. import static org.junit.jupiter.api.Assertions.*;
  7. import static org.slf4j.LoggerFactory.getLogger;
  8. /**
  9. * @program: tutorials
  10. * @author: testeru.top
  11. * @description: 基本注解「方法注解」测试
  12. * 加法测试用例「正常、边界值、超出边界值」
  13. * 减法测试用例「正常」
  14. * @Version 1.0
  15. * @create: 2022/1/17 5:01 下午
  16. */
  17. public class BasicAnnotation2Test {
  18. static final Logger logger = getLogger(lookup().lookupClass());
  19. MySUT mySUT = new MySUT("Calculator");
  20. @BeforeEach
  21. void beforeEach() {
  22. mySUT.initId();
  23. }
  24. @Test
  25. void addTest1(){
  26. logger.info("Begin Add Test");
  27. //加法运算
  28. int sum = mySUT.sum(5, 8);
  29. //所有的统称为运算结果
  30. logger.info("Operation result:{}",sum);
  31. // expected:期望值, actual:运算的实际值
  32. assertEquals(13,sum);
  33. }
  34. @Test
  35. void addTest2(){
  36. MySUT mySUT = new MySUT("Calculator");
  37. logger.info("Begin Add Test");
  38. //加法运算
  39. int sum = mySUT.sum(99, -98);
  40. logger.info("Addition result:{}",sum);
  41. // expected:期望值, actual:运算的实际值
  42. assertEquals(1,sum);
  43. }
  44. @Test
  45. void addTest3(){
  46. logger.info("Begin Add Test");
  47. //超过边界值的加法运算
  48. Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
  49. // expected:期望值, actual:运算的实际值
  50. assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
  51. }
  52. @Test
  53. void subtractTest1(){
  54. logger.info("Begin Subtract Test");
  55. //减法运算
  56. int subtract = mySUT.subtract(5, 8);
  57. logger.info("Operation result:{}",subtract);
  58. // expected:期望值, actual:运算的实际值
  59. assertEquals(-3,subtract);
  60. }
  61. @AfterEach
  62. void afterEach() {
  63. mySUT.destroyId();
  64. }
  65. }

结果显示:

  1. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  2. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDcbc27682-5e33-428c-af48-defa925b657d
  3. 2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test
  4. 2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-3
  5. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: cbc27682-5e33-428c-af48-defa925b657d
  6. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  7. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDb9f6d56e-ee62-45e8-b6d9-d496975191d0
  8. 2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test
  9. 2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result13
  10. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: b9f6d56e-ee62-45e8-b6d9-d496975191d0
  11. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  12. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDbdea4c25-260b-4d40-b9b0-9b49a8887c37
  13. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  14. 2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test
  15. 2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result1
  16. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: bdea4c25-260b-4d40-b9b0-9b49a8887c37
  17. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  18. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDf81b4ace-02cf-48c2-b590-2ddcbca25823
  19. 2022-02-09 14:08:50 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test
  20. 2022-02-09 14:08:50 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range
  21. 2022-02-09 14:08:50 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: f81b4ace-02cf-48c2-b590-2ddcbca25823
  • 每次计算完都释放ID

@BeforeAll

  1. MySUT mySUT ;
  2. @BeforeAll
  3. void beforeAll() {
  4. mySUT = new MySUT("计算器");
  5. }

报错信息:

  1. 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
  1. package top.testeru.basic;
  2. import top.testeru.MySUT;
  3. import org.junit.jupiter.api.*;
  4. import org.slf4j.Logger;
  5. import static java.lang.invoke.MethodHandles.lookup;
  6. import static org.junit.jupiter.api.Assertions.*;
  7. import static org.slf4j.LoggerFactory.getLogger;
  8. /**
  9. * @program: tutorials
  10. * @author: testeru.top
  11. * @description: 基本注解「方法注解」测试
  12. * 加法测试用例「正常、边界值、超出边界值」
  13. * 减法测试用例「正常」
  14. * @Version 1.0
  15. * @create: 2022/1/17 5:01 下午
  16. */
  17. public class BasicAnnotation2Test {
  18. static final Logger logger = getLogger(lookup().lookupClass());
  19. static MySUT mySUT ;
  20. @BeforeAll
  21. static void beforeAll() {
  22. mySUT = new MySUT("Calculator");
  23. }
  24. @BeforeEach
  25. void beforeEach() {
  26. mySUT.initId();
  27. }
  28. @Test
  29. void addTest1(){
  30. logger.info("Begin Add Test");
  31. //加法运算
  32. int sum = mySUT.sum(5, 8);
  33. //所有的统称为运算结果
  34. logger.info("Operation result:{}",sum);
  35. // expected:期望值, actual:运算的实际值
  36. assertEquals(13,sum);
  37. }
  38. @Test
  39. void addTest2(){
  40. MySUT mySUT = new MySUT("Calculator");
  41. logger.info("Begin Add Test");
  42. //加法运算
  43. int sum = mySUT.sum(99, -98);
  44. logger.info("Addition result:{}",sum);
  45. // expected:期望值, actual:运算的实际值
  46. assertEquals(1,sum);
  47. }
  48. @Test
  49. void addTest3(){
  50. logger.info("Begin Add Test");
  51. //超过边界值的加法运算
  52. Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
  53. // expected:期望值, actual:运算的实际值
  54. assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
  55. }
  56. @Test
  57. void subtractTest1(){
  58. logger.info("Begin Subtract Test");
  59. //减法运算
  60. int subtract = mySUT.subtract(5, 8);
  61. logger.info("Operation result:{}",subtract);
  62. // expected:期望值, actual:运算的实际值
  63. assertEquals(-3,subtract);
  64. }
  65. @AfterEach
  66. void afterEach() {
  67. mySUT.destroyId();
  68. }
  69. }

运行测试类,对应运行结果:

  1. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  2. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDc48f445b-b9ce-4a1a-a16c-b9bc2aad19c2
  3. 2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test
  4. 2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-3
  5. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: c48f445b-b9ce-4a1a-a16c-b9bc2aad19c2
  6. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID48eb878b-60fa-43b6-b784-09ffc7f9f9b5
  7. 2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test
  8. 2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result13
  9. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 48eb878b-60fa-43b6-b784-09ffc7f9f9b5
  10. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDd4e7e3d8-7e38-45dd-a7e0-dfc5aa06e9aa
  11. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  12. 2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test
  13. 2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result1
  14. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: d4e7e3d8-7e38-45dd-a7e0-dfc5aa06e9aa
  15. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID720da8cb-07a1-4a36-9719-fe42af594b48
  16. 2022-02-09 14:11:01 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test
  17. 2022-02-09 14:11:01 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range
  18. 2022-02-09 14:11:01 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 720da8cb-07a1-4a36-9719-fe42af594b48
  • 结果显示不变

@AfterAll

  1. @AfterAll
  2. void afterAll() {
  3. mySUT.close();
  4. }

报错信息:

  1. 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
  1. package top.testeru.basic;
  2. import top.testeru.MySUT;
  3. import org.junit.jupiter.api.*;
  4. import org.slf4j.Logger;
  5. import static java.lang.invoke.MethodHandles.lookup;
  6. import static org.junit.jupiter.api.Assertions.*;
  7. import static org.slf4j.LoggerFactory.getLogger;
  8. /**
  9. * @program: tutorials
  10. * @author: testeru.top
  11. * @description: 基本注解「方法注解」测试
  12. * 加法测试用例「正常、边界值、超出边界值」
  13. * 减法测试用例「正常」
  14. * @Version 1.0
  15. * @create: 2022/1/17 5:01 下午
  16. */
  17. public class BasicAnnotation2Test {
  18. static final Logger logger = getLogger(lookup().lookupClass());
  19. static MySUT mySUT ;
  20. @BeforeAll
  21. static void beforeAll() {
  22. mySUT = new MySUT("Calculator");
  23. }
  24. @BeforeEach
  25. void beforeEach() {
  26. mySUT.initId();
  27. }
  28. @Test
  29. void addTest1(){
  30. logger.info("Begin Add Test");
  31. //加法运算
  32. int sum = mySUT.sum(5, 8);
  33. //所有的统称为运算结果
  34. logger.info("Operation result:{}",sum);
  35. // expected:期望值, actual:运算的实际值
  36. assertEquals(13,sum);
  37. }
  38. @Test
  39. void addTest2(){
  40. MySUT mySUT = new MySUT("Calculator");
  41. logger.info("Begin Add Test");
  42. //加法运算
  43. int sum = mySUT.sum(99, -98);
  44. logger.info("Addition result:{}",sum);
  45. // expected:期望值, actual:运算的实际值
  46. assertEquals(1,sum);
  47. }
  48. @Test
  49. void addTest3(){
  50. logger.info("Begin Add Test");
  51. //超过边界值的加法运算
  52. Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
  53. // expected:期望值, actual:运算的实际值
  54. assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
  55. }
  56. @Test
  57. void subtractTest1(){
  58. logger.info("Begin Subtract Test");
  59. //减法运算
  60. int subtract = mySUT.subtract(5, 8);
  61. logger.info("Operation result:{}",subtract);
  62. // expected:期望值, actual:运算的实际值
  63. assertEquals(-3,subtract);
  64. }
  65. @AfterEach
  66. void afterEach() {
  67. mySUT.destroyId();
  68. }
  69. @AfterAll
  70. static void afterAll() {
  71. mySUT.close();
  72. }
  73. }

运行测试类,对应运行结果:

  1. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  2. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDe0e5a64c-b66f-4f4b-b9d6-5e730f2c9173
  3. 2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(72) -- Begin Subtract Test
  4. 2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.subtractTest1(75) -- Operation result:-3
  5. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: e0e5a64c-b66f-4f4b-b9d6-5e730f2c9173
  6. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate ID4209abe8-4026-4119-a614-79f700abffa6
  7. 2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(40) -- Begin Add Test
  8. 2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest1(44) -- Operation result13
  9. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: 4209abe8-4026-4119-a614-79f700abffa6
  10. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDab4a1da0-2b86-4f92-8b03-d93cfce00e19
  11. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.<init>(47) -- Open Calculator
  12. 2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(54) -- Begin Add Test
  13. 2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest2(57) -- Addition result1
  14. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: ab4a1da0-2b86-4f92-8b03-d93cfce00e19
  15. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.initId(53) -- Generate IDbdd4b59d-83cb-4f58-8c37-3688ae228b48
  16. 2022-02-09 14:12:10 [main] INFO t.testeru.basic.BasicAnnotation2Test.addTest3(63) -- Begin Add Test
  17. 2022-02-09 14:12:10 [main] WARN top.testeru.MySUT.sum(77) -- Please enter an integer in the range
  18. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.destroyId(60) -- Release ID: bdd4b59d-83cb-4f58-8c37-3688ae228b48
  19. 2022-02-09 14:12:10 [main] INFO top.testeru.MySUT.close(66) -- Close Calculator

项目编写规则

  • 对应前置操作放在基础BaseTest测试类中
  • 对应业务逻辑测试代码在业务测试类中

BaseTest

  1. package top.testeru.util;
  2. import top.testeru.MySUT;
  3. import org.junit.jupiter.api.AfterAll;
  4. import org.junit.jupiter.api.AfterEach;
  5. import org.junit.jupiter.api.BeforeAll;
  6. import org.junit.jupiter.api.BeforeEach;
  7. import org.slf4j.Logger;
  8. import static java.lang.invoke.MethodHandles.lookup;
  9. import static org.slf4j.LoggerFactory.getLogger;
  10. /**
  11. * @program: tutorials
  12. * @author: testeru.top
  13. * @description: 基本测试类
  14. * @Version 1.0
  15. * @create: 2022/1/17 5:29 下午
  16. */
  17. public class BaseTest {
  18. public static final Logger logger = getLogger(lookup().lookupClass());
  19. public void get(){
  20. //获取当前类名
  21. String name = new Exception().getStackTrace()[1].getClassName(); //获取调用者的类名
  22. //获取调用者的方法名
  23. String methodName = new Exception().getStackTrace()[1].getMethodName();
  24. System.out.println(name+":"+methodName);
  25. }
  26. public static MySUT mySUT ;
  27. @BeforeAll
  28. static void beforeAll() {
  29. mySUT = new MySUT("Calculator");
  30. }
  31. @BeforeEach
  32. void beforeEach() {
  33. mySUT.initId();
  34. }
  35. @AfterEach
  36. void afterEach() {
  37. mySUT.destroyId();
  38. }
  39. @AfterAll
  40. static void afterAll() {
  41. mySUT.close();
  42. }
  43. }

业务逻辑代码

  1. package top.testeru.basic;
  2. import org.junit.jupiter.api.Test;
  3. import top.testeru.util.BaseTest;
  4. import top.testeru.MySUT;
  5. import static org.junit.jupiter.api.Assertions.*;
  6. /**
  7. * @program: tutorials
  8. * @author: testeru.top
  9. * @description: 基本注解「方法注解」测试
  10. * 加法测试用例「正常、边界值、超出边界值」
  11. * 减法测试用例「2数相减、100连续减、」
  12. * 字符串拼接
  13. * 平均值
  14. * @Version 1.0
  15. * @create: 2022/1/17 5:01 下午
  16. */
  17. public class BasicAnnotation3sTest extends BaseTest {
  18. @Test
  19. void addTest1(){
  20. logger.info("Begin Add Test");
  21. //加法运算
  22. int sum = mySUT.sum(5, 8);
  23. logger.info("Addition result:{}",sum);
  24. // expected:期望值, actual:运算的实际值
  25. assertEquals(13,sum);
  26. }
  27. @Test
  28. void addTest2(){
  29. MySUT mySUT = new MySUT("Calculator");
  30. logger.info("Begin Add Test");
  31. //加法运算
  32. int sum = mySUT.sum(99, -98);
  33. logger.info("Addition result:{}",sum);
  34. // expected:期望值, actual:运算的实际值
  35. assertEquals(1,sum);
  36. }
  37. @Test
  38. void addTest3(){
  39. logger.info("Begin Add Test");
  40. //超过边界值的加法运算
  41. Exception illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> mySUT.sum(100, -98));
  42. // expected:期望值, actual:运算的实际值
  43. assertTrue(illegalArgumentException.getMessage().contains("enter an integer in the range"));
  44. }
  45. @Test
  46. void subtractTest1(){
  47. logger.info("Begin Subtract Test");
  48. //减法运算
  49. int subtract = mySUT.subtract(5, 8);
  50. logger.info("Operation result:{}",subtract);
  51. // expected:期望值, actual:运算的实际值
  52. assertEquals(-3,subtract);
  53. }
  54. @Test
  55. void subtractTest2(){
  56. logger.info("Begin Continuous Subtract Test");
  57. //100连续减
  58. int subtract = mySUT.subtract(50,30,10,60);
  59. logger.info("Operation result:{}",subtract);
  60. // expected:期望值, actual:运算的实际值
  61. assertEquals(-50,subtract);
  62. }
  63. @Test
  64. void csTest1(){
  65. logger.info("Begin ConcatStr Test");
  66. //字符串拼接
  67. String concatStr = mySUT.concatStr("Hello","Junit5");
  68. logger.info("Operation result:{}",concatStr);
  69. // expected:期望值, actual:运算的实际值
  70. assertEquals("Hello Junit5",concatStr);
  71. }
  72. @Test
  73. void avTest1(){
  74. logger.info("Begin Average Test");
  75. //平均值
  76. double average = mySUT.average(55,44,86,72,64);
  77. logger.info("Operation result:{}",average);
  78. // expected:期望值, actual:运算的实际值
  79. assertEquals(64.2,average);
  80. }
  81. }

运行顺序

  • 如果在业务逻辑测试类和Base测试类中都有@BeforeAll,@BeforeEach,@AfterEach,@AfterAll
  • 对应执行顺序???

一」基本的注解、断言 - 图3

结论:

  • B 继承 A
    • before开头的顺序都是A-B
    • after开头的顺序都是B-A