Android

Tests App on Android(1)

smomo 2021. 6. 28. 17:54

테스트를 하는 이유

  • 장애에 관한 신속한 피드백
  • 개발 주기에서 조기 장애 감지
  • 코드를 최적화할 수 있도록 하는 더 안전한 Code Refactoring
  • 기술적 문제를 최소화하는 안정적인 개발 속도

 

 

 

반복적인 테스트 주도 개발과 관련된 두 사이클

안드로이드 테스트 종류

Unit Test

- 일반적으로 코드의 유닛 단위(메소드, 클래스, 컴포넌트)의 기능을 실행하는 방식

- JVM 상에서 실행되는 local unit tests

- 실제 기기 및 에뮬레이터에서 실행되는 instrumented unit tests

 

Integration Tests

- 단위 테스트가 완료된 모듈들을 합쳐서 하는 테스트

- 앱에서 데이터가 가공되는 로직 테스트

 

UI Tests

- 사용자 인터랙션(버튼 클릭, 텍스트 입력 등) 테스트

- 단일 앱 UI tests

- 멀티 앱 UI tests (예 : 카메라 앱이 타사 소셜 미디어 앱과 이미지를 공유하는 테스트)

Levels of the Testing Pyramid

 

Small Test

- 각 컴포넌트 및 기능 단위의 동작을 검증

 

Medium Test

- 각 모듈 간의 상호작용을 검증하는 통합 테스트

 

Large Test

- 실제 유저가 보는 화면을 기준으로, emulator나 실제 Device에서 예상대로 작동하는지 확인하는 테스트

 

일반적으로 Small 70%, Medium 20%, Large 10% 비율로 테스트 추천한다.

Android Unit Tests

Local unit tests

- module-name/src/test/java/ 에 테스트 파일 저장

- 컴퓨터의 로컬 JVM(Java Virtual Machine)에서 실행되는 테스트

- 안드로이드 프레임워크 종속성이 없거나 모의 객체를 생성할 수 있는 경우 사용

 

Instrumented tests

- module-name/src/androidTest/java/ 에 테스트 파일 저장

- 안드로이드 기기나 에뮬레이터에서 실행되는 테스트

- 사용자 상호작용을 자동화하는 통합 및 기능적 UI 테스트를 작성하거나 테스트에 모의 객체가 충족할 수 없는 Android 종속성이 있는 경우 사용

Android Unit Tests framework

Junit

- Java Unit Test Framework

- 어노테이션(Annotation) 지원

- 단정문으로 테스트 케이스의 수행 결과를 판별함 Ex) assertEquals(예상 값, 실제 값)

- 결과는 성공(녹색), 실패(붉은색)으로 표시

 

Mockito

- Java에서 단위 테스트를 하기 위해 Mock(가짜 객체)를 만들어주는 Framework

- Junit과 함께 Unit test를 작성하는데 사용

 

Roboletric

- android sdk가 제공하는 클래스에 가짜 동작을 심어서 JVM에서 android 코드를 실행하는 Framework

- View객체를 별도의 mock(가짜 객체) 없이 그대로 사용가능

주요 Annotation

@Before, @After가 메소드 위에 선언되면 
해당 테스트 클래스 안에 메소드들이 테스트(@Test) 되기 전과 후에 각각 실행되게 지정하는 어노테이션이다.

 

@Test가 메소드 위에 선언되면 이 메소드는 테스트 대상 메소드임을 의미한다.

 

@Test(timeout=5000)를 메소드 위에 선언합니다. 시간단위는 밀리 초 입니다. 
이 테스트 메소드가 결과를 반환하는데 5,000밀리 초를 넘긴다면 이 테스트는 실패하는 것이다.

 

@Test(expected=RuntimeException.class)가 메소드 위에 선언되면 
이 테스트 메소드는 RuntimeException이 발생해야 테스트가 성공, 그렇지 않으면 실패하는 것이다.

 

@BeforeClass, @AfterClass가 메소드 위에 선언되면 
해당 테스트 클래스에서 딱 한 번씩만 수행되도록 지정하는 어노테이션이다.

단정문

assertArrayEquals(a,b) : 배열 a와b가 일치함을 확인 
assertEquals(a,b) : 객체 a와b의 값이 같은지 확인 
assertSame(a,b) : 객체 a와b가 같은 객체임을 확인 
assertTrue(a) : a가 참인지 확인 
assertNotNull(a) : a객체가 null이 아님을 확인 

이외에도 다양한 단정문이 존재한다. 

References