일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 코루틴
- 안드로이드 앱 아키텍처 가이드라인 사용법
- Android MVVM
- 스타트업 코딩테스트
- 안드로이드 Mockito
- 안드로이드 클린 아키텍처
- android clean architecture
- 리싸이클러뷰 최적화
- 안드로이드 mvvm
- 안드로이드 테스트코드
- android memory leak
- RxJava
- 안드로이드 앱 아키텍처 가이드라인 예시
- 안드로이드 mvvm예제
- 안드로이드 아키텍처 컴포넌트
- 안드로이드 Espresso
- Android App Architecture Guideline
- 안드로이드 JUnit
- coroutine
- 안드로이드 앱 아키텍처 가이드라인 설명
- 안드로이드 최적화
- 안드로이드 의존성주입
- 안드로이드 hilt
- Hilt
- MVVM
- 안드로이드 리싸이클러뷰
- 안드로이드 앱 아키텍처 가이드라인
- sharedFlow
- android DI
- Koin
- Today
- Total
안드로이드 연구소
[연봉 5000 넘는 안드로이드 개발자 되는 법] Instrumentation테스트란(Espresso사용법) 본문
[연봉 5000 넘는 안드로이드 개발자 되는 법] Instrumentation테스트란(Espresso사용법)
안드로이드 연구원 2023. 5. 21. 23:56지난 포스트에서 안드로이드 테스트코드에 대한 종류를 확인하고
그 중 하나인 Unit테스트에 대해 알아보았습니다.
그러면 오늘은 이어서 또다른 대표 안드로이드 테스트코드인 Instrumentation Tests(계측 테스트, 안드로이드 테스트)에 대해서 알아보겠습니다.
Q1. Instrumentation Tests(계측 테스트, 안드로이드 테스트)에 대해 설명해줘
안드로이드 애플리케이션의 동작과 통합을 중점을 둔 특정 유형의 테스트를 나타냅니다.
안드로이드 애플리케이션은 다양한 구성 요소(사용자 인터페이스, 비즈니스 로직, 백엔드 서비스)가 있는 복잡한 시스템입니다.
계측 테스트는 이러한 구성 요소의 동작 및 통합을 확인하는 데 중요한 역할을 합니다.
또 안드로이드는 화면 크기, 하드웨어 구성 및 운영 체제 버전이 다양한 다양한 플랫폼입니다.
계측 테스트를 통해 개발자는 다양한 장치, 에뮬레이터 또는 시뮬레이터에서 애플리케이션을 테스트할 수 있습니다.
이를 통해 애플리케이션의 품질과 안정성을 보장하는 데 도움이 됩니다.
Unit테스트의 핵심은 격리된 상태에서 테스트해야할 대상에 집중하는 것이었습니다.
그리하여 mock객체까지 만들어가면서 외부 종속될 요소들을 배제하여 테스트하였습니다.
Unit테스트와 반대로, Instrumentation테스트는 전체 통합된 요소를 테스트합니다.
애플리케이션 사용자들은 함수 하나, 클래스 하나를 사용하는 것이 아니라
결국 디바이스에서 다운받은 전체 기능이 통합된 애플리케이션을 사용하게 됩니다.
그렇다면 매번 빌드를 받아서 일일이 테스트를 하면 되지 않는가요?
예시로 로그인 엑티비티에서 로그인 성공하였을 때 결과와 실패했을 때 보여주는 기능이 추가되었다면
아래 요소들을 점검해보아야합니다.
- 로그인 성공, 로그인 실패 함수가 잘 작동되는지?
- 원하는 UI업데이트가 잘 이루어지는지?
- 기존 작성한 엑티비티에는 문제가 없는지?
- 안드로이드 sdk 9, 10, 11, 12, 13에서 각 각 문제 없이 작동되는지?
- 갤럭시탭에서도 잘 작동이되는지?
기능 하나가 추가될 때 마다 이 많은 요소들을 검사한다고하면
최소 10번의 빌드를 하여 매번 아이디와 패스워드 값을 넣고
해당 결과가 잘 나오는지 직접 테스트를 해야합니다.
Instrumentation Tests(계측 테스트, 안드로이드 테스트)코드는 이런 노력들을
코드로 자동화하여 보다 빠르고 간편하게 테스트할 수 있게하는 기능입니다.
그렇다면 어떻게 테스트할 수 있을까요?
Q2. 그렇다면 어떻게 Instrumentation Test를 할 수 있지?
1. Test class 생성
: androidTest소스에서 계측 테스트를 할 수 있는 환경을 생성합니다.
이때 생성된 테스트 클래스에서 주로 JUnit을 기본적으로 사용합니다.
2. Test case 생성
테스트 클래스 내에서 사용자 상호 작용을 시뮬레이션하거나 특정 기능을 확인하는 테스트 사례를 작성합니다.
Espresso를 사용하여 UI 요소와 상호 작용하고 동작을 검증하거나
Mockito를 사용하여 종속성을 모의하고 구성 요소 간의 상호 작용을 테스트합니다.
3. Test Runners 사용 & 테스트 실행
: AndroidJUnitRunner같은 테스트 러너를 사용하여 설계한 테스트 클래스를 실행합니다.
그 후 테스트 결과를 검토하여 실패 또는 오류를 식별할 수 있습니다.
또한 XML 또는 HTML 형식으로 테스트 보고서를 생성하여 경위를 자세히 확인할 수 있습니다.
그렇다면 Instrumentation Test에서 핵심은 어떻게 테스트 케이스를 작성하는냐입니다.
우리는 위의 로그인 예시처럼 로그인 화면에서 아이디와 패스워드를 입력 후
로그인에 성공하면 로그인 레이아웃이 종료되어 다음 화면으로 잘 넘어가졌는지
로그인에 실패하면 에러 메시지가 잘 출력이 되었는지 확인을 해야합니다.
그렇다면 저렇게 코드로 UI를 입력하고
UI가 출력되는 요소들을 어떻게 확인 할 수 있을까요?
그 답은 Espresso라이브러리입니다.
Q3. Espresso에 대해 설명해줘
안드로이드 가장 알려진 UI테스트 프레임워크입니다.
버튼 클릭, 텍스트 입력, UI 컴포넌트 속성 확인과 같은 사용자 상호 작용을 자동화하는 UI 테스트를 작성할 수 있습니다.
Espresso의 핵심 구성요소들은 아래와 같습니다.
1. ViewMatchers
: view의 ID, text content, visibility같은 속성을 기반으로 UI 컴포넌트를 찾는 클래스입니다.
아래와 같은 방법으로 ViewMather로 컴포넌트를 찾습니다.
-ViewMatchers.withId(R.id.button_signin)처럼 view의 ID로 컴포넌트를 찾기
-ViewMatchers.withText("Sign-in")처럼 test content로 컴포넌트를 찾기
2. ViewActions
: 클릭, 텍스트 입력, 스크롤, 스와이프 같은 UI요소의 퍼포먼스를 실행하는 메서드입니다.
아래와 같은 메서드들이 있습니다.
-ViewActions.click(): 뷰를 클릭 합니다.
-ViewActions.typeText(String): String을 입력합니다.
-ViewActions.scrollTo(): 해당 뷰가 있는 곳 까지 스크롤합니다.
-ViewActions.pressKey(int):입력한 keyCode(int)에 대응하는 키를 누릅니다.
-ViewActions.clearText() : 해당 뷰에 적힌 텍스트를 지웁니다.
3. ViewAssertions
: UI 요소의 상태를 확인하기위해 사용합니다.
텍스트 콘텐츠의 유효성을 검사하고, 가시성을 확인하거나 UI의 속성을 체크하는 등의 작업을 합니다.
- ViewMatchers.isDisplayed(): 뷰가 현재 화면에 표시되는지 확인합니다.
- ViewMatchers.withText(): 뷰에 지정된 텍스트가 있는지 확인합니다.
- ViewMatchers.withId(): 뷰에 지정된 리소스 ID가 있음을 확인합니다.
- ViewMatchers.isEnabled(): 뷰가 현재 활성화되어 있음을 확인합니다.
아래처럼 고급화하여 작성할 수 도 있습니다.
- ViewAssertions.matches(isDisplayed()): 뷰의 여러 속성들을 확인합니다. 이 예시는 출력 여부를 확인합니다.
- ViewAssertions.doesNotExist(): 뷰가 현재 뷰 계층 구조에 존재하지 않는지 확인합니다.
에스프레소의 핵심 구성 요소를 보여주는 예시입니다.
Espresso.onView(withId(R.id.myTextView)) // ViewMatcher: 원하는 View를 찾습니다. .perform(click()) // ViewAction: View에서 어떤 동작을 수행할 지 결정합니다. .check(matches(isDisplayed())) // ViewAssertion: 원하는 동작이 수행 되었는지 체크한다. 하나라도 Check에 실패하면 테스트는 실패합니다.
Q4. Espresso를 사용한 예시를 보여줘
테스트코드 파일 생성 및 실행하는 방법
https://developer.android.com/studio/test/test-in-android-studio?hl=ko
class LoginActivityTest {
@get:Rule
val activityTestRule = ActivityTestRule(LoginActivity::class.java)
@Test
fun testLoginSuccess() {
val username = "john.doe"
val password = "password123"
Espresso.onView(withId(R.id.etUsername)).perform(typeText(username))
Espresso.onView(withId(R.id.etPassword)).perform(typeText(password), closeSoftKeyboard())
Espresso.onView(withId(R.id.btnLogin)).perform(click())
// Assert that the home activity is displayed after successful login
Espresso.onView(withId(R.id.homeActivityLayout)).check(matches(isDisplayed()))
}
@Test
fun testLoginFailure() {
val username = "invalid_user"
val password = "invalid_password"
Espresso.onView(withId(R.id.etUsername)).perform(typeText(username))
Espresso.onView(withId(R.id.etPassword)).perform(typeText(password), closeSoftKeyboard())
Espresso.onView(withId(R.id.btnLogin)).perform(click())
// Assert that an error message is displayed after unsuccessful login
Espresso.onView(withId(R.id.tvErrorMessage))
.check(matches(withText("Invalid username or password")))
}
}
로그인 엑티비티에서 username과 password를 명령어를 자동화하여
@Test 어노테이션인 testLoginSuccess()함수와 testLoginFailure()메서드를 체크합니다.
성공할 경우 homeActivityLayout가 출력되는지 체크하거나
실패할 경우 텍스트뷰에 Invalid username or password 텍스트가 출력되는지를 확인합니다.
'안드로이드 연구소 > 테스트코드' 카테고리의 다른 글
TestCode 간단한 예제(feat. Mockito) (0) | 2023.08.14 |
---|---|
[연봉 5000 넘는 안드로이드 개발자 되는 법] Unit테스트란(ViewModel에서 Unit테스트하기) (0) | 2023.05.21 |
[연봉 5000 넘는 안드로이드 개발자 되는 법] 안드로이드 테스트코드 종류 (1) | 2023.05.18 |