Framework/Spring

[TIL][Test] 단위 테스트/통합 테스트/인수 테스트, 테스트 코드의 필요성

쉬지마 이굥진 2024. 3. 22. 01:07

테스트 코드를 프로젝트에 적용하기에 앞서, 테스트에 대해 공부하고 회고해보는 시간을 가지고 포스팅한다.

 

사실 여태 테스트 코드를 작성하지 않고 Postman 으로만 API 기능 테스트를 진행해왔다.

하지만 수동으로 API 요청을 생성한 후 테스트를 실행해야 해서 자동화가 불가능했고, 모든 시나리오와 경로를 수동으로 테스트 해야했기 때문에 그 과정에서 내가 예상하지 못한 버그 확률이 높아졌다. 테스트 해야 할 시나리오를 빼먹기도 했고 🥲 

그래서 테스트 코드의 필요성을 느끼고, 비즈니스 로직의 핵심인 서비스 레이어 코드부터 단위 테스트를 진행해보려 한다. 아래 '단위 테스트 단점' 에서 언급할 객체 간 의존성 문제를 해결하기 위해 객체를 mocking 해서 진행할 예정이다! 


🔎 테스트 코드란? 

소프트웨어 기능과 동작을 테스트하는데 사용되는 코드를 말한다!개발자가 요구사항에 맞게 개발한 기능이 '의도대로' '정확히' 동작하는지 검증하는 절차를 코드화 해놓은 것이 테스트 코드이다.

 

 

🔎 그럼 테스트 코드를 왜 써야되나요 ? 

Add Function 관점

  • 신규 기능 개발 과정 중, 예상하지 못했던 문제를 미리 발견할 수 있다!
  • 작성한 코드가 의도한 대로 동작하는지 검증할 수 있다!

Refactoring 관점 

  • 단순 구조적 변경(중복 제거, 캡슐화)을 적용했을 때, 이전과 동일하게 기능이 정상 동작하는지 여부를 확인할 수 있다.
  • 코드 수정이 필요한 상황에서 유연하고 안정적인 대응을 할 수 있다.

 

🔎 테스트의 종류

TEST의 종류는 테스트 대상 범위나 성격에 따라 크게 3가지로 구분된다.

UI, Service(Intergration), Unit Test 등으로 구분된다.

아래 피라미드 구조를 보면, 밑으로 내려갈수록 테스트의 속도와 비용은 줄어들지만, *테스트의 크기(또는 범위)는 점점 커지는 것을 볼 수 있다! 

* 여기서 테스트의 크기: 테스트가 커버할 수 있는, 기능을 검증할 수 있는 크기를 말한다고 보면 됨 

 

 

✏️ 단위 테스트 (Unit Test)

  • 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트를 말한다.
  • 여기서 모듈은 애플리케이션을 구성하는 객체의 기능(메서드)을 의미한다.
  • ex) 티스토리 웹페이지의 로그인 기능 중 UserID와 Password를 입력받아 회원 인증을 하는 메서드에 대한 독립적인 테스트가 1개의 단위 테스트가 될 수 있다. 
  • 즉, 단위 테스트는 하나의 메서드(혼자서 어떠한 기능을 완성시킬 수 없는 단위) 가 올바르게 작동하는지를 독립적으로 테스트 하는 것을 말한다!

단위 테스트의 장점단점

장점 (+)

  • 단위 테스트는 *회귀성을 보장하기 때문에, 코드 수정에 따른 불안감을 해소할 수 있다.
  • 언제든지 빠르고 쉽게 테스트할 수 있기 때문에 신규 기능 또한 리팩토링에 대한 불안감을 낮출 수 있다.
  • 코드 자체가 API의 기능을 설명하는 문서의 기능을 제공할 수 있다. (구글 Docs나 워드 안봐도, 이 API가 어떻게 동작하고 어떤 리턴값 반환하는 지 볼 수 있음) 

단점 (-)

  • 객체는 객체 간의 협력을 통해서 기능을 완성시킨다. 하지만, 단위 테스트 코드 작성 시 이러한 의존성 문제를 해결 해야하는 불편함이 있다. 시간 또한 소요된다.

* 여기서 회귀성 : 코드가 실행이 됐을 때, 오류가 있다면 오류를 발생시킨다!

 

 

✏️ 통합 테스트 (Intergration Test )

  • 모듈을 통합하여 서로 다른 모듈 혹은 객체 간 상호작용의 유효성을 검증하는 테스트를 말한다.
  • ex) 웹페이지의 로그인 기능을 작은 단위(모듈)로 나누면 아래와 같다. 
    1. UserID 및 Passwd 값에 대한 유효성 검사
    2. UserID 및 Passwd 기반으로 회원 여부 확인 
    3. Passwd 확인
    4. 토큰 발급
  • 이렇게 나눠져 있는 모듈을 하나로 합쳐서 로그인 API를 만들고 테스트하는 단위를 통합 테스트라고 한다.

 

✏️ 인수 테스트 (UI Test)

  • 대형 테스트로 분류되는 UI 테스트는 실제 사용자들이 사용하는 화면에 대한 테스트를 하여 서비스의 기능이 정상적으로 작동하는지 검증하는 테스트를 말한다.
  • ex) 새롭게 추가된 티스토리 홈페이지의 로그인 기능을 Staging 환경에만 배포하고, 실제 유저가 아닌 테스트 유저 (QA or 개발자 or PM)로써 웹 브라우저를 통해서 로그인 기능을 테스트하는 것을 말한다.
  • 인수 테스트의 경우, 배포 단계를 꼭 !!!! 거쳐야 테스트가 가능하기 때문에 많은 리소스가 소요된다.

 

<다음 포스팅>

 

[TIL][Test] TDD 파헤쳐보기 (개념, 장/단점, 흐름)

테스트 코드를 본격적으로 쓰기 전에 테스트의 종류와 필요성에 대해 정리했던 시간을 가졌었다. 2024.03.22 - [Framework/Spring] - [TIL][Spring] 단위 테스트/통합 테스트/인수 테스트, 테스트 코드의 필요

developer-jinnie.tistory.com