Spring & Spring boot

[Springboot] 테스트 코드 - 1 - 테스트 개요

jh4dev 2024. 8. 4. 21:18

 

<목차>

1. Test 의 중요성
2. Test 방법
3. Test 코드 작성 방법

[Test 의 중요성]

  • 최근들어 애플리케이션을 개발할 때, 테스트 코드로 로직을 확인하는 과정이 더 중요하게 여겨지고 있다.
    특히, CI/CD 파이프라인 구축에 있어, 테스트 코드 작성은 매우 중요하다.
  • 개발 과정에서 문제를 미리 발견할 수 있다.
  • 리팩토링의 리스크가 줄어든다.
  • 애플리케이션을 가동해서 직접 테스트하는 것보다 테스트를 빠르게 진행할 수 있다.
  • 하나의 명세 문서로의 기능을 수행한다.
  • 몇 가지 프레임워크에 맞춰 테스트 코드를 작성하면 좋은 코드를 생산할 수 있다.
  • 코드가 작성된 목적을 명확하게 표현할 수 있으며, 불필요한 내용이 추가되는 것을 방지한다.

 


[Test 방법]

  • 단위 테스트 - Unit Tests
    • 테스트 대상의 범위를 기준으로, 가장 작은 단위의 테스트 방식
    • 일반적으로 메서드 단위로 테스트를 수행하게 되며, 메서드 호출을 통해 의도한 결과값이 나오는지 확인하는 수준의 테스트
    • 테스트 비용이 적게 들기 때문에, 테스트 피드백을 빨리 받을 수 있다.
  • 통합 테스트 - Integration Tests
    • 모듈을 통합하는 과정에서의 호환성 등을 포함해 애플리케이션이 정상적으로 동작하는지 확인하기 위해 수행하는 테스트 방식
    • 여러 모듈을 함께 테스트하여, 정상적인 로직 수행이 가능한지 확인하는 테스트
    • DB나 네트워크와 같은 외부 요인들을 포함하고 테스트를 진행
    • 매 테스트 수행 시, 모든 컴포넌트가 동작해야 하기 때문에 테스트 비용이 커진다는 단점이 있다.

[Test 코드 작성 방법]

  • Given - When - Then Pattern
    • 테스트 코드를 표현하는 방식 중 하나로, 각 단계는 아래와 같은 목적을 가진다.
    • Given
      • 테스트를 수행하기에 앞서, 테스트 환경을 설정하는 단계
      • 테스트에 필요한 변수를 정의하거나, Mock 객체를 통해 특정 상황에 대한 행동을 정의한다.
    • When
      • 테스트의 목적을 보여주는 단계
      • 실제 테스트 코드가 포함되며, 테스트를 통한 결과값을 가져오게 된다.
    • Then
      • 테스트의 결과를 검증하는 단계
      • 일반적으로 When 단계에서 나온 결과값을 검증하는 작업을 수행한다.
      • 꼭 결과값이 아니더라도, 테스트를 통해 도출된 결과에서 검증해야 하는 부분이 있다면 이 단계에 포함한다.
    • TDD(Test - Driven - Development) 테스트 주도 개발에서 파생된 BDD(Behavior - Driven - Development)에서 널리 사용된다.
    • 단위 테스트에 이 패턴을 적용할 시, 불필요하게 테스트 코드가 길어진다는 단점이 있다.
      하지만, GWT 패턴으로 단위 테스트 코드를 작성한다면, '명세' 문서의 역할을 수행할 수 있어 많은 도움이 된다.
  • F.I.R.S.T Strategy
    • 테스트 코드에 도움이 되는 5가지 규칙을 의미하며, 대체로 단위 테스트에 적용하는 규칙
    • Fast
      • 테스트는 빠르게 수행되어야 한다.
      • 테스트 목적을 단순하게 설정하여 작성
      • 외부 환경을 사용하지 않도록 작성
    • Isolated
      • 하나의 테스트 코드는 하나의 대상에 대해서만 수행되어야 한다.
      • 만약 다른 테스트 코드와 상호작용 하거나, 관리할 수 없는 외부 소스를 사용하게 되면, 외부 요인으로 인해 테스트가 수행되지 않을 수 있기 때문
    • Repeatable
      • 테스트는 어떤 환경에서도 반복 가능하도록 작성되어야 한다.
      • 개발 환경의 변화나 네트워크의 연결 여부와 상관 없이 수행되어야 한다.
    • Self-Validating
      • 테스트는 그 자체만으로 검증이 완료되어야 한다.
      • 즉, 테스트가 성공했는지 실패했는지 확인할 수 있는 코드를 함께 작성해야 한다.
    • Timely
      • 테스트 코드는 테스트하려는 애플리케이션 코드를 구현하기 전에 완성되어야 한다.
      • TDD 원칙을 따르는 테스트 작성 규칙으로, TDD 기반의 개발이 아니라면 이 규칙은 제외하기도 한다.