2015-12-16 9 views
14

私は、XCode 7のXCTest UIテスト機能を使用してツリーウォーカーを作成しようとしています。これは、テーブルビューの確定的なツリーを特定の深度まで体系的に調べています。特定の要素のタップが実際に新しい画面への遷移を引き起こしたかどうかを確実に検出することができないことを除いて、ほとんど機能します。私は、ナビゲーションバーのラベルが変更されたか、またはメニュー要素の数が変更されたかを検出するための、ほとんどの場合に機能するハッキリメソッドを持っています。XCode UIテストで画面が変更されたことをどのように検出できますか?

連続した画面に同じナビゲーションバーラベル(私が歩いているコードベースは私のものではない)があるため、最初のテストでは偽陰性が発生します。 2番目のテストでは誤検出があります。これは、表要素をクリックしても別の表/画面に移行しないで、現在の画面に余分な要素が追加されることがあるためです。

読書をした後、アクセシビリティラベルを使用すると、やり遂げる方法があるようです。そこで、navDのアクセシビリティラベルのUIDをアプリケーションコード(viewDidAppear内)に設定し、UIテストコードでテストします。これはうまくいくはずですが、テストコードにはというゼロという値しか戻っていません。

私はUIテストに関してノーベルであり、私が何をしているのかをはっきりと理解することなく、他の人のコードを主にカット/ペースト/アダプテーションしていると自由に告白します。だから、アクセシビリティ・ラベル・コードそのものに、おそらく画面が変化したことを検出するための概念的なレベルで、おそらく何らかの素朴な災難を起こしているのです。たぶん私がやっていることができるもっと単純な/より慣用的なものがあるかもしれません。 XCTest UI試験において

- (void)viewDidAppear: (BOOL)animated { 

    [super viewDidAppear: animated]; 

    //... 

    UINavigationBar* navBar = self.navigationController.navigationBar; 
    if(navBar) 
    { 
     static NSInteger s_UID = 0; 
     navBar.topItem.accessibilityLabel = [NSString stringWithFormat:@"UID-%ld", s_UID++]; 
    } 
} 

:アプリケーションにおいて

firstElemが発見され、そしてIは、例えば抽出することができる午前こと

- (NSString*) navBarAccessibilityLabel: (XCUIApplication*) app 
{ 
    NSString* result = NULL; 

    XCUIElementQuery *navBars = app.navigationBars; 
    XCUIElement* firstElem = [navBars.staticTexts elementBoundByIndex:0]; 
    if(firstElem) 
    { 
     result = (NSString*)firstElem.accessibilityLabel; // This is always nil 
    } 

    return result; 
} 

firstElem.labelこれはとても幸いです。

助けてください。

#ifdef UITESTING 
- (void) viewDidAppear: animated 
{ 
    [super viewDidAppear: animated]; 
    // do your checking here 
} 
#endif 

をプロジェクトのテストターゲットでは、ビルド設定の下にあり:

+0

で素晴らしい記事を見つけることができますか? @カイトン? –

答えて

0

適切な識別子が(そう、あなたがそれらを区別することができます)、あなたが関与ビューコントローラにこれを追加することができ、あなたのView Controllerを与えていると仮定すると、 Proprocessorセクションです。ここでプリプロセッサマクロを設定できます。デバッグおよび/またはリリースの設定に 'UITESTING = 1'を追加するだけです。結果はテストビルドでUITESTINGが定義されるため、#ifdef UITESTINGの下のすべてのコードがプリプロセッサに含まれるようになります。

+0

明確にするために、このコードはUIテストプログラムまたはメインアプリケーションコードに含まれていますか? – Kaitain

+0

これは、テストをサポートするためにアプリケーションコードに追加されます。私はいくつかの適切な#ifdefがあなたのプロダクションコードからそれを保つことができると推測しています。 –

+0

さて...私は何かが欠けているように感じる。どのようなロジックが「ここであなたのチェックをしますか?」に入ることを意図していますか?アプリケーションコードの中で何かをチェックするのはなぜですか?私は、アプリケーションコードが何らかの識別子ラベルを何かに適用する必要があり、UIテストコードが後でそれを利用してスクリーン変更を検出すると想定していました。私はこの問題を解決する上で提案しているものの有用性を直ちに知ることができません(またはスクリーン変化を検出するというより一般的な問題への解決策を提示すること)。 このロジックを運用コードから外しておくことは大きな問題ではありません。 – Kaitain

5

あなたは要素がアクセス可能であるかどうかをテストすることができます:UIテストの内部

左クリックして録画を開始し、シミュレータが開始され、要素はXcodeのは、テストを書きますアクセス可能である場合は、シミュレータ内の要素をクリックすることができますtestExampleメソッドの中にあなたのためのコード。

enter image description here

またはシミュレータでアプリを実行し、アクセシビリティインスペクタを開き、詳細がインスペクタに表示される要素の上に置きます。それとは別に

enter image description here

、私はあなたのケースであなたがself.navigationItem.title = @"myScreen";

すなわち各画面のナビゲーションアイテムのタイトルを追加することでこれを確認することができそして

// let app = XCUIApplication() // Swift 

UIApplication *app = [UIApplication alloc] init]; // Objective-C 

XCTAssertEqual(app.navigationBars.element.identifier, "myScreen") // Don't forget to import class XCTest 
すなわちアサーションで画面を確認すると思います
+1

これは間違いなく便利です。ありがとう。しかし、私が知る限りでは、画面上の実際の見えるタイトルを変更します。私は、観測可能な値をまったく変更しない、何らかの種類の目に見えないタグを追加できることを期待していました。 (まあ、最終的にすべてのアクセシビリティデータは、オーディオであっても、何らかの形で観測可能であると考えられています。) – Kaitain

1

Facebook's Snapshot test libraryを使用してスナップショットテストを使用します。

ビューベースのテストとは、ユーザーに表示される内容が、ユーザーに表示されることを確認することを意味します。 これは、 異なるバージョンのビュー、または異なるビューの状態、 が同じように見えることを保証できることを意味します。ビューベースのテストを使用して、オブジェクトを囲む多くのユースケースをカバーする高レベルのテストを に提供できます。

あなたはuは任意のソリューションを手に入れた、より詳細here.

関連する問題