記事


スイートの型によるテスト関数の整理


テストをテスト スイートに整理します。





概観


多数のテスト関数を扱う場合、それらをテストスイートに整理すると便利です。


テスト関数をテストスイートに追加するには、以下の 2 つの方法があります。


  • それを Swift 型に配置する。

  • それを Swift 型に配置し、その型に @Suite 属性を付与する。

  • @Suite 属性は、テストライブラリが型にテスト関数を含むことを認識するために必須ではありませんが、この属性を追加すると、IDE およびコマンドラインでのテストスイートの外観をカスタマイズできます。テストスイートに tags(_:)disabled(_:sourceLocation:) などの特性が適用されている場合、その特性はスイートに含まれるテストによって自動的に継承されます。


    テストスイートの型は、テスト関数や Swift の型に含まれるその他のメンバーに加えて、ネストされた追加のテストスイートを含むことができます。ネストされたテストスイート型を追加するには、外側のテストスイート型のスコープ内で追加の型を宣言するだけです。


    デフォルトでは、スイート内に含まれるテストは互いに並列に実行されます。テストの並列化の詳細については、テストの逐次実行または並列実行 (Running tests serially or in parallel) をご覧ください。



    スイートの名前をカスタマイズする


    テストスイートの名前をカスタマイズするには、@Suite 属性への引数として文字列リテラルを指定します。


    @Suite("Food truck tests") struct FoodTruckTests {
      @Test func foodTruckExists() { ... }
    }

    テスト関数の外観と動作をさらにカスタマイズするには、tags(_:) などの traits (特性) を使用します。



    テストスイート型のテスト関数


    型に、インスタンスメソッドとして宣言されたテスト関数 (つまり、static または class キーワードのいずれも使用されていない) が含まれている場合、テストライブラリは実行時にそのテスト関数を呼び出します。まず、その型のインスタンスを初期化し、そのインスタンスに対してテスト関数を呼び出します。テストスイート型にインスタンスメソッドとして宣言された複数のテスト関数が含まれている場合、各テスト関数は型の個別のインスタンスに対して呼び出されます。したがって、以下のテストスイートとテスト関数:


    @Suite struct FoodTruckTests {
      @Test func foodTruckExists() { ... }
    }
    

    は、以下と等しくなります:


    @Suite struct FoodTruckTests {
      func foodTruckExists() { ... }
    
      @Test static func staticFoodTruckExists() {
        let instance = FoodTruckTests()
        instance.foodTruckExists()
      }
    }
    


    テストスイートの型への制約


    型をテストスイートとして使用する場合は、Swift の型には適用されないいくつかの制約が適用されます。



    イニシャライザーが必要


    型に、インスタンスメソッドとして宣言されたテスト関数が含まれる場合、その型のインスタンスを引数なしのイニシャライザーで初期化できなければなりません。イニシャライザーは、以下の任意の組み合わせで構いません。


  • implicit (暗黙的) または explicit (明示的)

  • synchronous (同期) または asynchronous (非同期)

  • throwing (スローする) か non-throwing (スローしない) か

  • private、fileprivate、internal、package、または public

  • 例えば:


    @Suite struct FoodTruckTests {
      var batteryLevel = 100
    
      @Test func foodTruckExists() { ... } // ✅ OK: The type has an implicit init().
    }
    
    @Suite struct CashRegisterTests {
      private init(cashOnHand: Decimal = 0.0) async throws { ... }
    
      @Test func calculateSalesTax() { ... } // ✅ OK: The type has a callable init().
    }
    
    struct MenuTests {
      var foods: [Food]
      var prices: [Food: Decimal]
    
      @Test static func specialOfTheDay() { ... } // ✅ OK: The function is static.
      @Test func orderAllFoods() { ... } // ❌ ERROR: The suite type requires init().
    

    この要件を満たさないテストスイートが提示されると、コンパイラはエラーを出力します。



    テストスイート型は常に利用可能でなければならない


    @available をテスト関数に適用して実行時の利用可能性を制限することはできますが、テストスイート型 (およびそれを含むすべての型) に @available 属性を注釈付けしてはなり ません


    @Suite struct FoodTruckTests { ... } // ✅ OK: The type is always available.
    
    @available(macOS 11.0, *) // ❌ ERROR: The suite type must always be available.
    @Suite struct CashRegisterTests { ... }
    
    @available(macOS 11.0, *) struct MenuItemTests { // ❌ ERROR: The suite type's
                                                     // containing type must always
                                                     // be available too.
      @Suite struct BurgerTests { ... }
    

    この要件を満たさないテストスイートが提示されると、コンパイラはエラーを出力します。





    以下も見よ


    要点


    テスト関数の定義

    コードが正しく動作していることを検証するためのテスト関数を定義します。


    XCTest からのテストの移行 (Migrating a test from XCTest)

    XCTest を使用して記述された既存のテストメソッドまたはテストクラスを移行します。


    macro Test(String?, any TestTrait...)

    テストを宣言します。


    struct Test

    テストまたはスイートを表す型。


    macro Suite(String?, any SuiteTrait...)

    テストスイートを宣言します。














    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