0

バックグラウンド

次のテストは、XCTestCase の拡張であるメソッドを呼び出します。目標:

  • waitForElementExists要素が存在するか、または
  • waitForElementExists要素が指定された時間内に存在しなかったため、メソッドはそれを呼び出したテスト ケース/setUp メソッドに失敗しました

メソッドを待機する UI オートメーション XCTestCase 拡張機能:

extension XCTestCase
{
    /**
    Wait for the view to load
    Note: Must be a part of XCTestCase in order to utilize expectationForPredicate and waitForExpectationsWithTimeout

    - Parameter
    - element:    The XCUIElement representing the view
    - timeout: The NSTimeInterval for how long you want to wait for the view to be loaded
    - file: The file where this method was called
    - line: The line where this method was called
    */
    func waitForElementExists(element: XCUIElement, timeout: NSTimeInterval = 60,
                       file: String = #file, line: UInt = #line)
    {
        let exists = NSPredicate(format: "exists == true")

        expectationForPredicate(exists, evaluatedWithObject: element, handler: nil)
        waitForExpectationsWithTimeout(timeout) { (error) -> Void in
            if (error != nil)
            {
                let message = "Failed to find \(element) after \(timeout) seconds."
                self.recordFailureWithDescription(message,
                                                  inFile: file, atLine: line, expected: true)
            }
        }
    }
}

waitForExpectationsWithTimeout が正しく機能する例

テストケース

override func setUp()
{
    super.setUp()

    // Stop immediately when a failure occurs.
    continueAfterFailure = false

    XCUIApplication().launch()

    waitForElementExists(XCUIApplication().buttons["Foo"])
}

func testSample()
{
    print("Success")
}

これはうまくいきます!testSample呼び出されることはありません。

しかし、waitForElementExists 呼び出しをヘルパー メソッドに移動するとどうなるでしょうか。

waitForExpectationsWithTimeout が正常に返されるが、返すべきではない例

ここでは、アサーションが発生しなかったかのようにテスト ケースが続行されます。にブレークポイントを配置すると、それが true に設定されていることがwaitForElementExistsわかりcontinueAfterFailureます。したがって、メインのテスト ケースと同じコードに接続されていないことは明らかです。

テストケース

lazy var SomeHelper = SomeHelperClass()

override func setUp()
{
    super.setUp()

    // Stop immediately when a failure occurs.
    continueAfterFailure = false

    XCUIApplication().launch()

    SomeHelper.waitForReady()

}

func testSample()
{
    print("Success")
}

ヘルパー ファイル

class SomeHelperClass: XCTestCase
{
    /**
    Wait for the button to be loaded
    */
    func waitForReady()
    {
        waitForElementExists(XCUIApplication().buttons["Foo"])
    }
}
4

1 に答える 1