注解 说明
@DisplayName 自定义显示名称;类和方法上都可使用
@DisplayNameGeneration 定义显示名称规则;类上都使用
@Disable 禁用测试;类和方法上都可使用
@Tag 标记测试;类和方法上都可使用

@DisplayName

使用

@DisplayName注解不但可以放在测试方法上也可以放在测试类的上面。是一个类和方法都可以使用的注解。

eg : @DisplayName("This is a displayname annotation test")

对应括号内是string类型的字符串就是对应的显示内容,string类型内可以填写包含空格、特殊字符甚至表情符号😊

eg : @DisplayName("😊计算器测试用例 ╯°□°)╯")

作用

作用就是自定义显示名称,自己想怎么显示就怎么显示。

一般情况下的作用就是在 IDE 和构建工具中的测试报告中自定义显示的类名和方法名,当然可以和allure报告结合,在allure报告中同样显示对应方法名和类名

总结

总结为以下几点:

  • 带注释的测试类测试方法声明自定义显示名称
  • 通常用于 IDE 和构建工具中的测试报告
  • 可包含空格、特殊字符甚至表情符号😊
  • 结合Allure报告,可以显示对应方法名和类名
  1. package top.testeru.common;
  2. import top.testeru.util.BaseTest;
  3. import org.junit.jupiter.api.DisplayName;
  4. import org.junit.jupiter.api.Test;
  5. import static org.junit.jupiter.api.Assertions.assertEquals;
  6. /**
  7. * @program: tutorials
  8. * @author: testeru.top
  9. * @description: 常用注解测试:显示名称
  10. * DisplayName:类+方法注解
  11. * @Version 1.0
  12. * @create: 2022/1/17 5:01 下午
  13. */
  14. @DisplayName("😊Calculator Test╯°□°)╯")
  15. public class CommonAnnotation1Test extends BaseTest {
  16. @DisplayName("加法")
  17. @Test
  18. void addTest1(){
  19. logger.info("Begin Add Test");
  20. //加法运算
  21. int sum = mySUT.sum(5, 8);
  22. logger.info("Operation result:{}",sum);
  23. // expected:期望值, actual:运算的实际值
  24. assertEquals(13,sum);
  25. }
  26. @DisplayName("2数相减")
  27. @Test
  28. void subtractTest1(){
  29. logger.info("Begin Subtract Test");
  30. //减法运算
  31. int subtract = mySUT.subtract(5, 8);
  32. logger.info("Operation result:{}",subtract);
  33. // expected:期望值, actual:运算的实际值
  34. assertEquals(-3,subtract);
  35. }
  36. @DisplayName("字符串拼接🐶")
  37. @Test
  38. void csTest1(){
  39. logger.info("Begin ConcatStr Test");
  40. //字符串拼接
  41. String concatStr = mySUT.concatStr("Hello","Junit5");
  42. logger.info("Operation result:{}",concatStr);
  43. // expected:期望值, actual:运算的实际值
  44. assertEquals("Hello Junit5",concatStr);
  45. }
  46. @DisplayName("100连续减😱")
  47. @Test
  48. void subtractTest2(){
  49. logger.info("Begin Continuous Subtract Test");
  50. //100连续减
  51. int subtract = mySUT.subtract(50,30,10,60);
  52. logger.info("Operation result:{}",subtract);
  53. // expected:期望值, actual:运算的实际值
  54. assertEquals(-50,subtract);
  55. }
  56. @DisplayName("平均数😐")
  57. @Test
  58. void avTest1(){
  59. logger.info("Begin Average Test");
  60. //平均值
  61. double average = mySUT.average(55,44,86,72,64);
  62. logger.info("Operation result:{}",average);
  63. // expected:期望值, actual:运算的实际值
  64. assertEquals(64.2,average);
  65. }
  66. }

二」常用注解 - 图1

@DisplayNameGeneration

使用

类上的注解,不能在方法上使用。

类上声明一次,对应的方法内也是用该类上声明的规则进行对应方法名称的显示。

作用

