7.1 @Suite注解

以及一些更常用的注解。即使您不使用它们,您也一定会看到使用它们进行的测试。因此,有必要至少大致了解那里写的内容。

测试可以组合成组。对此有一个特殊的注解@Suite。例子:

@Suite
@SuiteDisplayName("JUnit Platform Suite Demo")
@SelectPackages("com.codegym.test")
@IncludeClassNamePatterns(".*Tests")
class SuiteDemo {
}

在这种情况下,@Suite 注释与其他注释配对。

  • SuiteDisplayName– 设置日志中测试组的名称;
  • SelectPackages- 设置要在其中查找测试类的包列表;
  • IncludeClassNamePatterns– 设置测试类名称的模式。

为什么会有这样的困难?想象一下,项目的所有测试都已执行,比方说,50 小时。并且在每次提交后执行它们非常昂贵。在这种情况下,创建一些单独的测试脚本并以更灵活的方式设置测试是很有用的。

7.2 @Order注解

另一个常见的注解是@TestMethodOrder. 它允许您指定在测试类中调用测试方法的顺序。当您知道方法调用相互影响时,它会非常有用,但在某种顺序下,一切都应该按预期进行。经常使用。

首先,您可以设置要按字母顺序调用的方法

@TestMethodOrder(MethodOrderer.MethodName.class)
public class AlphanumericOrderUnitTest {

}

其次,每个方法都可以有一个带有序号的特殊注释。

@TestMethodOrder(OrderAnnotation.class)
public class OrderAnnotationUnitTest {

    @Test
    @Order(1)
    public void firstTest() {
    }

    @Test
    @Order(2)
    public void secondTest() {
    }
}

或者甚至创建一个单独的类来指定调用测试的顺序:

@TestMethodOrder(CustomOrder.class)
public class CustomOrderUnitTest {

}

//sort method names alphabetically, but ignoring case
public class CustomOrder implements MethodOrderer {
    public void orderMethods(MethodOrdererContext context) {
        context.getMethodDescriptors().sort(
        (MethodDescriptor m1, MethodDescriptor m2)->
           m1.getMethod().getName().compareToIgnoreCase(m2.getMethod().getName()));
    }
}

7.3 @DisplayName 注解

最后,可以为每个测试命名。如果有很多测试并且您创建测试的特殊场景(子集),这会很方便。对此有一个特殊的注解@DisplayName

例子:

@DisplayName("Friendly name for the test")
public class DisplayNameCustomTest {

    @Test
    @DisplayName("Input Validation")
    void inputData() {
    }

    @DisplayName("Checking critical situations")
    @Test
    void criticalCases() {
    }
}

与设置测试顺序的情况一样,您可以在此处创建一个特殊方法,该方法将生成测试名称和测试方法。例子:

@DisplayNameGeneration(DisplayNameGeneratorUnitTest.ReplaceCamelCase.class)
class DisplayNameGeneratorUnitTest {

    @Test
    void camelCaseName() {
    }

    static class ReplaceCamelCase extends DisplayNameGenerator.Standard {
        @Override
        public String generateDisplayNameForClass(Class testClass) {
            return super.generateDisplayNameForClass(testClass).toUpperCase();
        }
 }
}

看看它是多么容易:)