본문 바로가기

Android/TDD(Test Driven Development, 테스트 주도 개발)

Unit Test(유닛 테스트) - TDD(테스트 주도 개발)

반응형

사담

안드로이드 개발의 기초적인 부분을 훑으면서, 어느 부분에 대해 테스트를 작성해야 하는지 구분이 모호하다고 생각했습니다. 이를테면 "버튼을 누르면 다음 화면으로 넘어가는 기능"은 테스트가 필요할까요? "retrofit으로 api 요청을 보내고 응답을 받아오는 기능"은 어떨까요? 귀찮은데 테스트 안 하면 안 될까요? 그러한 고민을 해소하기 위해 udemy에서 TDD(Test Driven Development, 테스트 주도 개발) 강의를 들으며 요점을 정리해보았습니다. 수강 중인 강의는 아래에 안내하겠습니다. 109,000원짜리 강의이지만 udemy는 상시적으로 할인 행사를 진행하니 이를 잘 활용하면 80% 이상 할인 받을 수 있습니다. 끝으로, 이 글은 절대 완벽하지 않으며 보완이 필요한 내용은 댓글로 남겨주세요!
https://www.udemy.com/course/professional-android-unit-testing/

TDD(Test Driven Development, 테스트 주도 개발)

TDD는 Test Driven Development(테스트 주도 개발)의 줄임말로, 어떠한 기능을 개발할 때 이에 대한 테스트를 먼저 작성한 후 테스트를 모두 만족하도록 기능을 작성하는 개발 방식을 말합니다. 요구사항을 검증하는 테스트 케이스를 작성해야 하며, 이를 통과하기 위한 최소한의 코드를 생성합니다. 발생할 수 있는 모든 예외 상황을 테스트 케이스에 포함하여 해당 기능이 오작동할 여지를 줄이는 것이 TDD(Test Driven Development, 테스트 주도 개발)의 지향점이라고 할 수 있겠네요.

Unit Testing(유닛 테스트)

Unit Testing(유닛 테스트)은 두 가지 부분으로 나뉩니다. Unit(유닛)은 함수를 갖는 컨테이너로써, 특정 기능을 주어진 범위 내에서 수행하는 단위를 말하며, 일반적으로 Object Oriented 언어에서 class의 형태로 표현됩니다. Testing(테스트)은 무언가가 의도한대로 동작하는지 검증하는 방법입니다. 따라서 Unit Testing(유닛 테스트)class가 의도한대로 동작하는지 검증하는 방법이라고 할 수 있겠네요.

Unit Testing(유닛 테스트)를 하기 위해서는 먼저 Unit(유닛)을 생성한 후, 미리 지정한 파라미터로 메소드를 호출하여 해당 메소드가 설계대로 동작하는지 검증해야 합니다. 위 강좌에서는 이러한 검증 작업을 위해 JUnit 프레임워크를 사용합니다. Android Studio에서 프로젝트를 새로 생성하면 JUnit 프레임워크가 기본적으로 포함되어 있습니다.

주어진 숫자가 양수인지 확인하는 클래스 PositiveValidator의 기능 isPositive(number: Int): Boolean을 작성한다고 해봅시다. 먼저 해당 클래스의 뼈대를 생성한 후 우클릭 -> Go To -> Test를 선택하거나 단축키 Command + Shift + T를 입력하면 Create New Test... 창이 표시됩니다.

다음과 같이 입력하여 테스트 파일을 생성해봅시다. androidTest에는 안드로이드 라이브러리 의존성이 필요한 테스트를, test에는 그외의 테스트를 생성합니다. 생성된 테스트 파일은 다음 경로에 존재하게 되며, 다음과 같이 빈 파일이 생성됩니다.

본격적으로 테스트를 작성해봅시다. 먼저 PositiveValidator 인스턴스가 필요하겠죠. 해당 인스턴스의 이름은 systemUnderTest라고 명명하겠습니다. @Before annotation이 붙은 함수는 각각의 테스트가 실행하기 전에 실행되기 때문에, setup 함수 내에서 systemUnderTest를 초기화합니다. 비슷한 맥락의 annotation으로는 @After가 있습니다. @Before가 붙는 함수는 일반적으로 setUp, @After가 붙는 함수는 tearDown이라고 명명합니다.

@Test annotation이 붙은 함수가 하나의 테스트를 의미합니다. 함수의 이름은 {기능}_{파라미터 및 상태}_{기대되는 동작}으로 설정하며, 양수 판별기에 입력되는 값은 크게 양수, 음수, 0으로 나눌 수 있어 위와 같이 설정하였습니다. assertTrueassertFalse는 각각 파라미터의 값이 true, false인지 검증하는, JUnit 프레임워크의 함수입니다.

isPositive 함수를 간략하게 구현하고 테스트를 실행해볼까요? 두 개의 케이스는 통과했지만, isPositive_positiveNumber_trueReturned 테스트를 통과하지 못 했네요. 최소한의 코드로 해당 테스트를 통과할 수 있도록 isPositive를 고쳐봅시다.

모든 테스트를 통과했습니다! 내용이 조금 부족한 것 같나요? 아래 예제 레포지토리에서 unitTestingFundamentals exercise 1, 2, 3을 해결해봅시다. 다음 시간에는 Test Double에 대한 글로 다시 찾아뵙겠습니다. 감사합니다!

https://github.com/techyourchance/unit-testing-in-android-course/

 

GitHub - techyourchance/unit-testing-in-android-course

Contribute to techyourchance/unit-testing-in-android-course development by creating an account on GitHub.

github.com

반응형