Espresso-Intents

Espresso-Intents는 Espresso의 확장 프로그램으로, 유효성 검사와 인텐트에 의해 전송된 인텐트의 스텁을 애플리케이션입니다. 과(와) 같습니다. Mockito를 지원하지만 Android 인텐트에 사용됩니다.

앱이 다른 앱이나 플랫폼에 기능을 위임하는 경우 Espresso-Intents는 자체 앱의 로직에 집중하고 다른 앱은 그렇지 않으면 플랫폼이 올바르게 작동합니다. Espresso-Intents를 사용하면 발신 인텐트의 유효성을 검사하거나 실제 인텐트 응답입니다.

프로젝트에 Espresso-Intents 포함

앱의 app/build.gradle 파일에서 내부에 다음 줄을 추가합니다. dependencies:

Groovy

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'

Kotlin

androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')

Espresso-Intents는 Espresso 2.1 이상 및 버전 0.3 이상과만 호환됩니다. Android 테스트 라이브러리이므로 이 행도 업데이트해야 합니다.

Groovy

androidTestImplementation 'androidx.test:runner:1.6.1'
androidTestImplementation 'androidx.test:rules:1.6.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'

Kotlin

androidTestImplementation('androidx.test:runner:1.6.1')
androidTestImplementation('androidx.test:rules:1.6.1')
androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')

테스트 규칙 작성

Espresso-Intents 테스트를 작성하기 전에 IntentsTestRule을 설정합니다. 이것은 ActivityTestRule 클래스의 확장이며 쉽게 사용할 수 있습니다. 기능적 UI 테스트의 Espresso-Intents API IntentsTestRule가 초기화됨 @Test 주석이 달린 각 테스트 및 출시 전의 Espresso-Intents Espresso-Intents를 호출할 수 있습니다.

다음 코드 스니펫은 IntentsTestRule의 예입니다.

Kotlin

@get:Rule
val intentsTestRule = IntentsTestRule(MyActivity::class.java)

자바

@Rule
public IntentsTestRule<MyActivity> intentsTestRule =
    new IntentsTestRule<>(MyActivity.class);

일치

Espresso-Intents는 특정 일치 기준을 정의합니다. 햄크레스트 를 사용하면 다음을 수행할 수 있습니다.

  • 기존 인텐트 매처 사용: 거의 모든 경우에 적합한 가장 쉬운 옵션입니다. 선호될 수 있습니다
  • 자체 인텐트 매처 구현: 가장 유연한 옵션입니다. 자세한 내용은 '커스텀 매처 작성' 섹션에서 확인 가능 범위 Hamcrest 튜토리얼

Espresso-Intents는 intended() 인텐트 유효성 검사 및 intending() 메서드 각각 스텁 처리를 수행합니다. 둘 다 Hamcrest Matcher<Intent> 객체를 인수입니다.

다음 코드 스니펫은 기존 인텐트를 사용하는 인텐트 유효성 검사를 보여줍니다. 브라우저를 시작하는 발신 인텐트와 일치하는 매처입니다.

Kotlin

assertThat(intent).hasAction(Intent.ACTION_VIEW)
assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE)
assertThat(intent).hasData(Uri.parse("www.google.com"))
assertThat(intent).extras().containsKey("key1")
assertThat(intent).extras().string("key1").isEqualTo("value1")
assertThat(intent).extras().containsKey("key2")
assertThat(intent).extras().string("key2").isEqualTo("value2")

자바

assertThat(intent).hasAction(Intent.ACTION_VIEW);
assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE);
assertThat(intent).hasData(Uri.parse("www.google.com"));
assertThat(intent).extras().containsKey("key1");
assertThat(intent).extras().string("key1").isEqualTo("value1");
assertThat(intent).extras().containsKey("key2");
assertThat(intent).extras().string("key2").isEqualTo("value2");

인텐트 유효성 검사

Espresso-Intents는 애플리케이션입니다. 다음과 유사한 intended() 메서드 사용 Mockito.verify()를 사용하면 지정된 인텐트가 표시되었는지 어설션할 수 있습니다. 하지만 Espresso-Intents는 개발자가 명시적으로 구성하지 않는 한 인텐트에 대한 응답을 스텁하지 않습니다. 그렇게 할 수 있습니다.

다음 코드 스니펫은 유효성을 검사하지만 스텁은 하지 않는 테스트의 예입니다. 외부 '전화'를 실행하는 발신 인텐트에 대한 응답을 활동:

Kotlin

