Espresso 테스트 프레임 워크-매처보기

Espresso 프레임 워크는 많은 뷰 매처를 제공합니다. matcher의 목적은 Id, Text 및 하위보기의 가용성과 같은보기의 다른 속성을 사용하여보기를 일치시키는 것입니다. 각 매처는보기의 특정 속성과 일치하며 특정 유형의보기에 적용됩니다. 예를 들어 withId 매처 는 뷰 의 Id 속성 과 일치하고 모든 뷰에 적용되는 반면 withText 매처 는 뷰 의 Text 속성 과 일치하고 TextView 에만 적용 됩니다.

이 장에서는 에스프레소 테스트 프레임 워크에서 제공하는 다양한 매처를 배우고 에스프레소 매 처가 구축 된 Hamcrest 라이브러리에 대해 알아 보겠습니다 .

햄 크레스트 도서관

Hamcrest 라이브러리는 에스프레소 테스트 프레임 워크 범위에서 중요한 라이브러리입니다. Hamcrest 는 그 자체로 matcher 객체를 작성하기위한 프레임 워크입니다. Espresso 프레임 워크는 Hamcrest 라이브러리를 광범위하게 사용 하며 간단하고 확장 가능한 매처를 제공하기 위해 필요할 때마다 확장합니다.

Hamcrest 는 간단한 assertThat 함수 와 모든 객체를 주장하는 매처 모음을 제공합니다. assertThat 에는 세 가지 인수가 있으며 다음과 같습니다.

  • 문자열 (테스트에 대한 설명, 선택 사항)

  • 개체 (실제)

  • Matcher (예상)

목록 객체에 예상 값이 있는지 테스트하는 간단한 예제를 작성해 보겠습니다.

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 은 실제 목록에 항목 중 하나로 지정된 값이 있는지 확인하는 matcher를 반환합니다.

Hamcrest 에는 많은 내장 매처와 새로운 매처를 생성하는 옵션이 있습니다. 에스프레소 테스트 프레임 워크에서 유용한 몇 가지 중요한 내장 매처는 다음과 같습니다.

무엇이든-항상 매처

논리적 기반 매처

  • allOf − 모든 일치자가 성공한 경우에만 원하는 수의 일치 자와 일치를 허용합니다.

  • anyOf -한 명의 일치자가 성공하면 원하는 수의 일치 자와 일치를 허용합니다.

  • not -한 명의 매처를 수락하고 매 처가 실패한 경우에만 일치하며 그 반대의 경우도 마찬가지입니다.

텍스트 기반 매처

  • equalToIgnoringCase − 실제 입력이 대소 문자를 무시하고 예상되는 문자열과 같은지 테스트하는 데 사용됩니다.

  • equalToIgnoringWhiteSpace − 실제 입력이 대소 문자와 공백을 무시하고 지정된 문자열과 같은지 테스트하는 데 사용됩니다.

  • containsString − 실제 입력에 지정된 문자열이 포함되어 있는지 테스트하는 데 사용됩니다.

  • endsWith − 실제 입력이 지정된 문자열로 시작하는지 테스트하는 데 사용됩니다.

  • startsWith − 실제 입력이 지정된 문자열로 끝나는 지 여부를 테스트하는 데 사용됩니다.

숫자 기반 매처

  • closeTo − 실제 입력이 예상 수치에 가까운 지 테스트하는 데 사용됩니다.

  • greaterThan − 실제 입력이 예상 숫자보다 큰지 테스트하는 데 사용됩니다.

  • greaterThanOrEqualTo − 실제 입력이 예상 숫자보다 크거나 같은지 테스트하는 데 사용됩니다.

  • lessThan − 실제 입력이 예상 숫자보다 작은 지 테스트하는 데 사용됩니다.

  • lessThanOrEqualTo − 실제 입력이 예상 숫자보다 작거나 같은지 테스트하는 데 사용됩니다.

개체 기반 매처

  • equalTo − 실제 입력이 예상 객체와 같은지 테스트하는 데 사용

  • hasToString − 실제 입력에 toString 메서드가 있는지 테스트하는 데 사용됩니다.

  • instanceOf − 실제 입력이 예상 클래스의 인스턴스인지 테스트하는 데 사용됩니다.

  • isCompatibleType − 실제 입력이 예상 유형과 호환되는지 테스트하는 데 사용됩니다.

  • notNullValue − 실제 입력이 null이 아닌지 테스트하는 데 사용됩니다.

  • sameInstance − 실제 입력과 예상이 동일한 인스턴스인지 테스트하는 데 사용됩니다.

  • hasProperty − 실제 입력에 예상 속성이 있는지 테스트하는 데 사용

is − Sugar 또는 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이고 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")))

문자열 인수 또는 문자열의 리소스 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 matcher입니다. allOf 는 전달 된 모든 matcher와 일치하는 matcher를 반환하며 여기에서는보기와 일치시키고보기의 텍스트 값에 링크가 있는지 확인하는 데 사용됩니다.

hasTextColor ()

hasTextColor () 는 int 유형의 단일 인수를 허용하며 인수는 색상의 리소스 ID를 참조합니다. 색상에 따라 TextView 와 일치하는 matcher를 반환합니다 . TextView 에만 적용 됩니다. 샘플 코드는 다음과 같습니다.

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

hasEllipsizedText ()

hasEllipsizedText () 에는 인수가 없습니다. 긴 텍스트가 있고 생략 된 (first .. ten .. last) 또는 잘려진 (first…) TextView와 일치하는 matcher를 반환합니다. 샘플 코드는 다음과 같습니다.

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는 입력 방법 옵션에 있습니다. 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 () 에는 인수가 없습니다. 현재 화면에 완전히 표시된 뷰와 일치하는 matcher를 반환합니다. 샘플 코드는 다음과 같습니다.

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

사용 가능()

isEnabled () 에는 인수가 없습니다. 활성화 된 뷰와 일치하는 매처를 반환합니다. 샘플 코드는 다음과 같습니다.

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

isFocusable ()

isFocusable () 에는 인수가 없습니다. 포커스 옵션이있는 뷰와 일치하는 matcher를 반환합니다. 샘플 코드는 다음과 같습니다.

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

hasFocus ()

hasFocus () 에는 인수가 없습니다. 현재 초점이 맞춰진 뷰와 일치하는 matcher를 반환합니다. 샘플 코드는 다음과 같습니다.

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와 반대입니다. 샘플 코드는 * 다음과 같습니다.

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

isJavascriptEnabled ()

isJavascriptEnabled () 에는 인수가 없습니다. JavaScript를 평가하는 WebView와 일치하는 matcher를 반환합니다. 샘플 코드는 다음과 같습니다.

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 ()

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))))