在类上添加该注解,并在注解内指明对应类,比如:DisplayNameGenerator.ReplaceUnderscores类,它会默认用空格替换名称中的任何下划线,无论是类名上的还是方法名上下划线都会被替换掉。

其实就是自己在类上声明@DisplayNameGeneration注解,并在注解内配置 当前类和方法的显示名称生成器规则

总结

  • 配置自定义显示名称生成器
  • DisplayNameGenerator.ReplaceUnderscores类,它用空格替换名称中的任何下划线
  1. package top.testeru.common;
  2. import org.junit.jupiter.api.DisplayNameGeneration;
  3. import org.junit.jupiter.api.DisplayNameGenerator;
  4. import org.junit.jupiter.api.Test;
  5. import top.testeru.util.BaseTest;
  6. import static org.junit.jupiter.api.Assertions.assertEquals;
  7. /**
  8. * @program: tutorials
  9. * @author: testeru.top
  10. * @description: 常用注解测试:显示名称
  11. * DisplayNameGeneration
  12. * 空格替换名称中的任何下划线 ReplaceUnderscores
  13. * @Version 1.0
  14. * @create: 2022/1/17 5:01 下午
  15. */
  16. @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
  17. public class Common_Annotation2_Test extends BaseTest {
  18. @Test
  19. void add_test_1(){
  20. logger.info("Begin Add Test");
  21. //加法运算
  22. int sum = mySUT.sum(5, 8);
  23. logger.info("Operation result:{}",sum);
  24. // expected:期望值, actual:运算的实际值
  25. assertEquals(13,sum);
  26. }
  27. @Test
  28. void subtract_test_1(){
  29. logger.info("Begin Subtract Test");
  30. //减法运算
  31. int subtract = mySUT.subtract(5, 8);
  32. logger.info("Operation result:{}",subtract);
  33. // expected:期望值, actual:运算的实际值
  34. assertEquals(-3,subtract);
  35. }
  36. @Test
  37. void cs_test_1(){
  38. logger.info("Begin ConcatStr Test");
  39. //字符串拼接
  40. String concatStr = mySUT.concatStr("Hello","Junit5");
  41. logger.info("Operation result:{}",concatStr);
  42. // expected:期望值, actual:运算的实际值
  43. assertEquals("Hello Junit5",concatStr);
  44. }
  45. @Test
  46. void subtract_test_2(){
  47. logger.info("Begin Continuous Subtract Test");
  48. //100连续减
  49. int subtract = mySUT.subtract(50,30,10,60);
  50. logger.info("Operation result:{}",subtract);
  51. // expected:期望值, actual:运算的实际值
  52. assertEquals(-50,subtract);
  53. }
  54. @Test
  55. void av_test_1(){
  56. logger.info("Begin Average Test");
  57. //平均值
  58. double average = mySUT.average(55,44,86,72,64);
  59. logger.info("Operation result:{}",average);
  60. // expected:期望值, actual:运算的实际值
  61. assertEquals(64.2,average);
  62. }
  63. }

自定义显示名规则

步骤

编写静态内部类

继承Standard

重写方法
  • generateDisplayNameForClass :声明对应的类名 显示的规则
  • generateDisplayNameForMethod: 声明对应的方法名显示的规则
  1. static class ReplaceCamelCase extends DisplayNameGenerator.Standard {
  2. @Override
  3. public String generateDisplayNameForClass(Class<?> testClass) {
  4. return replaceCamelCase(super.generateDisplayNameForClass(testClass))+ "...";
  5. }
  6. @Override
  7. public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
  8. return replaceCamelCase(super.generateDisplayNameForNestedClass(nestedClass));
  9. }
  10. @Override
  11. public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
  12. //+ DisplayNameGenerator.parameterTypesAsString(testMethod) 方法的括号
  13. return this.replaceCamelCase(testClass.getSimpleName()+ ";方法名:" + testMethod.getName()+ ".");
  14. }
  15. String replaceCamelCase(String camelCase) {
  16. StringBuilder result = new StringBuilder();
  17. result.append(camelCase.charAt(0));
  18. for (int i=1; i<camelCase.length(); i++) {
  19. if (Character.isUpperCase(camelCase.charAt(i))) {
  20. result.append(' ');
  21. result.append(Character.toLowerCase(camelCase.charAt(i)));
  22. } else {
  23. result.append(camelCase.charAt(i));
  24. }
  25. }
  26. return result.toString().replace("test","Test");
  27. }
  28. }