@Test fun validateIntentSentToPackage() {
    // User action that results in an external "phone" activity being launched.
    user.clickOnView(system.getView(R.id.callButton))

    // Using a canned RecordedIntentMatcher to validate that an intent resolving
    // to the "phone" activity has been sent.
    intended(toPackage("com.android.phone"))
}

자바

@Test
public void validateIntentSentToPackage() {
    // User action that results in an external "phone" activity being launched.
    user.clickOnView(system.getView(R.id.callButton));

    // Using a canned RecordedIntentMatcher to validate that an intent resolving
    // to the "phone" activity has been sent.
    intended(toPackage("com.android.phone"));
}

스터브

Mockito.when()와 유사한 intending() 메서드를 사용하여 다음을 수행할 수 있습니다. kubectl run을 사용하여 시작된 활동에 대한 스텁 응답을 제공합니다. startActivityForResult()입니다. 이는 특히 외부 활동에 유용합니다. 외부 활동의 사용자 인터페이스를 조작할 수 없고 테스트 중인 활동으로 반환된 ActivityResult를 제어합니다.

다음 코드 스니펫은 activityResult_DisplaysContactsPhoneNumber() 테스트: 사용자가 '연락처'를 시작함 테스트 중인 앱의 활동, 연락 가능한 휴대전화 숫자가 표시됩니다.

  1. 특정 활동이 시작될 때 반환할 결과를 빌드합니다. 이 테스트 예: '연락처'로 전송된 모든 인텐트를 가로채기 스텁을 통해 결과 코드를 사용하여 유효한 ActivityResult가 포함된 응답 RESULT_OK

    Kotlin

    val resultData = Intent()
    val phoneNumber = "123-345-6789"
    resultData.putExtra("phone", phoneNumber)
    val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
    

    자바

    Intent resultData = new Intent();
    String phoneNumber = "123-345-6789";
    resultData.putExtra("phone", phoneNumber);
    ActivityResult result =
        new ActivityResult(Activity.RESULT_OK, resultData);
    
  2. 모든 요청에 대한 응답으로 스텁 결과 객체를 제공하도록 Espresso에 지시합니다. '연락처'의 인텐트:

    Kotlin

    intending(toPackage("com.android.contacts")).respondWith(result)
    

    자바

    intending(toPackage("com.android.contacts")).respondWith(result);
    
  3. 활동을 시작하는 데 사용된 작업이 예상대로 실행되는지 확인 스텁 결과를 반환합니다. 이 경우 예시 테스트는 전화번호가 "123-345-6789"가 반환되고 '연락처 활동' 항목이 시작됩니다.

    Kotlin

    onView(withId(R.id.pickButton)).perform(click())
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))
    

    자바

    onView(withId(R.id.pickButton)).perform(click());
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));
    

다음은 전체 activityResult_DisplaysContactsPhoneNumber() 테스트입니다.

Kotlin

@Test fun activityResult_DisplaysContactsPhoneNumber() {
    // Build the result to return when the activity is launched.
    val resultData = Intent()
    val phoneNumber = "123-345-6789"
    resultData.putExtra("phone", phoneNumber)
    val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)

    // Set up result stubbing when an intent sent to "contacts" is seen.
    intending(toPackage("com.android.contacts")).respondWith(result)

    // User action that results in "contacts" activity being launched.
    // Launching activity expects phoneNumber to be returned and displayed.
    onView(withId(R.id.pickButton)).perform(click())

    // Assert that the data we set up above is shown.
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))
}

Java

@Test
public void activityResult_DisplaysContactsPhoneNumber() {
    // Build the result to return when the activity is launched.
    Intent resultData = new Intent();
    String phoneNumber = "123-345-6789";
    resultData.putExtra("phone", phoneNumber);
    ActivityResult result =
        new ActivityResult(Activity.RESULT_OK, resultData);

    // Set up result stubbing when an intent sent to "contacts" is seen.
    intending(toPackage("com.android.contacts")).respondWith(result);

    // User action that results in "contacts" activity being launched.
    // Launching activity expects phoneNumber to be returned and displayed.
    onView(withId(R.id.pickButton)).perform(click());

    // Assert that the data we set up above is shown.
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));
}

추가 리소스

Android 테스트에서 Espresso-Intents를 사용하는 방법에 관한 자세한 내용은 다음 리소스를 참고하세요.

샘플

  • IntentsBasicSample: intended()intending()의 기본 사용법입니다.
  • IntentsAdvancedSample이 다음과 같습니다. 카메라를 사용하여 비트맵을 가져오는 사용자를 시뮬레이션합니다.