Espressoテストフレームワーク-AdapterView

AdapterViewは、Adapterを使用して基になるデータソースからフェッチされた製品リストやユーザー連絡先などの同様の情報のコレクションをレンダリングするために特別に設計された特別な種類のビューです。データソースは、単純なリストから複雑なデータベースエントリまでです。由来ビューの一部AdapterViewはあるのListViewGridViewコントロールスピナー

AdapterViewは、基になるデータソースで使用可能なデータの量に応じて、ユーザーインターフェイスを動的にレンダリングします。さらに、AdapterViewは、画面の使用可能な表示領域にレンダリングできる必要最小限のデータのみをレンダリングします。AdapterViewは、メモリを節約し、基になるデータが大きい場合でもユーザーインターフェイスをスムーズに見せるためにこれを行います。

分析すると、AdapterViewアーキテクチャの性質により、テスト対象の特定のビューが最初からまったくレンダリングされない可能性があるため、onViewオプションとそのビューマッチャーは無関係になります。幸い、espressoはメソッドonData()を提供します。このメソッドは、基になるデータと一致するハムクレストマッチャー(基になるデータのデータ型に関連)を受け入れ、一致したデータのビューに対応するタイプDataInteractionのオブジェクトを返します。サンプルコードは次のとおりです。

onData(allOf(is(instanceOf(String.class)), startsWith("Apple"))).perform(click())

ここで、onData()は、基になるデータ(配列リスト)で使用可能な場合、エントリ「Apple」と一致し、一致したビュー(「Apple」エントリに対応するTextView )と対話するためにDataInteractionオブジェクトを返します。

メソッド

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を選択し、一致したAdapterViewと対話するためにDataInteractionオブジェクトを返します。

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ベースの製品リストの[購入]ボタンなどの特定のアイテムを操作できます。

onData(allOf(is(instanceOf(String.class)), startsWith("Apple")))
   .onChildView(withId(R.id.buy_button))
   .perform(click())

サンプルアプリケーションを作成する

以下に示す手順に従って、AdapterViewに基づく単純なアプリケーションを作成し、onData()メソッドを使用してテストケースを作成します。

  • AndroidStudioを起動します。

  • 前に説明したように新しいプロジェクトを作成し、MyFruitAppという名前を付けます。

  • リファクタリング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);
}
  • 次に、コードをコンパイルしてアプリケーションを実行します。MyFruitアプリのスクリーンショットは次のとおりです。

  • ここで、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のコンテキストメニューを使用してテストケースを実行し、すべてのテストケースが成功しているかどうかを確認します。