バックグラウンド
次のテストは、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"])
}
}