테스트 코드를 프로젝트에 적용하기에 앞서, 테스트에 대해 공부하고 회고해보는 시간을 가지고 포스팅한다.
사실 여태 테스트 코드를 작성하지 않고 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)로써 웹 브라우저를 통해서 로그인 기능을 테스트하는 것을 말한다.
- 인수 테스트의 경우, 배포 단계를 꼭 !!!! 거쳐야 테스트가 가능하기 때문에 많은 리소스가 소요된다.
<다음 포스팅>
'Framework > Spring' 카테고리의 다른 글
[TIL] 같은 타입의 Bean이 2개라면 발생하는 문제 해결 (feat. @Primary, @Qualifier) (0) | 2024.08.06 |
---|---|
[TIL][Test] TDD 파헤쳐보기 (개념, 장/단점, 흐름) (0) | 2024.04.01 |
[Spring] AOP 란? 관점 지향 프로그래밍 AOP 정의 (2) | 2024.02.21 |
프레임워크와 라이브러리의 차이 (1) | 2024.01.16 |