注意⚠️

方法/类上有@DisplayName,并且有自定义的显示规则优先级排序「优先级自上而下」:{1 > 2}

  1. 方法/类上的@DisplayName
  2. 自定义的显示规则

就是如果 方法/类上有@DisplayName则直接显示,如果没有则按自定义的显示规则进行显示

完整代码

  1. package com.testeru.base;
  2. import org.junit.jupiter.api.DisplayName;
  3. import org.junit.jupiter.api.DisplayNameGeneration;
  4. import org.junit.jupiter.api.DisplayNameGenerator;
  5. import org.junit.jupiter.api.Test;
  6. import java.lang.reflect.Method;
  7. import static org.junit.jupiter.api.Assertions.assertEquals;
  8. /**
  9. * @program: tutorials
  10. * @author: testeru.top
  11. * @description: 自定义显示名称
  12. * @Version 1.0
  13. * @create: 2022/1/17 5:01 下午
  14. */
  15. @DisplayNameGeneration(CommonAnnotation3Test.ReplaceCamelCase.class)
  16. public class CommonAnnotation3Test extends BaseTest{
  17. @DisplayName("加法")
  18. @Test
  19. void addTest1(){
  20. logger.info("Begin Add Test");
  21. //加法运算
  22. int sum = mySUT.sum(5, 8);
  23. logger.info("Operation result:{}",sum);
  24. // expected:期望值, actual:运算的实际值
  25. assertEquals(13,sum);
  26. }
  27. @Test
  28. void subtractTest1(){
  29. logger.info("Begin Subtract Test");
  30. //减法运算
  31. int subtract = mySUT.subtract(5, 8);
  32. logger.info("Operation result:{}",subtract);
  33. // expected:期望值, actual:运算的实际值
  34. assertEquals(-3,subtract);
  35. }
  36. @Test
  37. void csTest1(){
  38. logger.info("Begin ConcatStr Test");
  39. //字符串拼接
  40. String concatStr = mySUT.concatStr("Hello","Junit5");
  41. logger.info("Operation result:{}",concatStr);
  42. // expected:期望值, actual:运算的实际值
  43. assertEquals("Hello Junit5",concatStr);
  44. }
  45. @Test
  46. void subtractTest2(){
  47. logger.info("Begin Continuous Subtract Test");
  48. //100连续减
  49. int subtract = mySUT.subtract(50,30,10,60);
  50. logger.info("Operation result:{}",subtract);
  51. // expected:期望值, actual:运算的实际值
  52. assertEquals(-50,subtract);
  53. }
  54. @Test
  55. void avTest1(){
  56. logger.info("Begin Average Test");
  57. //平均值
  58. double average = mySUT.average(55,44,86,72,64);
  59. logger.info("Operation result:{}",average);
  60. // expected:期望值, actual:运算的实际值
  61. assertEquals(64.2,average);
  62. }
  63. //标准显示名称生成行为 Standard默认配置
  64. static class ReplaceCamelCase extends DisplayNameGenerator.Standard {
  65. @Override
  66. public String generateDisplayNameForClass(Class<?> testClass) {
  67. return replaceCamelCase(super.generateDisplayNameForClass(testClass))+ "...";
  68. }
  69. @Override
  70. public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
  71. return replaceCamelCase(super.generateDisplayNameForNestedClass(nestedClass));
  72. }
  73. @Override
  74. public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
  75. //+ DisplayNameGenerator.parameterTypesAsString(testMethod) 方法的括号
  76. return this.replaceCamelCase(testClass.getSimpleName()+ ";方法名:" + testMethod.getName()+ ".");
  77. }
  78. String replaceCamelCase(String camelCase) {
  79. StringBuilder result = new StringBuilder();
  80. result.append(camelCase.charAt(0));
  81. for (int i=1; i<camelCase.length(); i++) {
  82. if (Character.isUpperCase(camelCase.charAt(i))) {
  83. result.append(' ');
  84. result.append(Character.toLowerCase(camelCase.charAt(i)));
  85. } else {
  86. result.append(camelCase.charAt(i));
  87. }
  88. }
  89. return result.toString().replace("test","Test");
  90. }
  91. }
  92. }

