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();
        }
 }
}

看看它是多麼容易:)