2017-01-11 1 views
2

iOS UIテストを実行するJenkinsジョブがあり、テスト実行中に特定の実行時情報に基づいていくつかのテスト(またはテストクラス)を無視できるようにする必要があります。 XCTestSuiteのドキュメントhttps://developer.apple.com/reference/xctest/xctestsuiteによれば、プログラムでカスタムテストスイートを作成できますが、実際に行う方法の例は見つかりませんでした。だから、どれくらい正確に行くのですか?XCTestSuiteの使い方は? (Swift 3)

私はこれを出発点として以下のコードでおもしろいが、実際にはどこにもいない。 IgnoreThisClassがXcodeで実行されると、BaseTestClassのsetUp()のtestCaseCountがスイート内で0テストを報告しても、その中のテストメソッドが実行されます。代わりにinit()メソッドをオーバーライドする必要がありますか?どんなヒントも大歓迎です!

import XCTest 

class BaseTestClass: XCTestCase { 
    var runThis: Bool? 

    override func setUp() { 
     if runThis != nil { 
      let suite = XCTestSuite(name: "Custom suite") 

      if runThis! { 
       suite.addTest(self) 
      } 
      print("Testcases in suite \(suite.testCaseCount)") 
      // This causes an error that the suite has already started, 
      // even though this call is present in Apple's example documentation. 
      //suite.run() 
     } 
     XCUIApplication().launch() 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 
} 

// Run this. 
class RunThisClass: BaseTestClass { 

    override func setUp() { 
     super.runThis = true 
     super.setUp() 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 

    func testThis() { 
     print("Test class was run.") 
    } 
} 

// Don't run this. 
class IgnoreThisClass: BaseTestClass { 

    override func setUp() { 
     super.runThis = false 
     super.setUp() 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 

    func testIgnoreThis() { 
     print("Ignored class was run.") 
    } 
} 
+0

実行するテストのリストを動的に再構築する場合の例を挙げることができますか?特定のテストを移動してテストバンドルを分離し、それを条件付きで実行するだけですか? – Andy

+0

たとえば、iOS 10を実行しているデバイスではテストのいくつかが違って失敗/動作していますが、iOS 9を実行しているデバイスでは以前と同じように動作しますが、アプリケーション機能自体は変更されていません。したがって、すでに長いテストランタイムを削減するために、私たちがそれらを修正するまで、失敗テストがiOS 10デバイスで実行されることを偽陽性として止めたいと考えています。すでに100以上のテストを受けており、毎日多くのことを書いていますので、避けることができれば別々のテストバンドルを保守しないでください。 – sjalv

答えて

0

あなたが望むものを達成するために、あなたはXCTestCaseサブクラス内からXCTestSuiteを初期化することができません。これは、XCTestCaseがテスト(したがってセットアップ)を実行するためには既にXCTestSuiteの一部でなければならないためです。既に初期化されたテスト内でカスタムテストスイートを初期化することはできません。

Xcodeは、XCTestSuiteを含む必要なテストクラスを自動的に初期化するため、初期化されたときに制御できず、カスタムパラメータを送信できません。

XCTestSuiteにextensionを追加し、そこでスイートに含まれるテストケースを実行するかどうかの評価を追加することをお勧めします。

+0

ありがとうございます。カスタムスイートのsuite.run()メソッドは、スイートがすでに実行されていると不満を持ち続けていたことが分かりました。デバッガはまた、既定のスイートが既に作成されていることを示しました。 XCTestSuiteを拡張する方法について説明します。 – sjalv