Test:: Test Code는 도대체 왜 작성해야 하는가

류영준·2022년 10월 30일
2

Test

목록 보기
1/1
post-thumbnail
post-custom-banner

들어가며

테스트의 중요성이 대두되고 있다. 개발자들의 발목을 잡기도 하지만 사전에 문제를 예방할 수 있도록 하여 개발하는 데 큰 도움을 주기도 하는 테스트에 대한 이야기를 해보겠다.

Test란?

테스트란 의도된 대로 정확히 작동하는지 검증하는 절차이다.

Test 코드를 작성해야하는 이유

  • 개발 과정 중 예상치 못한 문제를 미리 발견할 수 있다.
    • 에러를 클라이언트보다 빨리 발견할 수 있는 것이다.
  • 작성한 코드가 의도한 대로 작동하는지 검증할 수 있다.
    • 테스트 코드를 통해 동작하는 방식과 결과 확인이 가능하다.
  • 코드 수정이 필요한 상황에서 유연하고 안정적인 대응할 할 수 있게 해준다.
    • 즉, 테스트 코드는 코드 변경에 대한 사이드 이펙트를 줄이는 예방책이 된다.
    • 또한 코드 변경 시, 변경 부분으로 인한 영향도를 쉽게 파악할 수 있다.
  • 리팩토링 시 기능 구현이 동일하게 되었다는 판단을 내릴 수 있다.
    • 만약 테스트 코드가 존재하지 않다면, 리팩토링은 굉장히 힘든 작업이 된다.
    • 리팩토링은 기존에 잘 동작하는 코드를 변경하여 발전시키는 작업인데, 리팩토링으로 인하여 기존 기능이 동작하지 않으면 굉장한 손해이다. 왜냐하면 테스트를 하든, 리팩토링을 하든 기능이 잘 동작하는 것이 최우선이기 때문이다. 따라서 리팩토링을 하는 시간보다 리팩토링 후 해당 기능을 테스트 하는 시간이 더 요구되는 것은 손해인셈이다.
    • 하지만 테스트 코드가 존재한다면 리팩토링을 마음 편히 할 수 있다.
    • 예를 들어, 버전업을 하면서 현재 구현된 기능이 제대로 버전업에서도 동일하게 구현되게 하는 것이다.
  • 문서로서의 역할이 가능하다.
    • 테스트 코드는 개발자가 작성한 메소드가 어떻게 동작을 시작하고, 어떻게 동작을 했으면, 어떤 결과를 반환했으면 하는지를 작성한 것이다.
    • 따라서 개발자들이 테스트 코드를 통해서 코드의 동작을 수월하게 이해할 수 있다.

테스트의 종류

테스트는 테스트 대상 범위나 성격에 따라 크게 3가지로 구분한다.

UI Test, Integration Test(통합 테스트), Unit Test(단위 테스트) 등으로 구분한다.

테스트 피라미드 수준 https://developer.android.com/training/testing/fundamentals?hl=ko

테스트에 관심이 있는 사람이라면 한 번쯤은 봤을 테스트 피라미드이다.

피라미드 형태로 표현된 이유는 테스트 코드를 작성하는 데 필요한 비용이 때문이다.

구글 공식 문서에서는 각 테스트 비율을 단위는 70%, 통합은 20%, UI은 10%로 구성하는 것이 좋다고 한다.

그럼 한 단계씩 살펴보면서 각 구성에 대해서 알아보자.

Unit Test(단위 테스트)

단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.

여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메소드로 이해할 수 있다. 예를 들어 웹 애플리케이션에서 로그인 메소드에 대한 독립적인 테스트가 1개의 단위 테스트가 될 수 있다.

즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능, 하나의 함수가 올바르게 동작하는지를 독립적으로 테스트 하는 것으로, 각각의 조건에 대한 유효성을 검증한다.

“어떤 기능이 실행되면 어떤 결과가 나온다” 정도로 테스트를 진행한다.

Integration Test(통합 테스트)

중형 테스트에 속하는 통합 테스트(Integration Test)는 모듈을 통합하는 과정에서 서로 다른 모듈 혹은 클래스 간 상호작용의 유효성을 검증하는 테스트이다.

웹 페이지로부터 API를 호출하여 올바르게 동작하는 지를 확인하는 것이다.

