사담
안드로이드 개발의 기초적인 부분을 훑으면서, 어느 부분에 대해 테스트를 작성해야 하는지 구분이 모호하다고 생각했습니다. 이를테면 "버튼을 누르면 다음 화면으로 넘어가는 기능"은 테스트가 필요할까요? "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으로 나눌 수 있어 위와 같이 설정하였습니다. assertTrue
와 assertFalse
는 각각 파라미터의 값이 true
, false
인지 검증하는, JUnit
프레임워크의 함수입니다.
isPositive
함수를 간략하게 구현하고 테스트를 실행해볼까요? 두 개의 케이스는 통과했지만, isPositive_positiveNumber_trueReturned
테스트를 통과하지 못 했네요. 최소한의 코드로 해당 테스트를 통과할 수 있도록 isPositive
를 고쳐봅시다.
모든 테스트를 통과했습니다! 내용이 조금 부족한 것 같나요? 아래 예제 레포지토리에서 unitTestingFundamentals
exercise 1, 2, 3을 해결해봅시다. 다음 시간에는 Test Double
에 대한 글로 다시 찾아뵙겠습니다. 감사합니다!
https://github.com/techyourchance/unit-testing-in-android-course/
'Android > TDD(Test Driven Development, 테스트 주도 개발)' 카테고리의 다른 글
Turbine 없이 kotest에서 StateFlow, SharedFlow 테스트 하기, Unit Test (1) | 2022.04.12 |
---|---|
로버트 C. 마틴 TDD 3원칙 - TDD(Test Driven Development) (0) | 2021.12.17 |
Unit Test(유닛 테스트) 팁 5가지 - TDD(테스트 주도 개발) (0) | 2021.12.16 |
Mockito 프레임워크 - TDD(테스트 주도 개발) (0) | 2021.12.14 |
Test Double(테스트 더블) - TDD(테스트 주도 개발) (0) | 2021.12.14 |