JUnit 테스트에 대한 고찰

임준영·2021년 6월 21일
0

JUnit 테스트에 대한 고찰

스프링 부트 책을 읽다가 TDD(Test Driven Development)라는 용어가 심심치 않게 등장하였고, 그 이후에 남들이 개발할 때 TDD로 개발을 하면 좋다고 해서 저도 막연하게 트렌디에 뒤쳐지지 않기 위해서 사용했었습니다.

시간이 흘러서 지금도 Controller, Service, Repository 계층 별로 테스트 코드를 작성하다가 우연히 블로그에서 TDD가 정확히 유닛 테스트, 통합 테스트, 기능 테스트라는 상세한 부분으로 나뉘어져 있는 것을 알게 되었습니다.

그래서 아직 저는 TDD를 아무것도 모르고 쓰고 있다는 사실을 알게 되었고, 다시 초심을 잡고 개념부터 살펴보았습니다.

1. 테스트 범위

  • 유닛 테스트: 함수처럼 코드의 작은 부분을 테스트 합니다.
  • 통합 테스트: 서로 다른 시스템들의 상호작용이 잘 이루어지는지 테스트 합니다.
  • 기능 테스트: 사용자와 어플리케이션의 상호작용이 원활하게 이루어지는지 테스트 합니다.

아래 그림은 다른 개발자님의 좋은 글이 있어서 참조하였습니다.

x 축은 테스트이고, y 축은 컴포넌트를 의미하는데 단위 테스트가 가장 크고, 통합 테스트가 중간정도이고, 기능 테스트가 가장 작은 크기를 나타내고 있습니다.

이는 테스트 케이스의 개수라고 보면 될 것 같습니다. 코드 범위로 따지면 유닛 테스트가 가장 작고, 기능 테스트가 가장 큽니다.

2. 단위 테스트(Unit Test)

단위 테스트는 전체 코드 중 작은 부분을 테스트하는 것입니다. 그래서 위에 그림처럼 테스트 케이스가 많습니다. 만약 테스트에 네트워크나 데이터베이스 같은 외부 리소스가 포함된다면 그것은 단위 테스트가 아닙니다.

단위 테스트는 매우 간단하고 명확해야 합니다. 기본적으로 테스트를 위한 입력 값을 주어서 그에 대한 함수의 출력 값이 정확한지 아닌지를 판단하는 것이 단위 테스트라고 할 수 있습니다.

만약 코드의 설계가 좋지 못하면 단위 테스트를 작성하기도 어렵습니다.

3. 통합 테스트

통합 테스트는 이름에서 의미하는 바와 같이 각각의 시스템들이 서로 어떻게 상호작용하고 제대로 작동하는지 테스트 하는 것을 의미합니다.

단위 테스트와의 차이점은 단위 테스트는 독립적이지만, 통합 테스트는 그렇지 않습니다. DB 통신이 대표적입니다.

통합 테스트는 단위 테스트만으로 충분하다고 느끼지 못할 때 사용됩니다. 통합 테스트의 단점은 단위 테스트를 작성하는 것보다 복잡하고 오랜시간이 걸립니다. 그렇기 때문에 통합 테스트가 꼭 필요한 것이 아니면 단위 테스트를 작성하는데 집중하는 것이 좋다고 합니다.

4. 기능 테스트

기능 테스트는 ECE 테스트 혹은 브라우저 테스트라고 불리며 모두 같은 의미입니다. 기능 테스트는 어떤 어플리케이션이 제대로 동작하는지 완전한 기능을 테스트하는 것을 의미합니다.

예를 들어, 어떤 웹 어플리케이션을 기능 테스트한다고 가정해보면 브라우저 자동화 도구를 사용해 특정한 페이지를 클릭한다던가 하는 것이 기능 테스트라 할 수 있습니다.

위에서 언급한 단위 테스트가 개별 함수가 정상적으로 동작하는지 확인하고, 통합 테스트를 통해 서로 다른 시스템이 잘 상호작용 하는지 확인할 수 있습니다.

반면에, 기능 테스트는 이와 완전히 다른 레벨에 있습니다.

기능 테스트는 작성하기가 매우 어렵고 높은 복잡성을 가지고 있기 때문에 많은 시간이 걸립니다.

기능 테스트가 유용한 경우는 사용자와 앱의 상호작용을 테스트하고 싶을 때 입니다. 예를 들어 회원가입에 대한 기능 테스트라 하면 유저가 회원가입을 마치고 안내 문구를 올바르게 출력해줄 것을 보장해주어야 합니다.

참조: https://corgibytes.com/blog/2016/03/28/pyramid-of-tests/, https://cjwoov.tistory.com/9

0개의 댓글