테스트에 대한 생각 정리

업데이트:


테스트에 대한 생각 정리

테스트

서비스를 더 안정적으로 운영하기 위해 좋은 테스트란 무엇일까 생각하고, 실제 MSA 환경에서 테스트는 어떻게 이루어지고 깨달은 점을 정리한다.

개요

  • 단위 테스트(unit test)와 통합 테스트(integratation test)에 대해 이해한다.
  • 단위테스트에 대해 새롭게 깨달은 생각을 작성한다.

테스트 케이스

  • 단위테스트
    • 서비스 모듈에서 정의한 메서드가 의도한대로 동작하는지 테스트
    • 코드상에서 발생하는 논리적 에러 방지
    • 도메인에서 발생하는 다양한 케이스에 대한 에러 방지
    • 단위 테스트 프레임워크는 JUnit을 사용하고 테스트 커버리지 확인을 위해 JaCoCo 사용
  • 내부 통합테스트
    • 우리 서비스 내에서 각 모듈간의 통신이 정상적으로 동작하는지 테스트
    • 시퀀스 다이어그램을 작성하고 전체 플로우를 확인
    • k8s 환경에서 전체 시퀀스가 정상적으로 동작하는지 확인
    • 내부 통신 프로토콜로는 gRPC와 kafka를 사용 (서비스 간 통신 port 설정)
  • 통합 연동테스트
    • 외부 금융사와 우리 서비스가 정상적으로 동작하는지 테스트
    • 실제 서비스 환경을 구성하고 정상적으로 동작하는지 확인
    • k8s ingress, egress 설정 및 gateway 설정

좋은 단위 테스트란

  • 테스트 커버리지만 높다고 좋은 테스트일까? 테스트 커버리지가 90%라고해도 모든 테스트 케이스를 커버하지 못한다. 테스트 커버리지 달성은 당연히 해야하는 작업이고 지속가능한 서비스를 위한 최소 조건이라고 생각한다.
  • 좋은 테스트는 아래 두가지를 충족해야 한다고 생각한다.
    • 코드상에서 발생하는 논리적 에러를 방지하기 위한 테스트 (단순 성공, 실패)
    • 도메인에서 발생하는 여러 엣지 케이스를 위한 테스트 (엣지 케이스 방어)
  • 이전에는 테스트 코드를 통해 내가 작성한 코드가 의도한 대로만 동작한다면 문제가 없다고 생각했다. 하지만 내가 작성한 코드가 특정 엣지 케이스에서는 동작하지 않는 경우가 있었다. (실제 마이데이터 금융 도메인은 생각보다 복잡하다.)
    • 예를들면, 데이터 전송을 최소화 하기위해 각 테이블의 동기화 시간을 이용하는데 특정 케이스에서는 동기화 시간을 업데이트 해야하는가 하지 않아야하는가 등
  • 이렇게 발생할 수 있는 문제를 예방하기 위해 가능한 엣지 케이스를 생각하고 시트에 테스트 목록을 작성하여 테스트 코드를 작성하고 관리했다. (목록화 하지 않고 보면 각 엣지 케이스들이 매우 헷갈림)

결론

  • 단위 테스트를 개발하기 전에 테스트 목록을 작성하고 관리하면 엣지 케이스를 방어하고 더욱 효율적으로 관리 할 수 있다.

댓글남기기