Espresso-testing-adapterview
エスプレッソテストフレームワーク-AdapterView
AdapterView_は、_Adapter_を使用して、基になるデータソースから取得した製品リストやユーザーの連絡先などの類似情報のコレクションをレンダリングするために特別に設計された特別な種類のビューです。 データソースは、複雑なデータベースエントリの単純なリストです。 _AdapterView_から派生したビューには、_ListView _、 GridView_、および_Spinner_があります。
_AdapterView_は、基になるデータソースで利用可能なデータの量に応じて、ユーザーインターフェイスを動的にレンダリングします。 さらに、_AdapterView_は、必要な最小限のデータのみをレンダリングします。これは、画面の使用可能な可視領域にレンダリングできます。 _AdapterView_は、基になるデータが大きい場合でもメモリを節約し、ユーザーインターフェイスを滑らかに見せるためにこれを行います。
分析すると、AdapterView_アーキテクチャの性質により、_onView_オプションとそのビューマッチャーが無関係になります。これは、テストする特定のビューが最初はまったくレンダリングされない可能性があるためです。 幸いなことに、espressoは_onData()メソッドを提供します。このメソッドは、基になるデータに一致するハムクレストマッチャー(基になるデータのデータ型に関連)を受け入れ、一致したデータのビューに対応する_DataInteraction_型のオブジェクトを返します。 サンプルコードは次のとおりです。
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())
ここで、_onData()_は、基になるデータ(配列リスト)で使用可能な場合、エントリ "Apple"に一致し、_DataInteraction_オブジェクトを返し、一致したビュー( "Apple"エントリに対応するTextView)と対話します。
方法
_DataInteraction_は、ビューと対話する以下のメソッドを提供します。
perform()
これは、ビューアクションを受け入れ、渡されたビューアクションを起動します。
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())
小切手()
これはビューアサーションを受け入れ、渡されたビューアサーションをチェックします。
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.check(matches(withText("Apple")))
inAdapterView()
これはビューマッチャーを受け入れます。 ビューマッチャーで渡された特定の_AdapterView_を選択し、_DataInteraction_オブジェクトを返し、一致した_AdapterView_と対話します。
onData(allOf())
.inAdapterView(withId(R.id.adapter_view))
.atPosition(5)
.perform(click())
atPosition()
これは整数型の引数を受け入れ、基になるデータ内のアイテムの位置を参照します。 渡されたデータの位置値に対応するビューを選択し、_DataInteraction_オブジェクトを返し、一致したビューと対話します。 基になるデータの正しい順序がわかっている場合に役立ちます。
onData(allOf())
.inAdapterView(withId(R.id.adapter_view))
.atPosition(5)
.perform(click())
onChildView()
これはビューマッチャーを受け入れ、特定の子ビュー内のビューと一致します。 たとえば、_AdapterView_に基づく製品リストの_Buy_ボタンなどの特定のアイテムを操作できます。
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.onChildView(withId(R.id.buy_button))
.perform(click())
サンプルアプリケーションを作成する
以下に示す手順に従って、_AdapterView_に基づく単純なアプリケーションを作成し、_onData()_メソッドを使用してテストケースを作成します。
- Androidスタジオを起動します。
- 前述のように新しいプロジェクトを作成し、_MyFruitApp_という名前を付けます。
- Refactor→Migrate to _AndroidX_オプションメニューを使用して、アプリケーションをAndroidXフレームワークに移行します。
- メインアクティビティのデフォルトデザインを削除し、_ListView_を追加します。 _activity_main.xml_の内容は次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".MainActivity">
<ListView
android:id = "@+id/listView"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"/>
</RelativeLayout>
- 新しいレイアウトリソース_item.xml_を追加して、リストビューのアイテムテンプレートを指定します。 _item.xml_の内容は次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?>
<TextView xmlns:android = "http://schemas.android.com/apk/res/android"
android:id = "@+id/name"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:padding = "8dp"
/>
- 次に、基本データとしてフルーツ配列を持つアダプターを作成し、リストビューに設定します。 これは、以下で指定するように、_MainActivity_の_onCreate()_で行う必要があります。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Find fruit list view
final ListView listView = (ListView) findViewById(R.id.listView);
//Initialize fruit data
String[] fruits = new String[]{
"Apple",
"Banana",
"Cherry",
"Dates",
"Elderberry",
"Fig",
"Grapes",
"Grapefruit",
"Guava",
"Jack fruit",
"Lemon",
"Mango",
"Orange",
"Papaya",
"Pears",
"Peaches",
"Pineapple",
"Plums",
"Raspberry",
"Strawberry",
"Watermelon"
};
//Create array list of fruits
final ArrayList<String> fruitList = new ArrayList<String>();
for (int i = 0; i < fruits.length; ++i) {
fruitList.add(fruits[i]);
}
//Create Array adapter
final ArrayAdapter adapter = new ArrayAdapter(this, R.layout.item, fruitList);
//Set adapter in list view
listView.setAdapter(adapter);
}
- 次に、コードをコンパイルしてアプリケーションを実行します。 _My Fruit App_のスクリーンショットは次のとおりです。
- 次に、_ExampleInstrumentedTest.java_ファイルを開き、以下に指定されているように_ActivityTestRule_を追加します。
@Rule
public ActivityTestRule<MainActivity> mActivityRule =
new ActivityTestRule<MainActivity>(MainActivity.class);
また、テスト構成が_app/build.gradle_で行われていることを確認してください-
dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test:rules:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
- 新しいテストケースを追加して、以下のようにリストビューをテストします。
@Test
public void listView_isCorrect() {
//check list view is visible
onView(withId(R.id.listView)).check(matches(isDisplayed()));
onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click());
onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
.check(matches(withText("Apple")));
//click a child item
onData(allOf())
.inAdapterView(withId(R.id.listView))
.atPosition(10)
.perform(click());
}
- 最後に、Android Studioのコンテキストメニューを使用してテストケースを実行し、すべてのテストケースが成功するかどうかを確認します。