Espresso TestingFramework-マッチャーの表示

Espressoフレームワークは、多くのビューマッチャーを提供します。マッチャーの目的は、ID、テキスト、子ビューの可用性など、ビューのさまざまな属性を使用してビューを照合することです。各マッチャーは、ビューの特定の属性に一致し、特定のタイプのビューに適用されます。たとえば、withIdマッチャーはビューのIdプロパティと一致し、すべてのビューに適用されますが、withTextマッチャーはビューのTextプロパティと一致し、TextViewのみに適用されます。

この章では、エスプレッソテストフレームワークによって提供されるさまざまなマッチャーと、エスプレッソマッチャーが構築されているHamcrestライブラリについて学びましょう。

ハムクレストライブラリ

Hamcrestライブラリは、エスプレッソテストフレームワークの範囲内で重要なライブラリです。Hamcrestは、それ自体がマッチャーオブジェクトを作成するためのフレームワークです。Espressoフレームワークは、Hamcrestライブラリを広範囲に使用し、必要に応じて拡張して、シンプルで拡張可能なマッチャーを提供します。

Hamcrestは、任意のオブジェクトをアサートするための単純な関数assertThatとマッチャーのコレクションを提供します。assertThatには3つの引数があり、次のようになります。

  • 文字列(テストの説明、オプション)

  • オブジェクト(実際)

  • マッチャー(予想)

リストオブジェクトに期待値があるかどうかをテストする簡単な例を書いてみましょう。

import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.MatcherAssert.assertThat;
@Test
public void list_hasValue() {
   ArrayList<String> list = new ArrayList<String>();
   list.add("John");
   assertThat("Is list has John?", list, hasItem("John"));
}

ここで、hasItemはマッチャーを返します。マッチャーは、実際のリストにアイテムの1つとして値が指定されているかどうかを確認します。

Hamcrestには、多くの組み込みマッチャーと、新しいマッチャーを作成するためのオプションがあります。エスプレッソテストフレームワークで役立つ重要な組み込みマッチャーのいくつかは次のとおりです。

何でも-常にマッチャー

論理ベースのマッチャー

  • allOf −任意の数のマッチャーを受け入れ、すべてのマッチャーが成功した場合にのみ一致します。

  • anyOf −任意の数のマッチャーを受け入れ、いずれかのマッチャーが成功した場合は一致します。

  • not − 1つのマッチャーを受け入れ、マッチャーが失敗した場合にのみ一致し、その逆も同様です。

テキストベースのマッチャー

  • equalToIgnoringCase −実際の入力が大文字と小文字を無視して予想される文字列と等しいかどうかをテストするために使用されます。

  • equalToIgnoringWhiteSpace −大文字と小文字および空白を無視して、実際の入力が指定された文字列と等しいかどうかをテストするために使用されます。

  • containsString −実際の入力に指定された文字列が含まれているかどうかをテストするために使用されます。

  • endsWith −実際の入力が指定された文字列で始まるかどうかをテストするために使用されます。

  • startsWith −実際の入力が指定された文字列で終了するかどうかをテストするために使用されます。

数ベースのマッチャー

  • closeTo −実際の入力が期待値に近いかどうかをテストするために使用されます。

  • greaterThan −実際の入力が期待値より大きいかどうかをテストするために使用されます。

  • greaterThanOrEqualTo −実際の入力が期待値以上であるかどうかをテストするために使用されます。

  • lessThan −実際の入力が期待数より少ないかどうかをテストするために使用されます。

  • lessThanOrEqualTo −実際の入力が期待値以下であるかどうかをテストするために使用されます。

オブジェクトベースのマッチャー

  • equalTo −実際の入力が期待されるオブジェクトと等しいかどうかをテストするために使用されます

  • hasToString −実際の入力にtoStringメソッドがあるかどうかをテストするために使用されます。

  • instanceOf −実際の入力が期待されるクラスのインスタンスであるかどうかをテストするために使用されます。

  • isCompatibleType −実際の入力が期待されるタイプと互換性があるかどうかをテストするために使用されます。

  • notNullValue −実際の入力がnullでないかどうかをテストするために使用されます。

  • sameInstance −実際の入力と期待値が同じインスタンスであるかどうかをテストするために使用されます。

  • hasProperty −実際の入力に期待されるプロパティがあるかどうかをテストするために使用されます

is −砂糖またはequalToのショートカット

マッチャー

Espressoは、ビューを照合して検索するためのonView()メソッドを提供します。ビューマッチャーを受け入れ、一致したビューと対話するためにViewInteractionオブジェクトを返します。頻繁に使用されるビューマッチャーのリストを以下に説明します-

withId()

