안녕하세요. 점냥 입니다!!!
Testing your app is an integral part of the app development process
Android Developer 사이트의 원문입니다. 앱 개발하는 과정에 있어서 테스트는 핵심 적인 부분을 차지한다고 하는데요.
프로젝트 구조가 복잡해지는 만큼 기능의 확장 및 유지 보수 측면에서 테스트는 변경된 코드가 기존 기능을 망가뜨리지 않는 지 미리 체크 할 수 있다는 점에서 많은 이점을 주기 때문입니다.
부끄럽게도 저도 지금 껏 개발 했던 프로젝트에 제대로된 테스트를 수행해본 적이 없는데요. 여러분도 저와 같다면 함께 천천히 테스트에 대해서 알아가 봅시다:)
Unit Test
Unit Test
는 테스트 종류 중 가장 작은 단위이며 로컬 기기(개발 PC)에서 구동되어 실제 기기가 필요없고 JVM에서 동작하여 매우 빠릅니다. 그 만큼 복잡한 로직을 테스트 하는 것이 아닌 반환 값이 있는 함수, 하나의 클래스, 컴포넌트 등 이 됩니다.
추가적으로 context 처럼 Android framework에 종속적인 클래스 등도 복잡하지 않다면 Unit Test에 속합니다. 대신 Android framework는 로컬 테스트 환경에서는 접근할 수 없기에 Mockito
, Robolectric
등 라이브러리를 통해 모의 객체를 생성하여 Unit Test를 실행합니다.
반환 값이 없는 void 형은 테스트의 대상이 아닙니다. 테스트의 원리는 black box Test(입력 값에 따른 결과 값)의 하나로 반환 값은 중요합니다.
JUnit
안드로이드에서 Unit Test를 작성할 때, JUnit
테스트 라이브러리를 사용하기를 권장합니다. 안드로이드의 JUnit을 권장하는 만큼 새 프로젝트를 생성했을 때 기본적으로 포함되어 있는 것을 확인 할 수 있습니다.
JUnit Gradle 설정
dependencies {
// Required -- JUnit 4 framework
testImplementation 'junit:junit:4.12'
}
JUnit 기본 예제
public class EmailValidatorTest {
@Test
public void emailValidator_CorrectEmailSimple_ReturnsTrue() {
assertTrue(EmailValidator.isValidEmail("name@email.com"));
}
@Test
public void emailValidator_CorrectEmailSubDomain_ReturnsTrue() {
assertTrue(EmailValidator.isValidEmail("name@email.co.uk"));
}
입력 값인 문자열이 이메일이 맞는지 확인하는 EmailValidator
클래스를 테스트하는 예제입니다.
- EmailValidatorTest : 테스트 케이스 실행하기 위해서는 클래스를 작성해야 합니다.추가로 Android Studio에서 간단하게 테스트 클래스를 생성하는 방법을 제공해줍니다. 테스트 하고자 하는 클래스 파일로 이동하여 우클릭을 하면 테스트 클래스를 생성하는 다이얼로그가 나타납니다.
- JUnit4 부터 테스트 클래스에 대한 제한이 사라진 듯 합니다. 따라서 명명 규칙없이 원하는 이름으로 선언하면 됩니다.
- 메소드 : 테스트 클래스 내 메소드 중
@Test
어노테이션이 붙는 다면 테스트 케이스 실행되는 메소드라는 뜻이며 JUnitRunner에 의해 실행됩니다. - assertTrue : 인자의 값이 true인지 체크하는 테스트 함수로
true
이면 성공,false or 다른 값
이면 테스트 실패를 나타낸다.
예시에 나오지 않은 다른 JUnit 기능 등을 살펴봅시다.
public class OfficialLottoMainDataSourceTest {
private RemoteOfficialLottoMainDataSource dataSource;
private final String FAKE_LOTTO_DATA = "동행복권 941회 당첨번호 12,14,25,27,39,40+35. 1등 총 16명, 1인당 당첨금액 1,347,297,422원.";
@Before
public void setUp() throws Exception {
dataSource = new RemoteOfficialLottoMainDataSource();
}
@Test
public void lottoMainData_RoundParsing_ReturnsLottoRound() {
assertEquals(941, dataSource.getLottoRoundParsing(FAKE_LOTTO_DATA));
}
@Test
public void lottoMainData_RoundParsingUsingNotNumber_ReturnZero() {
assertEquals(0, dataSource.getLottoRoundParsing("notNumber"));
}
@Test
public void lottoMainData_NumberParsing_ReturnsLottoNumber() {
assertEquals("12,14,25,27,39,40", dataSource.getLottoNumberParsing(FAKE_LOTTO_DATA));
}
@After
public void tearDown() throws Exception {
dataSource = null;
}
}
위 코드는 로또 공식 홈페이지 html를 파싱해온 Data에서 앱에 필요한 정보를 정규식으로 가져오는 함수를 테스트하는 예시입니다.
- 전역 변수 초기화 : 예를 들어 테스트 대상이 인스턴스가 필요한 함수라면 객체를 초기화하는 과정이 필요합니다. 매번 테스트 메소드 안에서 객체를 초기화하는 코드를 넣어두면 비효율적이죠. 따라서 JUnit은
@Before
과@After
어노테이션을 제공해줍니다.@Before
: 매 테스트 함수가 실행되기 직전 호출 되는 메소드. 주로 전역 변수의 초기화 작업이 진행됩니다.@After
: 매 테스트 함수가 실행된 후 호출 되는 메소드. 주로 전역 변수의 메모리를 해제하는 작업이 진행됩니다.
- assertEquals : 두 인자의 값이 동일 한지 검사하는 테스트 함수입니다.
이렇게 테스트 중 가장 작은 단위인 Unit Test에 대해서 기초적인 부분을 알아 보았습니다.
이번 포스팅에서 JUnit 중 기본적인 요소들을 다뤄보았고 조금 더 자세한 내용은 찾아보시면 좋을 듯 합니다!
테스트를 공부해도 어디에 적용해야 할지, 어떤 클래스를 적용해야 할지 막막함을 느낄 수 있습니다. 저도 그렇구요.
하지만 조급해 하지말고 천천히 알아가 봅시다:)
참고
'Android > Common' 카테고리의 다른 글
[Android] Dark Theme 적용하는 방법 (3) | 2021.01.04 |
---|---|
[Android] Testable App - Ui Test (0) | 2020.12.26 |
[Android] MVP 적용해보기 - Model 말고 Repository (4) | 2020.11.23 |
[Android] 뷰의 성능 개선 - RecyclerView (3) | 2020.11.05 |
[Android] 뷰의 성능 개선 - 오버드로 줄이기 (3) | 2020.10.08 |