web-dev-qa-db-ja.com

Espressoを使用したGoogleマップの単体テスト

Espressoを使用して、アプリでUIテストを行っています。マップ付きのフラグメントがあり、バックエンドへの呼び出しで取得したアイテムをいくつか表示しています。

マーカーをクリックすると、UIが実行されます

エスプレッソを使用してマップ上でユニットテストを実行する方法はありますか?

21
user2230304

短い答え:エスプレッソを使うことは実際には不可能です。解決策は、UIAutomatorを使用することです: https://developer.Android.com/tools/testing-support-library/index.html#UIAutomatorhttps://developer.Android。 com/training/tests/ui-testing/uiautomator-testing.html

したがって、次のことを行う必要があります。

1)gradleの依存関係を追加します:

_dependencies {
androidTestCompile 'com.Android.support.test:runner:0.2'
androidTestCompile 'com.Android.support.test:rules:0.2'
androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.1' }
_

2)マーカーを使用していない場合でも、マーカーに少なくともタイトルを追加してください。

3)テストを記述します。コードは次のようになります。

_UiDevice device = UiDevice.getInstance(getInstrumentation());
UiObject marker = device.findObject(new UiSelector().descriptionContains("marker title"));
marker.click();
_

説明:

GoogleMapはUIを生成し、アクセス可能にします。つまり、地図のコンテンツはユーザー補助ノード情報のツリーとして表示できます。

これはツリーであり、仮想ビューツリーであり、実際のビューツリーを表すものではありません。これについては後で説明します

デフォルトでは、マップのcontentDescriptionは「GoogleMap」であり、マーカーのcontentDescriptionは「{markerTitle}。{markerSnippet}」です。

次に、問題は、なぜエスプレッソを使用しないのかということです。

onView(withContentDescription("marker title. ")).perform(click());

しかし、それが見つからないため:

_onView(withContentDescription("Google Map")).perform(click());
_

うまく動作します。

では、なぜUIAutomatorは機能し、Espressoは機能しないのですか?

異なるビューツリーを使用しているため。

UIAutomatorはAccessibilityServiceによって提供されるアクセシビリティノード情報のツリーを使用しますが、Espressoはビュー階層を使用するため、任意のViewGroupのすべての子を処理します。アクセシビリティノード情報とビュー階層は、1対1でマップされる場合とされない場合があります。この場合

onView(withContentDescription( "Google Map"))

viewGroupではなくTextureViewを検出します。これは子を持っていることが知られていないため、Espressoはそこに何が描画されているかを知ることができません。

出来上がり! :)

54
kalin