withId()はint型の引数を受け入れ、引数はビューのIDを参照します。ビューのIDを使用してビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withId(R.id.testView))

withText()

withText()文字列型の引数を受け入れ、引数はビューのテキストプロパティの値を参照します。ビューのテキスト値を使用してビューと一致するマッチャーを返します。TextViewにのみ適用されます。サンプルコードは次のとおりです。

onView(withText("Hello World!"))

withContentDescription()

withContentDescription()文字列型の引数を受け入れ、引数はビューのコンテンツ記述プロパティの値を参照します。ビューの説明を使用してビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withContentDescription("blah"))

テキスト自体の代わりに、テキスト値のリソースIDを渡すこともできます。

onView(withContentDescription(R.id.res_id_blah))

hasContentDescription()

hasContentDescription()には引数がありません。コンテンツの説明があるビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), hasContentDescription()))

withTagKey()

withTagKey()文字列型の引数を受け入れ、引数はビューのタグキーを参照します。タグキーを使用してビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withTagKey("blah"))

タグ名自体の代わりに、タグ名のリソースIDを渡すこともできます。

onView(withTagKey(R.id.res_id_blah))

withTagValue()

withTagValue()は、Matcher <Object>型の引数を受け入れ、引数はビューのタグ値を参照します。タグ値を使用してビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withTagValue(is((Object) "blah")))

ここで、あるHamcrest照合されます。

withClassName()

withClassName()は、Matcher <String>型の引数を受け入れ、引数はビューのクラス名の値を参照します。クラス名を使用してビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withClassName(endsWith("EditText")))

ここで、endsWithはHamcrestマッチャーであり、Matcher <String>を返します。

withHint()

withHint()は、Matcher <String>型の引数を受け入れ、引数はビューのヒント値を参照します。ビューのヒントを使用してビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withClassName(endsWith("Enter name")))

withInputType()

withInputType()は、int型の引数を受け入れ、引数はビューの入力型を参照します。入力タイプを使用してビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withInputType(TYPE_CLASS_DATETIME))

ここで、TYPE_CLASS_DATETIMEは、日付と時刻をサポートする編集ビューを指します。

withResourceName()

withResourceName()は、Matcher <String>型の引数を受け入れ、引数はビューのクラス名の値を参照します。ビューのリソース名を使用してビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withResourceName(endsWith("res_name")))

文字列引数も受け入れます。サンプルコードは次のとおりです。

onView(withResourceName("my_res_name"))

withAlpha()

withAlpha()float型の引数を受け入れ、引数はビューのアルファ値を参照します。ビューのアルファ値を使用してビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withAlpha(0.8))

withEffectiveVisibility()

withEffectiveVisibility()は、ViewMatchers.Visibilityタイプの引数を受け入れ、引数はビューの有効な可視性を参照します。ビューの可視性を使用してビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))

withSpinnerText()

withSpinnerText()は、Matcher <String>型の引数を受け入れ、その引数は、スピナーの現在選択されているビューの値を参照します。選択したアイテムのtoString値に基づいてスピナーと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(withSpinnerText(endsWith("USA")))

文字列引数または文字列のリソースIDも受け入れます。サンプルコードは次のとおりです。

onView(withResourceName("USA"))
onView(withResourceName(R.string.res_usa))

withSubstring()

()をwithSubStringすることに似ています)withText(それはビューのテキスト値のテストストリングに役立ちます以外。

onView(withSubString("Hello"))

hasLinks()

hasLinks()には引数がなく、リンクのあるビューに一致するマッチャーを返します。TextViewにのみ適用されます。サンプルコードは次のとおりです。

onView(allOf(withSubString("Hello"), hasLinks()))

ここで、allOfはHamcrestマッチャーです。allOfは、渡されたすべてのマッチャーに一致するマッチャーを返します。ここでは、ビューを照合し、ビューのテキスト値にリンクがあるかどうかを確認するために使用されます。

hasTextColor()

hasTextColor()は、int型の単一の引数を受け入れ、引数は色のリソースIDを参照します。色に基づいてTextViewと一致するマッチャーを返します。TextViewにのみ適用されます。サンプルコードは次のとおりです。

onView(allOf(withSubString("Hello"), hasTextColor(R.color.Red)))

hasEllipsizedText()

hasEllipsizedText()には引数がありません。長いテキストがあり、楕円形(最初の..10 ..最後)または切り取られた(最初の…)TextViewに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_text_view_id), hasEllipsizedText()))

hasMultilineText()

hasMultilineText()には引数がありません。複数行のテキストを持つTextViewに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_test_view_id), hasMultilineText()))

hasBackground()

