안드로이드 UI 테스트 자동화 - andeuloideu UI teseuteu jadonghwa

사용자 인터페이스 테스트 자동화

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

사용자 인터페이스(UI) 테스트를 통해 앱이 기능 요구사항을 충족하고 높은 수준의 품질을 달성하는지 확인하여 사용자가 앱을 채택할 가능성이 커지도록 할 수 있습니다.

한 가지 UI 테스트 접근 방식은 단순히 테스터가 타겟 앱에서 일련의 사용자 작업을 실행하도록 하고 올바르게 작동하는지 확인하는 것입니다. 하지만 이 수동 접근 방식은 시간이 오래 걸리고 지루하며 오류가 발생하기 쉽습니다. 보다 효율적인 접근 방식은 사용자 작업이 자동화된 방식으로 실행되도록 UI 테스트를 작성하는 것입니다. 자동화된 접근 방식을 사용하면 반복 가능한 방식으로 테스트를 빠르고 안정적으로 실행할 수 있습니다.

참고: 테스트 앱 빌드에는 프로젝트 설정, 라이브러리 포함 및 패키징 편의성을 제공하는 Android 스튜디오를 사용하는 것이 좋습니다. 이 과정에서는 Android 스튜디오를 사용한다고 가정합니다.

Android 스튜디오를 사용하여 UI 테스트를 자동화하려면 별도의 Android 테스트 폴더(src/androidTest/java)에 테스트 코드를 구현합니다. Gradle용 Android 플러그인은 테스트 코드를 기반으로 테스트 앱을 빌드한 후 타겟 앱과 동일한 기기에 테스트 앱을 로드합니다. 특정 사용 시나리오를 포괄하는 테스트 작업을 실행하기 위해 테스트 코드에서 UI 테스트 프레임워크를 사용하여 타겟 앱에서의 사용자 상호작용을 시뮬레이션할 수 있습니다.

Android 앱을 테스트하는 경우 일반적으로 다음과 같은 유형의 자동화된 UI 테스트를 만듭니다.

  • 단일 앱에 걸친 UI 테스트: 이 유형의 테스트는 사용자가 특정 작업을 실행하거나 활동에 특정 항목을 입력할 때 타겟 앱이 예상대로 작동하는지 확인합니다. 이 테스트에서는 타겟 앱이 앱 활동의 사용자 상호작용에 관한 응답으로 올바른 UI 출력을 반환하는지 확인할 수 있습니다. Espresso와 같은 UI 테스트 프레임워크를 사용하면 프로그래매틱 방식으로 사용자 작업을 시뮬레이션하고 복잡한 앱 내 사용자 상호작용을 테스트할 수 있습니다.
  • 여러 앱에 걸친 UI 테스트: 이 유형의 테스트는 다양한 사용자 앱 간 또는 사용자 앱과 시스템 앱 간 상호작용이 올바르게 작동하는지 확인합니다. 예를 들어 카메라 앱이 타사 소셜 미디어 앱 또는 기본 Android 포토 앱과 이미지를 올바르게 공유하는지 테스트하려고 할 수 있습니다. 이때 앱 간의 상호작용을 지원하는 UI 테스트 프레임워크(예: UI Automator)를 사용하여 이러한 시나리오에 관한 테스트를 만들 수 있습니다.

이 과정에서는 AndroidX 테스트의 도구 및 API를 사용하여 이러한 유형의 자동화된 테스트를 빌드하는 방법을 알려줍니다. 이러한 API를 사용하여 테스트 빌드를 시작하기 전에 AndroidX 테스트용 프로젝트 설정에 설명된 대로 AndroidX 테스트를 추가하세요.

과정

단일 앱의 UI 테스트Espresso 테스트 프레임워크를 사용하여 단일 앱의 UI를 테스트하는 방법을 알아봅니다.여러 앱의 UI 테스트UI Automator 테스트 프레임워크를 사용하여 여러 앱의 UI를 테스트하는 방법을 알아봅니다.

참고 자료

Android 테스트에서 Espresso를 사용하는 방법에 관한 자세한 내용은 다음 자료를 참조하세요.

샘플

  • Espresso 코드 샘플: 가능한 모든 Espresso 샘플이 포함되어 있습니다.
  • BasicSample: 기본 UI Automator 샘플입니다.
  • 더보기

Android 테스트 Codelab

  • 테스트 기본사항
  • 종속 항목 삽입 및 테스트 더블
  • 테스트 주제 설문조사

Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Last updated 2020-06-18 UTC.

[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"필요한 정보가 없음" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"너무 복잡함/단계 수가 너무 많음" },{ "type": "thumb-down", "id": "outOfDate", "label":"오래됨" },{ "type": "thumb-down", "id": "translationIssue", "label":"번역 문제" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"샘플/코드 문제" },{ "type": "thumb-down", "id": "otherDown", "label":"기타" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"이해하기 쉬움" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"문제가 해결됨" },{ "type": "thumb-up", "id": "otherUp", "label":"기타" }]

TDD를 통한 개발을 위해 가장 먼저 준비 할 것은 ‘테스트 케이스 작성’입니다.

테스트는 크게 2가지로 나눌 수 있습니다.

  • UI 테스트
  • 단위 테스트

