
오늘 안드로이드 개발자분과 커피챗(?) 이라고 해야하나 어쨋든 커피를 마시면서 이런저런 궁금한거 이모저모를 물어보는 시간을 가졌다.
이야기 나눴던 많은 토픽 중 하나가 테스트 코드에 관해서였다.
필요한 건 알았고 하면 좋은 것은 알지만 프로젝트를 진행하면서 한번도 써본적이 없기에 중요성을 잘 인지하지 못했는데 오늘 이야기를 나누며 중요성과 이후 진행할 프로젝트에서 꼭 작성해보리라 마음을 먹었기 때문에 기록하고자 한다!
아마 테스트 코드라는 말은 프론트이던 백엔드이던 항상 들어봤을 개념일 것이다.
MVVM, MVI, 클린 아키텍쳐를 적용한 이유에 대해서 설명할때 의존성을 줄이고 단위 테스트가 가능한 구조를 만들기 위해서 라는 식으로 많이 설명하곤 한다.
테스트 코드는 소스 코드가 의도한 대로 정확히 작동하는지 확인하기 위해 적성된 코드를 말한다.
안드로이드 스튜디오에서 프로젝트를 생성할 때 자동으로 androidTest와 test 패키지가 생성되는데 이들이 바로 테스트 코드를 구성하기 위함이다. 이 두 패키지는 각각 다음의 용도로 사용된다.
test 패키지
단위 테스트(가장작은 코드 단위로 함수나 메소드)를 위해 사용되며 이 패키지에 포함된 테스트 코드는 JVM 위에서 실행되므로 안드로이드 프레임워크에 의존하지 않는 순수 java/kotlin 코드를 테스트하는데 적합하다.
androidTest 패키지
안드로이드 특정 컴포넌트(액티비티, 서비스 등)와 상호작용하는 테스트로 통합 테스트와 ui테스트를 위해 사용된다. 이 테스트는 안드로이드 기기나 애뮬레이터에서 실행되며 안드로이드 프레임워크와의 상호작용을 포함하는 테스트 케이스를 다룬다.
이 두 패키지의 주된 차이점이 있다면 바로 실행환경과 테스트의 범위이다.
test 패키지는 jvm 상에서 실행되어 빠르고 경량화된 테스트에 적합한데 반해 androidTest 패키지는 실제 안드로이드 환경에서 실행되어 안드로이드 특정 기능과 ui를 포괄적으로 테스트 한다.
무엇을 어디부터 테스트해야하냐는 질문에 많은 사람들이 테스트를 시작하는 단계라면 단위테스트를 하는 것만으로도 충분하다고 한다.
ExampleUnitTest 파일 우클릭 후 'run ExammpleUnitTest'를 실행하면 된다.
만약 테스트에 성공한다면?

만약 테스트에 실패한다면?

unit test 실습을 진행해보겠다
class Calculator {
fun add(a:Int, b:Int):Int {
return a+b
}
fun subtract(a:Int, b:Int):Int{
return a-b
}
}
class CalculatorTest {
private lateinit var calculator: Calculator
@Before
fun setUp(){
calculator = Calculator()
}
@Test
fun addTest(){
val result = calculator.add(15,10)
Assert.assertEquals(20,result)
}
@Test
fun subtractTest(){
val result = calculator.subtract(15,10)
Assert.assertEquals(5,result)
}
}
여기서 잠깐 junit annotation에 대해 설명하자면?
한번에 의존성이 최소화된 코드, 클린 아키텍처를 설계하는 것은 아무리 유능한 개발자라도 어려울 듯 싶다. 그렇기에 테스트 코드를 작성하면서 개선에 개선을 하려 한다는 의도에서 필요성이 대두되었다고 생각한다.
앞으로 프로젝트를 진행하면서 너무 큰 로직을 테스트 하려고 하기 보다는 가장 의존성이 높다고 생각되는 로직 부분의 테스트 코드를 하나씩 작성하는 것부터 익혀나가야겠다.