二」常用注解 - 图2

@Disable

使用

@Disable注解不但可以放在测试方法上也可以放在测试类的上面。是一个类和方法都可以使用的注解。

eg : @Disabled("平均值有bug")

对应括号内是string类型的字符串就是对应方法/类被禁用的原因。也可以不写括号及括号内的string,默认就是返回值 包名.类名.方法 is @Disabled

eg :void top.testeru.common.CommonAnnotation4Test.csTest1() is @Disabled

作用

该注解在方法上声明对应的方法则不被执行,但是方法的类还是依然会被实例化。

如果注解在类上声明则该类下所有测试方法都不被执行,对应类也不会实例化。

总结

  • 表示带注释的测试类测试方法当前已禁用,不应执行
  • 可以添加()并声明原因
  • 在类级别应用时,该类中的所有测试方法会自动禁用
  • 在方法级别应用时,@Disable不会阻止测试类被实例化
  • 会阻止执行测试方法和方法级别的生命周期回调
  1. package top.testeru.common;
  2. import org.junit.jupiter.api.*;
  3. import top.testeru.util.BaseTest;
  4. import java.lang.reflect.Method;
  5. import static org.junit.jupiter.api.Assertions.assertEquals;
  6. /**
  7. * @program: tutorials
  8. * @author: testeru.top
  9. * @description: 常用注解测试:
  10. * 禁用测试方法:@Disable
  11. * 括号内有描述显示描述信息
  12. * 不带括号,显示默认信息:{返回值 包名.类名.方法名 is @Disabled}
  13. * 显示名称
  14. * 自定义显示名称
  15. * @Version 1.0
  16. * @create: 2022/1/17 5:01 下午
  17. */
  18. @DisplayNameGeneration(CommonAnnotation4Test.ReplaceCamelCase.class)
  19. public class CommonAnnotation4Test extends BaseTest {
  20. @DisplayName("加法")
  21. @Test
  22. void addTest1(){
  23. logger.info("Begin Add Test");
  24. //加法运算
  25. int sum = mySUT.sum(5, 8);
  26. logger.info("Operation result:{}",sum);
  27. // expected:期望值, actual:运算的实际值
  28. assertEquals(13,sum);
  29. }
  30. @Test
  31. void subtractTest1(){
  32. logger.info("Begin Subtract Test");
  33. //减法运算
  34. int subtract = mySUT.subtract(5, 8);
  35. logger.info("Operation result:{}",subtract);
  36. // expected:期望值, actual:运算的实际值
  37. assertEquals(-3,subtract);
  38. }
  39. @DisplayName("字符串拼接🐶")
  40. @Test
  41. @Disabled
  42. void csTest1(){
  43. logger.info("Begin ConcatStr Test");
  44. //字符串拼接
  45. String concatStr = mySUT.concatStr("Hello","Junit5");
  46. logger.info("Operation result:{}",concatStr);
  47. // expected:期望值, actual:运算的实际值
  48. assertEquals("Hello Junit5",concatStr);
  49. }
  50. @Test
  51. void subtractTest2(){
  52. logger.info("Begin Continuous Subtract Test");
  53. //100连续减
  54. int subtract = mySUT.subtract(50,30,10,60);
  55. logger.info("Operation result:{}",subtract);
  56. // expected:期望值, actual:运算的实际值
  57. assertEquals(-50,subtract);
  58. }
  59. @Test
  60. @Disabled("平均值有bug")
  61. void avTest1(){
  62. logger.info("Begin Average Test");
  63. //平均值
  64. double average = mySUT.average(55,44,86,72,64);
  65. logger.info("Operation result:{}",average);
  66. // expected:期望值, actual:运算的实际值
  67. assertEquals(64.2,average);
  68. }
  69. //标准显示名称生成行为 Standard默认配置
  70. static class ReplaceCamelCase extends DisplayNameGenerator.Standard {
  71. @Override
  72. public String generateDisplayNameForClass(Class<?> testClass) {
  73. return replaceCamelCase(super.generateDisplayNameForClass(testClass))+ "...";
  74. }
  75. @Override
  76. public String generateDisplayNameForNestedClass(Class<?> nestedClass) {
  77. return replaceCamelCase(super.generateDisplayNameForNestedClass(nestedClass));
  78. }
  79. @Override
  80. public String generateDisplayNameForMethod(Class<?> testClass, Method testMethod) {
  81. //+ DisplayNameGenerator.parameterTypesAsString(testMethod) 方法的括号
  82. return this.replaceCamelCase(testClass.getSimpleName()+ ";方法名:" + testMethod.getName()+ ".");
  83. }
  84. String replaceCamelCase(String camelCase) {
  85. StringBuilder result = new StringBuilder();
  86. result.append(camelCase.charAt(0));
  87. for (int i=1; i<camelCase.length(); i++) {
  88. if (Character.isUpperCase(camelCase.charAt(i))) {
  89. result.append(' ');
  90. result.append(Character.toLowerCase(camelCase.charAt(i)));
  91. } else {
  92. result.append(camelCase.charAt(i));
  93. }
  94. }
  95. return result.toString().replace("test","Test");
  96. }
  97. }
  98. }