hasBackground()は、int型の単一の引数を受け入れ、引数はバックグラウンドリソースのリソースIDを参照します。バックグラウンドリソースに基づいてビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId("image"), hasBackground(R.drawable.your_drawable)))

hasErrorText()

hasErrorText()はMatcher <String>型の引数を受け入れ、引数はビューの(EditText)エラー文字列値を参照します。ビューのエラー文字列を使用してビューと一致するマッチャーを返します。これはEditTextにのみ適用されます。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.editText_name), hasErrorText(is("name is required"))))

文字列引数も受け入れます。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.editText_name), hasErrorText("name is required")))

hasImeAction()

hasImeAction()は、Matcher <Integer>型の引数を受け入れ、引数はビュー(EditText)でサポートされている入力メソッドを参照します。サポートされているビューの入力メソッドを使用してビューと一致するマッチャーを返します。これはEditTextにのみ適用されます。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.editText_name),
hasImeAction(is(EditorInfo.IME_ACTION_GO))))

ここで、EditorInfo.IME_ACTION_GOは入力メソッドオプションの1つです。hasImeAction()は整数引数も受け入れます。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.editText_name),
hasImeAction(EditorInfo.IME_ACTION_GO)))

supportInputMethods()

supportInputMethods()には引数がありません。入力メソッドをサポートしている場合はビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.editText_name), supportsInputMethods()))

isRoot()

isRoot()には引数がありません。ルートビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_root_id), isRoot()))

表示されています()

isDisplayed()には引数がありません。現在表示されているビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), isDisplayed()))

isDisplayingAtLeast()

isDisplayingAtLeast()は、int型の単一の引数を受け入れます。少なくとも指定されたパーセンテージで現在表示されているビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), isDisplayingAtLeast(75)))

isCompletelyDisplayed()

isCompletelyDisplayed()には引数がありません。現在画面に完全に表示されているビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), isCompletelyDisplayed()))

有効になっています()

isEnabled()には引数がありません。有効になっているビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), isEnabled()))

isFocusable()

isFocusable()には引数がありません。フォーカスオプションのあるビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), isFocusable()))

hasFocus()

hasFocus()には引数がありません。現在フォーカスされているビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), hasFocus()))

isClickable()

isClickable()には引数がありません。クリックオプションであるビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), isClickable()))

isSelected()

isSelected()には引数がありません。現在選択されているビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), isSelected()))

isChecked()

isChecked()には引数がありません。これは、CompoundButton型(またはそのサブタイプ)であり、チェック状態にあるビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_view_id), isChecked()))

isNotChecked()

isNotChecked()はisCheckedの正反対です。サンプルコードは* follows、

onView(allOf(withId(R.id.my_view_id), isNotChecked()))

isJavascriptEnabled()

isJavascriptEnabled()には引数がありません。JavaScriptを評価しているWebViewに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.my_webview_id), isJavascriptEnabled()))

withParent()

withParent()は、Matcher <View>タイプの引数を1つ受け入れます。引数はビューを参照します。指定されたビューが親ビューであるビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.childView), withParent(withId(R.id.parentView))))

hasSibling()

hasSibling()は、Matcher> View <タイプの1つの引数を受け入れます。引数はビューを参照します。渡されたビューがその兄弟ビューの1つであるビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(hasSibling(withId(R.id.siblingView)))

withChild()

withChild()は、Matcher <View>タイプの引数を1つ受け入れます。引数はビューを参照します。渡されたビューが子ビューであるビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.parentView), withChild(withId(R.id.childView))))

hasChildCount()

hasChildCount()は、int型の引数を1つ受け入れます。引数は、ビューの子カウントを参照します。引数で指定されたのとまったく同じ数の子ビューを持つビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(hasChildCount(4))

hasMinimumChildCount()

hasMinimumChildCount()は、int型の引数を1つ受け入れます。引数は、ビューの子カウントを参照します。少なくとも引数で指定された数の子ビューを持つビューに一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(hasMinimumChildCount(4))

hasDescendant()

hasDescendant()は、Matcher <View>タイプの引数を1つ受け入れます。引数はビューを参照します。渡されたビューがビュー階層の子孫ビューの1つであるビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(hasDescendant(withId(R.id.descendantView)))

isDescendantOfA()

isDescendantOfA()は、Matcher <View>タイプの引数を1つ受け入れます。引数はビューを参照します。渡されたビューがビュー階層内の祖先ビューの1つであるビューと一致するマッチャーを返します。サンプルコードは次のとおりです。

onView(allOf(withId(R.id.myView), isDescendantOfA(withId(R.id.parentView))))