Платформа тестирования эспрессо - просмотр сопоставлений
Фреймворк Espresso предоставляет множество сопоставителей представлений. Назначение сопоставителя - сопоставить представление с использованием различных атрибутов представления, таких как идентификатор, текст и доступность дочернего представления. Каждое сопоставление соответствует определенным атрибутам представления и применяется к определенному типу представления. Например, сопоставление withId соответствует свойству Id представления и применяется ко всем представлениям, тогда как сопоставление withText соответствует свойству Text представления и применяется только к TextView .
В этой главе давайте изучим различные сопоставители, предоставляемые фреймворком для тестирования эспрессо, а также изучим библиотеку Hamcrest, на которой построены сопоставители эспрессо.
Библиотека Hamcrest
Библиотека Hamcrest - важная библиотека в рамках среды тестирования эспрессо. Hamcrest сам по себе является фреймворком для написания объектов сопоставления. Фреймворк Espresso широко использует библиотеку Hamcrest и расширяет ее по мере необходимости, предоставляя простые и расширяемые сопоставители.
Hamcrest предоставляет простую функцию assertThat и набор сопоставителей для утверждения любых объектов. assertThat имеет три аргумента, как показано ниже -
Строка (описание теста, необязательно)
Объект (актуальный)
Матчер (ожидается)
Напишем простой пример, чтобы проверить, имеет ли объект списка ожидаемое значение.
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 возвращает сопоставление, которое проверяет, имеет ли фактический список значение, указанное в качестве одного из элементов.
Hamcrest имеет множество встроенных сопоставителей, а также возможности для создания новых сопоставителей. Некоторые из важных встроенных сопоставителей, полезных в среде тестирования эспрессо, следующие:
что угодно - всегда совпадают
Логические сопоставители
allOf - принимать любое количество сопоставлений и совпадений только в том случае, если все сопоставления выполнены успешно.
anyOf - принять любое количество сопоставлений и совпадений, если какое-либо сопоставление прошло успешно.
not - принять одно сопоставление и сопоставить только в случае сбоя сопоставления и наоборот.
Текстовые сопоставители
equalToIgnoringCase - используется для проверки того, соответствует ли фактический ввод ожидаемой строке, игнорируя регистр.
equalToIgnoringWhiteSpace - используется для проверки того, соответствует ли фактический ввод указанной строке, игнорируя регистр и пробелы.
containsString - используется для проверки, содержит ли фактический ввод указанную строку.
endsWith - используется для проверки того, начинается ли фактический ввод с указанной строки.
startsWith - используется для проверки того, заканчивается ли фактический ввод указанной строкой.
Числовые сопоставители
closeTo - используется для проверки того, близок ли фактический ввод к ожидаемому числу.
greaterThan - используется для проверки того, превышает ли фактический ввод ожидаемое число.
greaterThanOrEqualTo - используется для проверки того, действительно ли фактический ввод больше или равен ожидаемому числу.
lessThan - используется для проверки, меньше ли фактический ввод ожидаемого числа.
lessThanOrEqualTo - используется для проверки, действительно ли фактический ввод меньше или равен ожидаемому числу.
Сопоставители на основе объектов
equalTo - используется для проверки, равен ли фактический ввод ожидаемому объекту
hasToString - используется для проверки наличия метода toString на фактическом входе.
instanceOf - используется для проверки того, является ли фактический ввод экземпляром ожидаемого класса.
isCompatibleType - используется для проверки совместимости фактического ввода с ожидаемым типом.
notNullValue - используется для проверки того, не является ли фактический ввод нулевым.
sameInstance - используется для проверки того, принадлежат ли фактический и ожидаемый ввод к одному и тому же экземпляру.
hasProperty - используется для проверки того, имеет ли фактический ввод ожидаемое свойство
is - сахар или сокращение для равного
Матчеры
Espresso предоставляет метод onView () для сопоставления и поиска представлений. Он принимает сопоставители представлений и возвращает объект ViewInteraction для взаимодействия с сопоставленным представлением. Часто используемый список сопоставителей представлений описан ниже -
withId ()
withId () принимает аргумент типа int, а аргумент ссылается на идентификатор представления. Он возвращает сопоставление, которое соответствует представлению с использованием идентификатора представления. Пример кода выглядит следующим образом:
onView(withId(R.id.testView))
withText ()
withText () принимает аргумент типа строка, а аргумент ссылается на значение свойства текста представления. Он возвращает сопоставление, которое соответствует представлению, используя текстовое значение представления. Это применимо только к TextView . Пример кода выглядит следующим образом:
onView(withText("Hello World!"))
withContentDescription ()
withContentDescription () принимает аргумент типа строка, а аргумент ссылается на значение свойства описания содержимого представления. Он возвращает сопоставление, которое соответствует представлению, используя описание представления. Пример кода выглядит следующим образом:
onView(withContentDescription("blah"))
Мы также можем передать идентификатор ресурса текстового значения вместо самого текста.
onView(withContentDescription(R.id.res_id_blah))
hasContentDescription ()
hasContentDescription () не имеет аргументов. Он возвращает сопоставление, которое соответствует представлению с любым описанием содержимого. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.my_view_id), hasContentDescription()))
withTagKey ()
withTagKey () принимает аргумент типа строка, а аргумент ссылается на ключ тега представления. Он возвращает сопоставление, которое соответствует представлению, используя его ключ тега. Пример кода выглядит следующим образом:
onView(withTagKey("blah"))
Мы также можем передать идентификатор ресурса имени тега вместо самого имени тега.
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")))
Здесь заканчивается совпадение с 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>, и этот аргумент ссылается на значение текущего выбранного представления Spinner. Он возвращает сопоставление, которое соответствует счетчику на основе значения toString выбранного элемента. Пример кода выглядит следующим образом:
onView(withSpinnerText(endsWith("USA")))
Он также принимает строковый аргумент или идентификатор ресурса строки. Пример кода выглядит следующим образом:
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, а аргумент ссылается на идентификатор ресурса цвета. Он возвращает сопоставление, которое соответствует TextView на основе его цвета. Это применимо только к TextView . Пример кода выглядит следующим образом:
onView(allOf(withSubString("Hello"), hasTextColor(R.color.Red)))
hasEllipsizedText ()
hasEllipsizedText () не имеет аргументов. Он возвращает сопоставление, которое соответствует 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, а аргумент ссылается на идентификатор ресурса фонового ресурса. Он возвращает сопоставление, которое соответствует представлению на основе его фоновых ресурсов. Пример кода выглядит следующим образом:
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 является одним из вариантов методов ввода. hasImeAction () также принимает целочисленный аргумент. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.editText_name),
hasImeAction(EditorInfo.IME_ACTION_GO)))
supportsInputMethods ()
supportsInputMethods () не имеет аргументов. Он возвращает сопоставление, которое соответствует представлению, если оно поддерживает методы ввода. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.editText_name), supportsInputMethods()))
isRoot ()
isRoot () не имеет аргументов. Он возвращает сопоставление, которое соответствует корневому представлению. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.my_root_id), isRoot()))
isDisplayed ()
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 () не имеет аргументов. Он возвращает сопоставление, которое соответствует представлению типа CompoundButton (или его подтипу) и находится в проверенном состоянии. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.my_view_id), isChecked()))
isNotChecked ()
isNotChecked () прямо противоположен isChecked. Пример кода * следующий,
onView(allOf(withId(R.id.my_view_id), isNotChecked()))
isJavascriptEnabled ()
isJavascriptEnabled () не имеет аргументов. Он возвращает сопоставление, которое соответствует WebView, оценивающему JavaScript. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.my_webview_id), isJavascriptEnabled()))
withParent ()
withParent () принимает один аргумент типа Matcher <View>. Аргумент ссылается на точку зрения. Он возвращает сопоставление, которое соответствует представлению, в котором указанное представление является родительским. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.childView), withParent(withId(R.id.parentView))))
hasSibling ()
hasSibling () принимает один аргумент типа Matcher> View <. Аргумент ссылается на точку зрения. Он возвращает сопоставление, которое соответствует представлению, которое переданное представление является одним из его родственных представлений. Пример кода выглядит следующим образом:
onView(hasSibling(withId(R.id.siblingView)))
с ребенком()
withChild () принимает один аргумент типа Matcher <View>. Аргумент ссылается на точку зрения. Он возвращает сопоставление, которое соответствует представлению, которое переданное представление является дочерним представлением. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.parentView), withChild(withId(R.id.childView))))
hasChildCount ()
hasChildCount () принимает один аргумент типа int. Аргумент ссылается на количество дочерних элементов представления. Он возвращает сопоставление, которое соответствует представлению, которое имеет точно такое же количество дочерних представлений, как указано в аргументе. Пример кода выглядит следующим образом:
onView(hasChildCount(4))
hasMinimumChildCount ()
hasMinimumChildCount () принимает один аргумент типа int. Аргумент ссылается на количество дочерних элементов представления. Он возвращает сопоставление, которое соответствует представлению, у которого есть по крайней мере количество дочерних представлений, как указано в аргументе. Пример кода выглядит следующим образом:
onView(hasMinimumChildCount(4))
hasDescendant ()
hasDescendant () принимает один аргумент типа Matcher <View>. Аргумент ссылается на точку зрения. Он возвращает сопоставление, которое соответствует представлению, которое переданное представление является одним из представлений-потомков в иерархии представлений. Пример кода выглядит следующим образом:
onView(hasDescendant(withId(R.id.descendantView)))
isDescendantOfA ()
isDescendantOfA () принимает один аргумент типа Matcher <View>. Аргумент ссылается на точку зрения. Он возвращает сопоставление, которое соответствует представлению, которое переданное представление является одним из представлений-предков в иерархии представлений. Пример кода выглядит следующим образом:
onView(allOf(withId(R.id.myView), isDescendantOfA(withId(R.id.parentView))))