二」常用注解 - 图3

注意⚠️

  • 对应不执行的测试方法的@BeforeEach@AfterEach都没有执行
  • 如果有描述,显示不执行的描述,如果没有描述内容,显示对应方法名不被执行

@Tag

使用

@Tag注解不但可以放在测试方法上也可以放在测试类的上面。是一个类和方法都可以使用的注解。可以在一个类/方法上有多个,也可以只有一个。

eg :

  • 只有一个:@Tag("decimal")
  • 有多个:
  1. @Tags({
  2. @Tag("decimal"),
  3. @Tag("dev")
  4. })

命名规范

对应Tag标签的标识名称的命名规范,首先不能是空的字符串,空字符串对应的没有意义,同时标签名称不能有对应的空格及ISO控制字符。

一般情况下,对应的名称都为英文或者是中文来做区分即可。

总结为以下几点:

  • 不为空
  • 标签不得包含空格
  • 标签不得包含 ISO 控制字符。
  • 标签不得包含以下任何保留字符
  1. ,
  2. (
  3. )
  4. &
  5. |
  6. !

作用

在运行suite套件的时候可以指定对应tag标签来运行特定的类或者方法,只要是对应类或方法上有该标签就会运行。

也可以在pom文件中进行对应group的配置,这样对应的可以只运行特定的方法和类。

总结以上,@Tag注解就是为了特定运行某些方法和类。

总结

  • 标记测试
  • 测试类测试方法声明

应用

用例分组
  • 环境分组: 测试环境、预发布环境
  • 阶段分组: 冒烟用例
  • 版本分组: V1.1、V1.2

自定义组成的注释命名

  • 接口名随便定义,不一定非要Test结尾

自定义方法上元注释

步骤
  • 自定义元注解写在测试方法上
  • 生成对应接口文件
  • 在接口文件上添加对应注解即可

实现效果
  • @IntTagTest 替换 @Test+@Tag("integer")
  • 示例代码
  1. @DisplayName("加法")
  2. // @Test
  3. // @Tag("integer")
  4. @IntTagTest
  5. void addTest1(){
  6. logger.info("Begin Add Test");
  7. //加法运算
  8. int sum = mySUT.sum(5, 8);
  9. logger.info("Operation result:{}",sum);
  10. // expected:期望值, actual:运算的实际值
  11. assertEquals(13,sum);
  12. }

