2016-07-02 6 views
1

数日前、私は技術評価の目的で '新しい' XCUI Testingフレームワークを使い始めました。非常に頻繁にテストが失敗する(通常、.tap()を使ったボタン押下は単にボタンアクションをトリガーしない)ので、私はシステムがかなり不安定であることがわかります.Xcodeを再起動してDerivedDataキャッシュをクリアして再度動作させる必要があります。しかし、この1つのことは私が一生働くことができません - それは利用可能な最も簡単なUIテストのユースケースです:UILabelの新しいテキスト値がXCUIテスト内で更新されない

私はUIButtonとUILabelを持っています。 UILabelは当初、テキスト「初期テキスト」を持っています。ボタンのラベルは「メッセージを表示」です。ボタンを押すと、ラベルのテキストが「新しいテキスト」に変更されます。そして明らかにこれは、アプリケーションを実行するときに動作します。 ;私は、次のXCUIテストを実行する場合)

ただし、(アプリケーションのインスタンスを初期化されていたと打ち上げ()セットアップでED()):

app.buttons["SHOW MESSAGE"].tap() 
    XCTAssert(app.staticTexts["new text"].exists) 

テストが100%の時間を失敗しました。 print(app.staticTexts.debugDescription)を使用して静的テキストを印刷した後(.tap()呼び出し後)、私のラベルはそこに「初期テキスト」の元のテキストが表示されます。

このXCUIのすべてはまだ本当にアルファのものか何ですか?

答えて

0

ラベルにアクセシビリティ識別子を設定し、XCUIElement.labelを使用してテキストを取得します。

XCTAssertEqual("new text", app.staticTexts["yourAccessibilityLabel"].label) 

これは、ラベルから最新のテキストを取得する必要があります。

ボタンをタップした後、新しいビュー階層スナップショットを作成する必要があります。ラベルの新しい値を見つけようとすると、これを示すデバッグログがあるはずです。キャッシュされたスナップショットの使用については言及してはいけません。

+0

まあ、私もそれを試してみました。私はラベルのアクセシビリティ識別子を 'messageLabel'に設定し、そのように試みましたが、次のエラーが出ました:' Assertion Failure:XCTAssertEqual failed :("オプション(" new text ")")が( "Optional(" initialテキスト ")") - ' – Matti

+0

新しい値を見つけるためにビュー階層が更新されていないようです。 expectationForPredicate(またはexpectationWithDescription)とwaitForExpectationsWithTimeoutを数秒間試してみてください。これにより、チェックが発生するたびにビュー階層が更新されます。 – Oletha

+0

また、値がアプリコードの複数の場所に設定されている可能性があります。ストーリーボードまたはペン先のラベルに値が設定されていますか?これは、ボタンが押されたときのイベントハンドラの値を変更すると、XCTestの値を上書きすることがあります。すべてのラベル値をプログラムで設定し、storyboard/nibから値を削除します。 – Oletha

0

期待通りに試してください。ここでは、コード:

let exists = NSPredicate(format: "exists == 1") 
let label = app.staticTexts["new text"] 
expectationForPredicate(exists, evaluatedWithObject: label, handler: nil) 
waitForExpectationsWithTimeout(5) { error in 
      if error != nil { 
       assertionFailure("error") 
      } 
     } 

乾杯

+0

それを試してみてください。事は、ラベルがすでに存在していることです=当初から真です。ここでの実際の問題は、 'app.buttons [" foobutton "]。tap()'がボタンの動作をほとんどトリガしていないことです。テストフレームワークのバグを考慮する必要があります。 tap()からのエラーはありません。ただ何もしません。 – Matti

0

は、だから、これは正しく初期化するためのフレームワークを可能にするために、1秒スリープ()セットアップで()メソッドを追加する必要についてだったが判明しました。一口。

関連する問題