Hun's Blog

[Android] Android Test 1 - Android Test란 무엇인가? 본문

Android

[Android] Android Test 1 - Android Test란 무엇인가?

jhk-im 2020. 3. 22. 00:08

Android Test란 무엇인가?

 

이미지 1 안드로이드 프로젝트


처음 안드로이드를 공부할 때 안드로이드 스튜디오에서 Hello world를 찍기위해 기본적인 empty activity를 포함하는 프로젝트를 생성하면 이미지1 과같이 java 폴더가 생성되는것을 볼 수 있다. com.회사명.프로젝트명 으로 패키지가 생성되고 우리는 맨 위에 있는 패키지  안에 앱을 구성하는 본격적인 자바 프로그래밍을 하게된다.

그런데 아래있는 두개의 패키지는 무엇일까? 수많은 기초 예제와 작은 프로젝트를 만들면서 단 한번도 저 안에 자바 클래스를 만들어본 적이 없다. 안드로이드 스튜디오에서는 왜 기본적인 패키지 이외에 2가지의 패키지를 더 만들어주는 것일까? 

이러한 질문으로 시작해서 Android Test에 대해서 알아보기 시작했다.


앱 개발시 테스트를 해야하는 이유?
- 자신의 코드에 대한 안전성 검사
- 코드 리팩토링시 기존에 돌아가던 로직을 검사

테스트의 종류

1. Unit Test
- 일반적으로 코드의 유닛 단위의 기능을 실행하는 방식
- JUnit, Mockito, PowerMock
*유닛단위 -> 메소드, 클래스, 컴포넌트 등

2. UI Test
- 사용자 인터렉션을 평가
- Espresso, UIAutomaotr, Robotiup, Robelectric
*인터렉션 -> 버튼클릭, 텍스트입력 등

이미지 2 안드로이드 테스트 패키지 

 

기본 자바패키지 아래 똑같은 이름으로 되어있는 패키지가 제공되고 끝에 android test 와 test로 구분된다. 패키지를 열어보면 각각의 패키지에 Example 클래스가 생성된 것을 확인할 수 있다. 
안드로이드 테스트 종류에는 Unit Test와 UI Test가 있다고하였다. 
맨아래 ExampleUnitTest 라고 되어있는 클래스를 보면서 어느정도 예상해 볼 수 있다.
com.회사명.프로젝트명 (test) 패키지 내에서는 Unit Test가 진행되는구나..
(androidTest) 패키지 내에서는 아마도 UI Test가 진행 될 것이다.  



Unit Test 와 UI test는 각각 여러가지 추천 라이브러리들이 있다.
안드로이드 프로젝트를 처음 생성하면 기본적으로 테스트에 관련된 패키지가 제공되는 것을 확인했다. 그말은 즉, 기본적으로 Unit Test 라이브러리와 UI Test 라이브러리가 추가되어있다는 의미이다.

라이브러리를 dependencies 하는 app - build.gradle가서 확인해보자.

1
2
3
4
5
6
7
8
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 
    testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs
위에서 Unit Test와 UI Test 의 추천라이브러리에서 보았던 라이브러리가 보인다.

위에서 Unit Test와 UI Test 의 추천라이브러리에서 보았던 라이브러리가 보인다.

junit -> unit test / espresso -> ui test .

com.회사명.프로젝트명 (test) 패키지안에있는 ExampleUnitTest 클래스를 열어보자.

 

기본적으로 addition_isCorrect() 메소드가 생성되어있다.

 왼쪽에 재생버튼을 클릭해보자.

run이 활성화되면서 다음과같은 문구를 출력한다.


이번에는 assertEquals() 안에 빨간 부분을 2에서 1로 변경하고 실행해보자.


결과


addtion_isCorrect() 내부에 assertEquals() 메소드는 expected와 actual이라는 숫자를 인자로 전달받는다. 풀어보면 2+1은 4가 맞느냐를 즉, expected 로 입력된 값이 actual로 입력된값이랑 같은지 안같은지를 판별해주는 것이다.

첫번째는 assertEquals(4,2+2); --->  결과가 true이기 때문에 아무런 반응이 없었다.
두번째는 assertEquals(4,2+1); ---> 결과가 false 이기;때문에 error가 발생하고 어떻게 결과가 다른지를 출력하여 알려준다.

- 메소드 별로 테스트 해 볼수 있다
- assertEquals() 와 같은 유용한 메소드가 제공된다.

예를 들어보겠다. 
프로젝트가 커지고 메소드가 많아지면 여러가지 클래스와 메소드가 이곳저곳에 호출되어 사용된다. 어떠한 문제가 생겨서 특정 메소드를 변경하였는데 동작을 하지 않는다. 예상되는 부분을 수정하고 다시 빌드하여 실행하고 테스트해본다. 하지만 동작하지 않는다. 다시수정한다. 다시빌드하고.... 

test를 활용한다면 해당 메소드를 그대로 떼어다가 위와같이 특정 메소드들을 활용하여 메소드 단위로 확인해 볼 수 있다.  

test에 대해서 약간의 감을 잠은 것 같다. 
unit test와 ui test를 구분해서 조금더 자세히 알아보도록 하자.