단위테스트 작성을 해야하는 이유

dragonappear·2022년 2월 21일
0

TDD

목록 보기
1/5

출처,참고

제목: [TDD] 단위 테스트(Unit Test) 작성의 필요성 (1/3)
작성자: tistory"망나니개발자"
작성자 수정일: 2021년04월20일
링크: https://mangkyu.tistory.com/143
작성: 2022년 2월 21일


1. 단위 테스트 vs 통합 테스트 차이

단위 테스트[Unit Test]

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

    • 여기서 모듈은 어플리케이션에서 작동하는 하나의 기능 또는 메서드로 이해하면 된다.
    • 예를 들어 웹 어플리케이션에서 로그인 메서드에 대한 독립적인 테스트가 1개의 단위 테스트가 될 수 있다.
  • 즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것으로, "어떤 기능이 실행되면 어떤 결과가 나온다" 정도로 테스트를 진행한다.

통합 테스트[Integration Test]

  • 통합 테스트는 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트이다.

    • 일반적으로 어플리케이션은 여러 개의 모듈들로 구성이 되고, 모듈들끼리 메세지를 주고 받으면서 기능을 수행한다.

    • 그렇기에 통합된 모듈들이 올바르게 연계되어 동작하는지 검증이 필요한데, 이러한 목적으로 진행되는 테스트가 통합 테스트이다.

    • 그렇기에 통합 테스트는 독립적인 기능에 대한 테스트가 아니라 웹 페이지로부터 API를 호출하여 올바르게 동작하는 지를 확인하는 것이다.


2. 단위 테스트(Unit Test) 작성의 필요성

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

  • 실무에서 테스트 코드를 작성한다고 하면 거의 단위 테스트를 의미한다.

  • 통합 테스트는 실제 여러 컴포넌트들 간의 상호작용을 테스트하기 때문에 모든 컴포넌트들이 구동된 상태에서 테스트를 하게 된다.

  • 그렇기에 통합 테스트를 위해서는 캐시나 데이터베이스 등 다른 컴포넌트들과 실제 연결을 해야 하고, 시스템을 구성하는 컴포넌트들이 많아질수록 테스트를 위한 비용(시간)이 상당히 커진다.

  • 반면에 단위테스트는 해당 부분만 독립적으로 테스트학 ㅣ때문에 어떤 코드를 리팩토링하여도 빠르게 문제 여부를 확인할 수 있다.

    • 테스팅에 대한 시간과 비용을 절감할 수 있다.
    • 새로운 기능 추가시에 수시로 빠르게 테스트를 할 수 있다.
    • 리펙토링 시에 안정성을 확보할 수 있다.
    • 코드에 대한 문서가 될 수 있다.

실제로 실무에서는 단위테스트를 선호하며, 요즘 많이 사용되는 TDD(Test-Driven Development, 테스트 주도 개발) 에서 이야기 하는 테스트도 단위테스트를 의미한다. 테스트 코드를 수시로 빠르게 돌리면서 문제를 파악할 수 있다.

단위 테스트의 문제점과 Stub

  • 어떤 객체가 자체적으로 모든 일을 처리한다면 문제가 없겠지만, 일반적인 어플리케이션에서는 1개의 기능을 처리하기 위해 다른 객체들과 메시지를 주고 받아야 한다.

  • 하지만 앞서 설명하였듯이 단위 테스트는 해당 모듈에 대한 독립적인 테스트이기 때문에 다른 객체와 메세지를 주고 받는 경우에 문제가 발생한다.

  • 그렇기 때문에 다른 객체 대신에 가짜 객체(Mock Object)를 주입하여 어떤 결과를 반환하라고 정해진 답변을 준비시켜야 하는데, 이를 Stub이라고 한다.

    • 예를 들어, DB에 새로운 데이터를 추가하는 코드를 테스트한다고 하면, 가짜 DB(Mock Database)를 주입하여 insert 처리시에 반드시 1을 반환하도록 하는 것이 stub이다.

좋은 단위 테스트의 특징

  • 일반적으로 요구 사항은 계속해서 변하고, 그에 맞춰 우리의 코드 역시 변경되어야 한다.

  • 하지만 실제 코들르 변경한다는 것은 잠재적인 버그가 발생할 수 있음을 내포한다.

    • 좋은 테스트 코드가 있다면 변경된 코드를 검증함으로써 이를 해결할 수 있다.
  • 또한 실제 코드가 변경되면 테스트 코드 역시 변경이 필요할 수 있는데, 이러한 이유로 우리는 테스트 코드 역시 가독성있게 작성할 필요가 있다.

규칙

테스트를 작성하는 경우에는 다음을 준수하는 것이 좋다

  • 1개의 테스트 함수에 대해 assert()를 최소화해라
  • 1개의 테스트 함수는 1가지 개념 만을 테스트해라

또한 좋고 깨긋한 테스트 코드는 FIRST라는 5가지 규칙을 따라야 한다.

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

실제로 회사의 다른 부서에서 테스트 코드를 작성하는 것을 보았는데, 단위 테스트라는 이름 아래에 Spring의 모든 빈을 띄우는 모습을 볼 수 있었습니다. 작성한 테스트를 실행하는데는 몇 분의 시간이 소요되었고, 이렇게 오랜 시간이 걸리는 테스트를 지켜보면서 단위 테스트의 장점이 빛을 바래는 것을 느낄 수 있었습니다

개인적으로 단위 테스트의 가장 큰 장점은 내가 개발한 것들을 빠르게 검증받는 것이라고 생각합니다. 단위 테스트를 통해 내가 개발한 코드를 바로 검증받고, 테스트를 통과하지 못하면 코드를 수정해 또 다시 빠르게 검증받는 것입니다. 이렇게 테스트를 작성하고 수시로 실행하며 검증하면서 버그를 잡고 개발 비용을 줄어나갈 때 테스트의 가치를 느낄 수 있었습니다.

물론 프로토타입 또는 PoC 성향의 프로젝트라면 단위 테스트를 작성하지 않을 수도 있습니다. 반면에 신규로 개발된 프로젝트이거나 계속해서 기능이 추가되고 유지보수가 필요한 프로젝트라면 단위 테스트를 작성하는게 좋을 것 같습니다. 만약 해당 프로젝트가 이미 구현되어있는 상태라도 늦게나마 단위 테스트를 작성하는 것은 이후에 작업하는데 도움을 줄 것입니다!

0개의 댓글