일반적으로 애플리케이션은 여러 개의 모듈들로 구성되고, 모듈들끼리 메세지를 주고 받으면서(함수 호출) 기능을 수행한다. 그렇기에 통합된 모듈들이 올바르게 연계되어 동작하는지 검증이 필요한데, 이러한 목적으로 진행되는 테스트가 통합 테스트이다.

또한 통합 테스트는 각 모듈에 대한 설정 또는 테스트를 하기 위해 사전 조건이 필요한 경우가 있기 때문에 단위 테스트보다 테스트 코드를 작성하기가 복잡하다. 하지만 단위 테스트보다 더 넓은 범위의 종속성까지 테스트함으로써 단위 테스트보다 좀 더 유의미한 테스트가 되는 경우도 많다.

UI Test

대형 테스트로 분류되는 UI 테스트는 실제 사용자들이 사용하는 화면에 대한 테스트를 하여 서비스의 기능이 정상적으로 작동하는지 검증하는 테스트이다.

UI 테스트는 실제 앱을 사용하는 사용자의 흐름에 대해 테스트 함으로써 UI 변경 사항으로 인해 발생할 수 있는 문제를 사전에 차단하여 앱의 신뢰도를 높일 수 있다.

하지만 화면과 직접적으로 연관되어있는 테스트이다 보니 실행 시간도 오래 걸리고, 디자인이 변경될 때마다 테스트 코드의 수정이 필요하므로 유지 보수 비용도 큰 편이다.

단위 테스트(Unit Test)의 중요성

단위 테스트(Unit Test)를 작성해야 하는 이유

  • 코드를 수정하거나 기능을 추가할 때 수시로 빠르게 검증할 수 있다.
  • 리팩토링 시에 안정성을 확보할 수 있다.
  • 개발 및 테스팅에 대한 시간과 비용을 절감할 수 있다.
  • 코드에 대한 문서가 될 수 있다.

일반적으로 테스트를 작성하다고 하면 단위 테스트를 의미한다.

통합 테스트는 실제 여러 모듈 간의 상호작용을 테스트하기 때문에 모든 모듈들이 준비가 된 상태에서 테스트를 하게 된다. 그렇기에 통합 테스트를 위해서는 캐시나 데이터베이스 등 다른 컴포넌트들과 실제 연결을 해야 하고, 시스템을 구성하는 컴포넌트들이 많아질수록 테스트를 위한 비용과 시간이 상당히 커진다.

반면에 단위 테스트는 해당 기능과 메소드만 독립적으로 테스트하기 때문에 어떤 코드를 리팩토링하여도 빠르게 문제 여부를 확인할 수 있고 기능이 똑같이 동작하는지 확인할 수 있다.

좋은 단위 테스트의 특징

좋은 테스트를 작성해야 그 이점을 누릴 수 있는데, 좋은 테스트의 특징은 CleanCode에서 정의한 FIRST라는 5가지 규칙을 따라야 한다.

  1. Fast: 테스트는 빠르게 동작하여 자주 돌릴 수 있어야 한다.
  2. Independent: 각각의 테스트는 독립적이며 서로 의존해서는 안된다.
  3. Repeatable: 어느 환경에서도 반복 가능해야 한다.
  4. Self-Validating: 테스트는 성공 또는 실패로 bool 값으로 결과를 내어 자체적으로 검증되어야 한다.
  5. Timely: 테스트는 적시에 즉, 테스트하려는 실제 코드를 구현하기 직전에 구현해야 한다.

즉, 좋은 테스트는 빠르게 독립적으로 어느 환경에서든 실행이 가능하고 검증할 수 있어야 한다는 것이다.

마치며

테스트 코드를 찾아보며 대충 하는 방법만 알고 있었던 거 같아 본격적으로 테스트를 공부하기에 앞서 테스트의 개념에 대해서 알아보았다.

테스트 코드를 작성하기 위해서는 개발자뿐만 아니라 같이 일하는 다른 동료들 모두가 테스트 코드의 중요성에 대해 공감하고 필요성을 느껴야 비로소 테스트 코드를 잘 활용할 수 있다고 생각한다.

profile
Backend Developer
post-custom-banner

0개의 댓글