오늘은 그 중 ‘UI 테스트 자동화’에 대해 공부하고 테스트한 내용에 대해 글을 남기려고 합니다.

Implement

dependencies {
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
}

2021년 7월 7일 현재, 안정화 된 Espresso 버전은 3.1.0 입니다.

애니메이션 사용 중지

Espresso는 구현한 동작을 빠르게 수행하기에 애니메이션 동작이 있는 경우, 원활한 테스트에 문제가 생길 수 있습니다.

물론 Delay를 걸어서 테스트 하는 것도 방법이지만, 애니메이션 동작 시간이라도 변하면 일일히 수정하는 것도 또 다른 자원의 낭비이기에 사용 중지를 권장하고 있습니다.

Android 개발자 문서에서는 테스트용 기기의 애니메이션을 사용 중지 하는 방법을 권하나, 프로젝트의 Gradle에서 테스트 할 때만 Animation을 비활성화 시키는 방법을 지원하므로 저는 아래처럼 후자의 방법을 사용합니다.

// build.gradle (project)
android {
    testOptions {
        animationsDisabled = true
    }
}

테스트 클래스 구현

UI 구성 요소에 접근하는 방법은 기본적으로 아래와 같습니다.

    onView(withId(R.id.my_view))            // withId(R.id.my_view) is a ViewMatcher
            .perform(click())               // click() is a ViewAction
            .check(matches(isDisplayed()))  // matches(isDisplayed()) is a ViewAssertion

  1. ViewMatcher: 원하는 View를 찾습니다.
  2. ViewAction: View에서 어떤 동작을 수행할 지 결정합니다.
  3. ViewAssertion: 원하는 동작이 수행 되었는지 체크한다. 하나라도 Check에 실패하면 테스트는 실패합니다.

ViewMatcher는 생략될 수 없으며, ViewAction이나 ViewAssertion은 생략 될 수 있습니다.

ViewMatcher 지정

ViewMatcher을 지정하는 방법은 크게 3가지가 있습니다.

  1. 텍스트 문자열을 통한 검색 : ViewMatchers.withText("Sign-in")
  2. 뷰의 ID를 통한 검색: ViewMatchers.withId(R.id.button_signin)
    • 중복되는 ID를 검색하는 경우, Exception을 발생시킵니다.
  3. 두 가지 이상의 조건을 중첩시켜 검색: onView(allOf(withId(R.id.button_signin), withText("Sign-in")))
    • 라이브러리에서 지원합니다.

일반적으로, onView(ViewMatcher)의 형태로 View에 접근합니다.

ViewAction 실행

ViewActions는 onView(ViewMatcher)의 멤버 함수와 같이 아래와 같은 형태로 사용됩니다.

onView(ViewMatcher).perform(ViewAction)

  1. ViewActions.click(): 뷰를 클릭 합니다.
  2. ViewActions.typeText(String): String을 입력합니다.
  3. ViewActions.scrollTo(): 해당 뷰가 있는 곳 까지 스크롤합니다.
  4. ViewActions.pressKey(int):입력한 keyCode(int)에 대응하는 키를 누릅니다.
  5. ViewActions.clearText() : 해당 뷰에 적힌 텍스트를 지웁니다.

구글 안드로이드 디벨로퍼즈에 명시된 기능만 작성하였으며, 이 외에도 다양한 기능이 있지만 저는 아직 사용해보지 못했습니다.

ViewAssertion 확인

원하는 결과를 잘 얻었는지 확인할 수 있습니다.

ViewAssertion은 onView(ViewMatcher)의 멤버 함수와 같이 아래와 같은 형태로 사용됩니다.

onView(ViewMatcher).check(ViewAssertion)

  • ViewAssertions.doesNotExist() : 지정한 뷰가 없는지 확인합니다.
  • ViewAssertions.matches(): 지정한 뷰가 있으며, 원하는 상태인지 확인합니다.

테스트 진행

예를 들어 아래와 같은 순서로 테스트를 진행하고 싶다고 가정해보겠습니다.

  1. et_item_name라는 id를 갖는 <EditTest .../>에 특정 문자열을 입력합니다.
  2. 추가하기라는 문자열이 적힌 버튼을 클릭합니다.
  3. 정상적으로 등록이 되었다면, 화면에서 입력한 문자열을 확인할 수 있습니다.

이럴 땐 아래와 같이 테스트를 구현하면 됩니다.

@Test
fun myTest() {
    Espresso.onView(ViewMatchers.withId(R.id.et_item_name))
        .perform(ViewActions.typeText("TEST STRING"))

    Espresso.onView(ViewMatchers.withText("추가하기"))
        .perform(ViewActions.click())

    Espresso.onView(ViewMatchers.withText("TEST STRING"))
        .check(ViewAssertions.matches(ViewMatchers.isDisplayed()))
}

충분히 이해가 되었다면, 본인이 만든 앱의 기초 로직을 이용하여 간단한 테스트를 구현할 수 있을겁니다.

제 경우에는 내게 필요한 기술이기에 글만 읽고 끝내지 않고 직접 적용해보니 더 쉽게 익힐 수 있었습니다.

참고 문서

Android Developers - 단일 앱의 UI 테스트

Espresso Testing Samples