테스트 코드가 뭐길래..

seunghee song·2024년 2월 29일
post-thumbnail

테스트코드에 대하여 작성하는 이유

오늘 안드로이드 개발자분과 커피챗(?) 이라고 해야하나 어쨋든 커피를 마시면서 이런저런 궁금한거 이모저모를 물어보는 시간을 가졌다.
이야기 나눴던 많은 토픽 중 하나가 테스트 코드에 관해서였다.
필요한 건 알았고 하면 좋은 것은 알지만 프로젝트를 진행하면서 한번도 써본적이 없기에 중요성을 잘 인지하지 못했는데 오늘 이야기를 나누며 중요성과 이후 진행할 프로젝트에서 꼭 작성해보리라 마음을 먹었기 때문에 기록하고자 한다!

테스트 코드란?

아마 테스트 코드라는 말은 프론트이던 백엔드이던 항상 들어봤을 개념일 것이다.
MVVM, MVI, 클린 아키텍쳐를 적용한 이유에 대해서 설명할때 의존성을 줄이고 단위 테스트가 가능한 구조를 만들기 위해서 라는 식으로 많이 설명하곤 한다.
테스트 코드는 소스 코드가 의도한 대로 정확히 작동하는지 확인하기 위해 적성된 코드를 말한다.

우린 테스트 코드를 항상 만들고 있었다!

안드로이드 스튜디오에서 프로젝트를 생성할 때 자동으로 androidTest와 test 패키지가 생성되는데 이들이 바로 테스트 코드를 구성하기 위함이다. 이 두 패키지는 각각 다음의 용도로 사용된다.

test 패키지
단위 테스트(가장작은 코드 단위로 함수나 메소드)를 위해 사용되며 이 패키지에 포함된 테스트 코드는 JVM 위에서 실행되므로 안드로이드 프레임워크에 의존하지 않는 순수 java/kotlin 코드를 테스트하는데 적합하다.

androidTest 패키지
안드로이드 특정 컴포넌트(액티비티, 서비스 등)와 상호작용하는 테스트로 통합 테스트와 ui테스트를 위해 사용된다. 이 테스트는 안드로이드 기기나 애뮬레이터에서 실행되며 안드로이드 프레임워크와의 상호작용을 포함하는 테스트 케이스를 다룬다.

이 두 패키지의 주된 차이점이 있다면 바로 실행환경과 테스트의 범위이다.
test 패키지는 jvm 상에서 실행되어 빠르고 경량화된 테스트에 적합한데 반해 androidTest 패키지는 실제 안드로이드 환경에서 실행되어 안드로이드 특정 기능과 ui를 포괄적으로 테스트 한다.

무엇을 어디부터 테스트해야하냐는 질문에 많은 사람들이 테스트를 시작하는 단계라면 단위테스트를 하는 것만으로도 충분하다고 한다.

unit test가 주는 이점

  • 코드변경시 변경부분에 대한 side Effect를 파악할 수 있다.
  • 여러 테스트를 작성해두면 요구사항 변경시에도 실패하는 테스트를 보고 어떤 side Effect가 발생할지 파악할 수 있다.
  • 테스트를 작성하게 되면 자연스레 테스트 가능한 단위로 분리하여 개발을 진행하게 될것이고 의존성을 최소화하며 개발을 진행할 수 있게되어 우리가 목놓아 외쳤던 의존성을 분리한 클린 아키텍처, 클린 코드를 짤 수 있게 된다.

Test파일 실행 방법

ExampleUnitTest 파일 우클릭 후 'run ExammpleUnitTest'를 실행하면 된다.
만약 테스트에 성공한다면?

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

unit test 실습을 진행해보겠다

  1. project 파일단에 간단한 Calculator 클래스를 만들어준다
class Calculator {
    fun add(a:Int, b:Int):Int {
        return a+b
    }
    fun subtract(a:Int, b:Int):Int{
        return a-b
    }
}
  1. androidTest 파일단에 unit testcode를 작성해준다
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에 대해 설명하자면?

  • @Before: @Test 를 시작하기전에 항상 호출되는 메소드로 사전설정해주는 메소드이다.
  • @Test: @Before가 완료되면 실제 코드테스트를 진행
  • @After: @Test 메소드가 종료되면 호출되는 메소드, 주로 메모리 release역할을 한다.

한번에 의존성이 최소화된 코드, 클린 아키텍처를 설계하는 것은 아무리 유능한 개발자라도 어려울 듯 싶다. 그렇기에 테스트 코드를 작성하면서 개선에 개선을 하려 한다는 의도에서 필요성이 대두되었다고 생각한다.

앞으로 프로젝트를 진행하면서 너무 큰 로직을 테스트 하려고 하기 보다는 가장 의존성이 높다고 생각되는 로직 부분의 테스트 코드를 하나씩 작성하는 것부터 익혀나가야겠다.

profile
안드로이드 개발자

0개의 댓글