实现代码
  1. package top.testeru.util;
  2. import org.junit.jupiter.api.Tag;
  3. import org.junit.jupiter.api.Test;
  4. import java.lang.annotation.ElementType;
  5. import java.lang.annotation.Retention;
  6. import java.lang.annotation.RetentionPolicy;
  7. import java.lang.annotation.Target;
  8. /**
  9. * @Package: top.testeru.util
  10. * @author: testeru.top
  11. * @Description:
  12. * @date: 2022年02月09日 3:03 PM
  13. */
  14. @Target(ElementType.METHOD)
  15. @Retention(RetentionPolicy.RUNTIME)
  16. @Tag("integer")
  17. @Test
  18. public @interface IntTagTest {
  19. }

说明
  1. ElementType.METHOD代表该注解只是在方法上才可以使用
  2. RetentionPolicy.RUNTIME注释将由编译器记录在类文件中,并在运行时由 VM 保留,因此可以反射性地读取它们

自定义类上元注释

步骤
  • 自定义元注解写在测试类上
  • 生成对应接口文件
  • 在接口文件上添加对应注解即可

实现效果
  • @MyClassTag 替换类上的注解 @Tag("mytag")
  • 示例代码
  1. @MyClassTag
  2. public class CommonAnnotation6Test extends BaseTest {
  3. ...
  4. }

实现代码
  1. package top.testeru.util;
  2. import org.junit.jupiter.api.Tag;
  3. import java.lang.annotation.*;
  4. /**
  5. * @Package: top.testeru.util
  6. * @author: testeru.top
  7. * @Description:
  8. * @date: 2022年02月09日 3:09 PM
  9. */
  10. @Target({ ElementType.TYPE, ElementType.METHOD })
  11. @Retention(RetentionPolicy.RUNTIME)
  12. @Tag("mytag")
  13. @Documented
  14. public @interface MyClassTag {
  15. }

@RepeatedTest

  • 想要重复多次的任何测试方法
  • 只能添加在测试方法上,和Test使用方法一致
  • 方法不能是私有的或静态的,并且返回值必须是void
  • ()内为执行的次数
  • 方法上有@RepeatedTest则不需要@Test
    • 不然真正执行的次数为RepeatedTest的参数值 + 1
  1. package com.testeru.classes;
  2. import org.junit.jupiter.api.*;
  3. /**
  4. * @program: tutorials
  5. * @author: testeru.top
  6. * @description:
  7. * @Version 1.0
  8. * @create: 2022/1/7 4:46 下午
  9. */
  10. @DisplayName("junit5 test")
  11. public class FourDemoTest extends BaseDemoTest{
  12. @BeforeAll
  13. static void beforeAll1(){
  14. System.out.println("---进入到首页---");
  15. }
  16. @BeforeEach
  17. void beforeEach1(){
  18. System.out.println("---搜索商品---");
  19. }
  20. @DisplayName("first test")
  21. @Test
  22. void test(){
  23. System.out.println("---点击查看第 1 个商品详情---");
  24. }
  25. @DisplayName("second test")
  26. @Disabled("先不执行")
  27. @Test
  28. void test2(){
  29. System.out.println("---点击查看第 2 个商品详情---");
  30. }
  31. @DisplayName("third test")
  32. @Disabled
  33. @Test
  34. void test3(){
  35. System.out.println("---点击查看第 2 个商品详情---");
  36. }
  37. @DisplayName("five test")
  38. @RepeatedTest(3)
  39. void test5(){
  40. System.out.println("---点击查看第 6 个商品详情---");
  41. }
  42. @AfterEach
  43. void afterEach1(){
  44. System.out.println("---添加购物车---");
  45. }
  46. @AfterAll
  47. static void afterAll1(){
  48. System.out.println("---进入购物车列表,生成订单,进行订单付款---");
  49. }
  50. }

二」常用注解 - 图4

  • 相当于重复写了3个相同的方法
  • 对应beforeeach和aftereach都会随着重复次数来执行

