15

(Xcode 7)UI XCTestCaseテストケースを試していますが、多くのセル(4000以上)を持つUITableViewがある1つのUIViewの問題に遭遇しました。

アプリが正常に実行されている場合、表示されているセルのみがレンダリングされ、パフォーマンスの問題はまったくありません。ただし、XCTestCase を記録するコンテキスト内でアプリを実行し、この画面に移動すると、シミュレーターがフリーズします。これは、各セルが表示されているかのようにレンダリングされるためと思われます。ナビゲーションを手動でスクリプト化し、XCTestCase を実行すると、この画面に移動した直後にテスト ケースが失敗し、「UI テストの失敗 - 更新されたスナップショットの取得に失敗しました」というメッセージが表示されて終了します。時間内に終わらない。

これは、テスト フレームワークが表示中の画面のメタモデル全体を構築し、4000 以上のセルのそれぞれをビュー ツリー階層に追加するという事実に関係していると思います。

テスト コンテナーがすべてのセルのレンダリングを完了するのに十分な時間を与えることを期待して、期待値を追加しようとしましたが、これは機能しません。

これに対する回避策はありますか? UIツリー階層などの一部の構築をスキップすることは何とか可能ですか? 私の目標は、この画面の UI テストを記述できるようにすることです。

4

2 に答える 2

1

私は同じ問題を抱えていました。テーブル全体がロードされるのを待たなければならないのはイライラすることに同意しますが、それは次の回避策を使用してしなければならなかったことです.

これはあなたが探しているものではないかもしれませんが、他の人を助けるかもしれません:

基本的に、テーブル内のセルが等しくない場合、テーブルがまだロードされていることを意味する場合、テーブル内のセルを 2 回連続してカウントしています。それをループに入れて、両方のカウントが同じ数を返すまでそれを行います。これは、テーブルのロードが完了したことを意味します。次に、30 秒以上かかるとテストが失敗するように、30 秒停止します (私の場合はこれで十分でした)。テーブルがそれよりも長くかかる場合は、3 分間で数を 180 に増やすことができます。

    let startTime = NSDate()
    var duration : TimeInterval
    var cellCount1 : UInt = app.tables.cells.count
    var cellCount2 : UInt = app.tables.cells.count
    while (cellCount1 != cellCount2) {
        cellCount1 = app.tables.cells.count
        cellCount2 = app.tables.cells.count
        duration = NSDate().timeIntervalSince(startTime as Date)
        if (duration > 30) {
            XCTFail("Took too long waiting for cells to load")
        }
    }
    //Now I know the table is finished loading and I can tap on a cell
    app.tables.cells.element(boundBy: 1).tap()
于 2016-02-08T21:35:43.910 に答える