dev/Android

android TDD-(1) Unit Test

_April 2020. 5. 21. 17:43

이번프로젝트에 TDD를 도입하기로 했다.

 

1. TDD란?

  • Test-Driven Development(TDD) : 테스트를 먼저 만들고 테스트를 통과하기 위해 코드를 짜는 것을 TDD라 한다. 

보통은 코딩을 하고 결과를 맞춰보는 식으로 테스트를 할 것이다.

하지만 TDD에서는 순서를 반대로 한다.
결과를 예상하고 그 결과가 나오도록 코딩을 한다. 그 결과가 아니면 테스트를 통과하지 못한다.

 

2. TDD의 장점

 

  • 개발단위가 더 작아져서 문제가 생길확률이 적으며 금방 찾을수 있다
  • 나중에 유지보수시 함수의 기능이 변경/추가 되면 테스트를 통해 함수의 유효성을 확인할 수 있다.

또한 안드로이드 스튜디오에서는 두가지 기본 테스트 방식을 제공한다.(Instrumentation Test, Unit Test)

  • Unit test(JUnit) 사용시는 빌드도 훨씬 빠르다. Unit test는 module-name/src/test/java/ 하위에 작성할수 있다.

 

Instrumentation test는 실제 하드웨어 기기나 에뮬레이터에서 실행되는 테스트여서 그냥 모바일 기기로 실행하는것과 비슷하다. 

매 테스트마다 앱을 빌드, 배포, 실행하는 과정이 포함되기 때문이다.

module-name/src/androidTest/java/ 하위에서 작성할 수 있다.

 

비슷하지만 다른 테스트로는 BDD가 있다. 이번글에서 다룰 주제는 아니다.

더보기

BDD

  • Behavior-Driven Development : TDD에서 파생된 개발 프로세스. TDD에서 나아가 테스트 코드 자체가 요구사항이 되도록 하는 개발 형식.

TDD는 유닛 테스트에 대해 작성했다면, BDD는 결합 테스트와 시나리오 테스트까지 확장한다. 어디서부터 테스트할지, 얼만큼 테스트할지, 테스트에 어떤 이름을 붙일지 등에 대한 고민을 BDD를 통해 해결할 수 있다.

 

3. TDD를 도와주는 라이브러리

기본 안드로이드 제공 TDD외에도 여러가지 TDD 라이브러리가 있다.

사람들이 많이쓰는 툴 조합은 두가지였다

(1)

MVP 개발시 Model은 JUnit을,

Presenter은 구글에서 제공하는 Android Test Support Library(ATSL),

View는Espresso를사용하는 케이스가있다

 

(2)robolectric, mockito를 쓰는 경우도 있는듯 했다.

 

여러 글을 읽어보다 가장 단순하게 함수만 테스트할 수 있는 JUnit만 우선 써보기로 결정.

 

4. 예제

 간단히 2+2=4가 맞는지 표기해주는 코드를 짜보았다. 모든코드는 코틀린으로 작성했다.

class ExampleUnitTest {
    @Test
    fun addition_isCorrect() {
        assertEquals(4, 2 + 2)
    }
}

 

우선 @Test 어노테이을 선언하여 testSum 메서드가 단위 테스트 메서드임을 선언한다.

어노테이션을 주석처리하면 해당 함수에대한 테스트를 하지않는다.

그리고 assertEquals를 이용하여 테스트 결과 값을 확인한다. 

assertEquals는 JUnit 프레임워크에의 Assert 클래스의 메서드로 기본 데이터타입이나 어레이리스트의 일치여부를 확인할 수 있다.

TDD에서는 이처럼 특정 함수의 결과값을 지정하고, 그 값이 나올수 있게 코딩을 한다.

 

이제 코틀린 파일을 실행해보자.

왼쪽에 초록 체크가 나오면 성공한것이다.

코드를 살짝 바꿔 에러를내보자

class ExampleUnitTest {
    @Test
    fun addition_isCorrect() {
        assertEquals(4, 2 + 3)
    }
}

이런식으로 유닛테스트에서 함수를 만들고, 원래 자바/코틀린 파일로 옮기면된다.

물론 기존 클래스도 불러서 사용할 수 있다.