自定义显示名称

  • @RepeatedTest(value = 3,name = "Custom name {currentRepetition}/{totalRepetitions}")
    • value
      • 重复执行多少次
    • name
      • 对应每次执行的自定义名称
      • currentRepetition:当前重复次数
      • totalRepetitions:重复的总数
  1. package com.testeru.classes;
  2. import org.junit.jupiter.api.*;
  3. /**
  4. * @program: tutorials
  5. * @author: testeru.top
  6. * @description:
  7. * @Version 1.0
  8. * @create: 2022/1/7 4:46 下午
  9. */
  10. @DisplayName("junit5 test")
  11. public class FourDemoTest extends BaseDemoTest{
  12. @BeforeAll
  13. static void beforeAll1(){
  14. System.out.println("---进入到首页---");
  15. }
  16. @BeforeEach
  17. void beforeEach1(){
  18. System.out.println("---搜索商品---");
  19. }
  20. @DisplayName("first test")
  21. @Test
  22. void test(){
  23. System.out.println("---点击查看第 1 个商品详情---");
  24. }
  25. @DisplayName("second test")
  26. @Disabled("先不执行")
  27. @Test
  28. void test2(){
  29. System.out.println("---点击查看第 2 个商品详情---");
  30. }
  31. @DisplayName("third test")
  32. @Disabled
  33. @Test
  34. void test3(){
  35. System.out.println("---点击查看第 2 个商品详情---");
  36. }
  37. @DisplayName("five test")
  38. @RepeatedTest(value = 3,name = "Custom name {currentRepetition}/{totalRepetitions}")
  39. void test5(){
  40. System.out.println("---点击查看第 6 个商品详情---");
  41. }
  42. @AfterEach
  43. void afterEach1(){
  44. System.out.println("---添加购物车---");
  45. }
  46. @AfterAll
  47. static void afterAll1(){
  48. System.out.println("---进入购物车列表,生成订单,进行订单付款---");
  49. }
  50. }

二」常用注解 - 图5

方法内调用

  • 方法内想要知道调用当前是第几次重复和总共重复的次数
  1. @RepeatedTest(value = 3,name = "Custom name {currentRepetition}/{totalRepetitions}")
  2. void test4(RepetitionInfo repetitionInfo) {
  3. int currentRepetition = repetitionInfo.getCurrentRepetition();
  4. System.out.println("第" + currentRepetition +"次搜索 查看第 " + currentRepetition + "个商品详情");
  5. }

二」常用注解 - 图6

  • 测试方法不是@RepeatedTest,则不能将RepetitionInfo 注入到 @BeforeEach@AfterEach 方法中
  1. package com.testeru.classes;
  2. import org.junit.jupiter.api.*;
  3. /**
  4. * @program: tutorials
  5. * @author: testeru.top
  6. * @description:
  7. * @Version 1.0
  8. * @create: 2022/1/7 4:46 下午
  9. */
  10. @DisplayName("junit5 test")
  11. public class FiveDemoTest{
  12. @BeforeEach
  13. void beforeEach1(RepetitionInfo repetitionInfo){
  14. int currentRepetition = repetitionInfo.getCurrentRepetition();
  15. System.out.println("---搜索商品---" + currentRepetition);
  16. }
  17. @AfterEach
  18. void afterEach1(RepetitionInfo repetitionInfo){
  19. int currentRepetition = repetitionInfo.getCurrentRepetition();
  20. System.out.println("---添加购物车---"+ currentRepetition);
  21. }
  22. @DisplayName("four test")
  23. @RepeatedTest(value = 3,name = "重复搜索次数 {currentRepetition}/{totalRepetitions}")
  24. void test4(RepetitionInfo repetitionInfo) {
  25. int currentRepetition = repetitionInfo.getCurrentRepetition();
  26. System.out.println("第" + currentRepetition +"次搜索 查看第 " + currentRepetition + "个商品详情");
  27. }
  28. @DisplayName("third test")
  29. @Test
  30. void test3(){
  31. System.out.println("---点击查看第 2 个商品详情---");
  32. }
  33. @DisplayName("first test")
  34. @RepeatedTest(2)
  35. void test1(){
  36. System.out.println("---点击查看第 1 个商品详情---");
  37. }
  38. }

报错:

  1. org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [org.junit.jupiter.api.RepetitionInfo arg0] in method [void com.testeru.classes.FiveDemoTest.beforeEach1(org.junit.jupiter.api.RepetitionInfo)].

二」常用注解 - 图7