2017-01-25 15 views
2

私はXCTestを使用してかなり複雑なUIテストを書いていましたが、最近はEarlGreyに切り替えました。これは、はるかに高速で信頼性が高いためです。テストはビルドサーバー上でランダムに失敗するわけではなく、走るのに最大30分!無作為に選択するEarlGrey

私がXCTestで行うことができたEarlGreyでできなかったことの1つは、要素をランダムに選択することでした。

例えば、カレンダーcollectionViewに、私は「識別子」NSPredicateを使用して、すべてのcollectionViewCell秒を照会して、ランダムにインデックスを取得するために[XCUIElementQuery count]を使用して日を選択し、次にtapことができます。

今のところハードコードしますが、私はアプリケーションコードを変更するとテストを書き直す必要がないように日付の選択をランダム化したいと思います。

これを解決することを楽しみにして、私が詳しく説明できるかどうかお知らせください。

+0

あなたは 'atIndex' APIを見ましたか?あなたは次のようなことができるはずです:[[[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@ "Collectio nViewCell")] atIndex:0] assert:foo()]; –

+0

残念ながら、EarlGreyは一致する要素の数を提供していないので、他の方法でそれを把握しなければなりません。 –

答えて

4

ステップ1、要素を数えることができるマッチャを書き込むGREYElementMatcherBlockを用い所定の整合に一致:

- (NSUInteger)elementCountMatchingMatcher:(id<GREYMatcher>)matcher { 
    __block NSUInteger count = 0; 
    GREYElementMatcherBlock *countMatcher = [GREYElementMatcherBlock matcherWithMatchesBlock:^BOOL(id element) { 
    if ([matcher matches:element]) { 
     count += 1; 
    } 
    return NO; // return NO so EarlGrey continues to search. 
    } descriptionBlock:^(id<GREYDescription> description) { 
    // Pass 
    }]; 
    NSError *unused; 
    [[EarlGrey selectElementWithMatcher:countMatcher] assertWithMatcher:grey_notNil() error:&unused]; 
    return count; 
} 

ステップ2使用%

NSUInteger randomIndex = arc4random() % count; 

ランダムインデックスを選択しますステップ3最後にを使用します。はランダム要素を選択し、その要素に対してアクション/アサーションを実行します。

// Count all UIView's 
NSUInteger count = [self elementCountMatchingMatcher:grey_kindOfClass([UIView class])]; 
// Find a random index. 
NSUInteger randIndex = arc4random() % count; 
// Tap the random UIView 
[[[EarlGrey selectElementWithMatcher:grey_kindOfClass([UIView class])] 
    atIndex:randIndex] 
    performAction:grey_tap()]; 
+0

これはすばらしいです、ありがとうございます。いくつか質問があります。私は本当にこれを理解したいからです: 1.なぜブロックでNO;を返すのですか? 'YES'を返すと、そのブロックは要素の反復処理を停止しますか? 2.以下の行は、 'count'を増やした要素がすべて存在すると主張していますか? 'NSError * unused; [[EarlGrey selectElementWithMatcher:countMatcher] assertWithMatcher:grey_notNil()エラー:&未使用]; ' もう一度、これは素晴らしいです、ありがとうございます。 – ArielSD

+0

また、これはすばらしく機能します! 最後の質問: 「NSError * unused」を作成しなくても、どうやってエラーが発生することはありませんか? – ArielSD

+1

あなたは1で始まります: 'YES'は反復を止めます。約2:これらの行は、実際にEarlGrey文が失敗してもEarlGreyが例外を発生させないように、EarlGreyが例外を発生させないようにエラーオブジェクトを渡します。countが0の場合に発生します。ここで要素数を取得することにのみ関係します)。あなたの歓迎! – Gautam

関連する問題