테스트 코드 (1)

Jeong Gyejin·2023년 3월 12일
0

스프링 프레임워크

목록 보기
8/17

테스트 코드란?

우리가 작성한 코드나 비즈니스 로직 자체를 테스트하기 위해 작성한 코드를 의미합니다. 많은 개발자들이 어떻게 하면 테스트 코드를 더 잘 작성하고 활용할 수 있는지를 고민하고 있으며, 그 결과로 테스트 주도 개발이 등장하기도 했습니다. 사실 테스트 코드를 작헝하는 것과 테스트 주도 개발은 엄연히 다릅니다. 하지만 테스트 주도 개발은 개발 관점을 다르게 볼 수 있는 기회가 되기도 합니다.

테스트 코드를 작성하는 이유

테스트 코드를 작성하는 이유는 정말 다양합니다.

  • 개발 과정에서 문제를 미리 발견할 수 있습니다.
  • 리팩토링(결과의 변경 없이 코드의 구조를 재조정하는 방법)의 리스크가 줄어듭니다.
  • 애플리케이션을 가동해서 직접 테스트하는 것보다 테스트를 빠르게 진행할 수 있습니다.
  • 하나의 명세 문서로서의 기능을 수행합니다.
  • 몇가지 프레임워크에 맞춰 테스트 코드를 작성하면 좋은 코드를 생산할 수 있습니다.
  • 코드가 작성된 목적을 명확하게 표현할 수 있으며, 불필요한 내용이 추가되는 것을 방지합니다.

단위 테스트와 통합 테스트

테스트 방법은 여러 기준으로 분류할 수 있습니다.

  • 단위 테스트: 애플리케이션의 개별 모듈을 독립적으로 테스트하는 방식입니다.
  • 통합 테스트: 애플리케이션을 구성하는 다양한 모듈을 결합해 전체적인 로직이 의도한대로 동작하는지 테스트방법입니다.

단위 테스트

테스트 대상의 범위를 기준으로 가장 작은 단위의 테스트 방식입니다. 일반적으로 메서드단위로 테스트를 수행하게 되며, 메서드의 호출을 통해 의도한 결과값이 나오는지 확인하는 수준으로 테스트를 진행합니다. 또한 비용이 적게 들기 때문에 테스트 피드백을 빠르게 받을 수 있습니다.

통합 테스트

모듈을 통합하는 과정에서의 호환성 등을 포함해 애플리케이션이 정상적으로 동작하는지 확인하기 위해 수행하는 테스트 방식입니다.

단위 테스트의 경우는 모듈을 독립적으로 테스트하는 반면 통합 테스트는 여러 모듈을 함께 테스트해서 정상적인 로직 수행이 가능한지를 확인합니다. 그리고 단위 테스트는 일반적으로 특정 모듈에 대해서만 테스트를 진행하기 때문에 데이터베이스나 네트워크 같은 외부 요인들을 제외하고 진행하는 데 비해 통합 테스트는 외부 요인들을 포함하고 테스트를 진행하므로 애플리케이션이 온전히 동작하는지를 테스트하게 됩니다. 다만 테스트를 수행할 때마다 모든 컴포턴트가 동작하기때문에 테스트 비용이 커지는 단점이 있습니다.

테스트 코드를 작성하는 방법

1. Given-When-Then 패턴

테스트 코드를 표현하는 방식 중 하나로 단계를 설정해서 단계의 목적에 맞게 코드를 작성합니다.

  • Given: 테스트를 수행하기 전에 테스트에 필요한 환경을 설정하는 단계로 테스트에 빌요한 변수를 정의하거나 Mock 객체를 통해 특정 상황에 대한 행동을 정의합니다.

  • When: 테스트의 목적을 보여주는 단계입니다. 실제 테스트 코드가 포함되며, 테스트를 통한 결과값을 가져오게 됩니다.

  • Then: 테스트의 결과를 검증하는 단계입니다. 일반적으로 When 단계에서 나온 결과값을 검증하는 작업을 수행합니다. 결과값이 아니더라도 이 테스트를 통해 나온 결과에서 검증해야하는 부분이 있다면 이 단계에 포함합니다.

간단한 테스트로 여겨지는 단위 테스트에서는 잘 사용하지 않습니다. 그 이유는 불필요하게 코드가 길어지기 때문입니다. 하지만 이 패턴을 통해 테스트 코드를 작성한다면 명세 문서의 역할을 수행한다는 측면에서는 도움이 됩니다.

2. 좋은 테스트를 작성하는 5가지 속성(F.I.R.S.T)

테스트 코드를 작성하는데 도움이 될 수 있는 5가지 규칙을 의미합니다. 이 규칙은 대체로 단위 테스트에 적용할 수 있습니다.

  • Fast: 테스트는 빠르게 수행되야 합니다. 테스트가 느리면 코드를 개선하는 작업이 느려져 코드 품질이 떨어질 수 있습니다. 테스트 속도에 절대적인 기준은 없지만 목적을 단순하게 설정해서 작성하거나 외부 환경을 사용하지 않는 단위 테스트를 작성하는 것 등을 빠른 테스트라고 할 수 있습니다.

  • Isolated: 하나의 테스트 코드는 목적으로 여기는 하나의 대상에 대해서만 수행되야 합니다. 만약 하나의 테스트가 다른 테스트 코드와 상호작용하거나 관리할 수 없는 외부 소스를 사용하게 되면 외부 요인으로 인해 테스트가 수행되지 않을 수 있습니다.

  • Repeatable: 테스트는 어떤 환경에서도 반복 가능하도록 작성해야 합니다. 이 의미는 앞의 Isolated 규칙과 비슷한 의미를 갖고 있습니다. 즉 테스트는 개발 환경의 변화나 네트워크의 연결 여부와 상관없이 수행되야 합니다.

  • Self-Validating: 테스트는 그 자체만으로도 테스트의 검증이 완료되야 합니다. 테스트가 성공했는지 실패했는지 확인할 수 있는 코드를 함께 작성해야 합니다. 만약 결과값과 기대값을 비교하는 작업을 코드가 아니라 개발자가 직접하고 있다면 좋지 못한 테스트 코드입니다.

  • Timely: 테스트 코드는 테스트하려는 애플리케이션 코드를 구현하기 전에 완성되야 합니다. 너무 늦게 작성된 테스트 코드는 정상적인 역할을 수행하기 어려울 수 있습니다. 또한 테스트 코드로 인해 발견된 문제를 해결하기 위해 소모되는 개발 비용도 커지기 쉽습니다. 다만 이 개념은 테스트 주도 개발의 원칙을 따르는 테스트 작성 규칙으로, 테스트 주도 개발을 기반을 애플리케이션을 개발하는 것이 아니라면 이 규칙은 제외하고 진행하기도 합니다.

profile
항상 더 나은 개발자가 되기 위해서 끊임없이 공부하고 학습하면서 성장하는 사람이 되겠습니다.

0개의 댓글