배움 조각 (Computer Science)
[구글엔지니어는 이렇게 일한다] 테스트 크기와 범위
러너콜리
2023. 12. 22. 13:58
테스트의 크기와 범위를 규정한 것이 흥미롭다. 어떤 테스트를 더 많이 만들어야 하는지 참고 자료로 활용 가능할 것 같다.
테스트가 많아져서 전체 수행 시간이 길어질 경우, 어떤 영역의 테스트를 언제 돌릴지 전략을 세울 수도 있을 것 같다.
테스트 크기와 범위
- 크기(size): 테스트 케이스 하나를 실행하는 데 필요한 자원. 메모리, 프로세스, 시간 등
- 범위(scope): 주어진 테스트가 얼마나 많은 코드를 검증하느냐를 말함
테스트 크기
테스트 크기 |
자원 제약 | 특징 |
작은 테스트 |
• 프로세스(혹은 쓰레드) 하나에서 동작 • 데이터베이스와 같은 제3의 프로그램을 수행해서도 안됨 • 블로킹 호출 안됨 (sleep, 네트워크, 디스크 I/O) • 블로킹 호출 대상은 테스트 대역을 사용해야함 |
• 불규칙한 테스트가 없음 • 작은 테스트 수백 개로 이뤄진 스위트가 하루 종일 실행되는 환경 구성 가능 |
중간 크기 테스트 |
• 기기 하나에서 동작 (로컬 호스트로 제약) • 여러 프로세스와 쓰레드 활용 • 로컬 호스트로의 네트워크 호출 허용 • 외부 시스템과의 통신은 불허 |
• 테스트 대상 코드를 더 현실적인 설정 하에서 검증할 수 있음 • ex) 웹 UI와 서버 코드의 조합 테스트 • 써드파티 프로세스에 의존하여 느려지거나 비 결정적이 될 가능성이 높음 |
큰 테스트 |
• 자원을 원하는 만큼 사용 (로컬 호스트 제약에서 해방) • 전체 시스템의 종단간 테스트에 활용 • 코드 조각이 아닌 설정을 검증하는게 주된 목적 |
• 네트워크를 사용하므로 단일 기기에서 구동할 때 보다 느려지거나 비결정성이 커질 확률이 훨씬 높아짐 |
테스트 범위
- 좁은 범위 테스트 (전체 테스트의 80% 권장)
- 독립된 클래스나 메서드같이 코드의 일부 로직 검증
- ‘실행’되는 코드가 아니라 ‘검증’되는 코드의 양이 기준임
- 중간 범위 테스트 (전체 테스트의 15% 권장)
- 적은 수의 컴포넌트들 사이의 상호작용을 검증
- 서버와 데이터베이스의 상호작용 검증
- 넓은 범위 테스트 (전체 테스트의 5% 권장)
- 전체 시스템간 종단간 테스트
- 메서드 하나에선 괜찮다가 여럿을 조합해서 실행하면 나타나는 예기치 못한 동작 검증
생각해보기
Spring 어플리케이션을 만들 때 작성하는 테스트는 어떤 영역에 속할까?
테스트 크기 테스트 범위 |
작은 테스트 • 프로세스(혹은 쓰레드 하나) |
중간 크기 테스트 • 기기 하나(로컬 호스트)에서 동작 |
큰 테스트 • 자원을 원하는 만큼 사용 |
좁은 범위 테스트 (80%권장) • 독립된 클래스나 메서드 같이 코드의 일부 로직 검증 |
• JUnit으로 Method 1개 테스트 • JUnit으로 동일 Class에 속한 여러 Method 동시 테스트 • JUnit으로 의존 관계를 Mock으로 설정하고 테스트 |
• Spring Boot 환경에서 의존관계를 모두 MockBean으로 설정하고 테스트 | |
중간 범위 테스트 (15%권장) • 적은 수의 컴포넌트들 사이의 상호작용 검증 • 서버와 데이터베이스 상호작용 검증 |
• JUnit으로 Class 여러개 조합하여 테스트 | • Spring Boot 환경에서 Repository 테스트 (@DataJpaTest) • Spring Boot의 Event Driven 구조에서 전파된 이벤트 처리까지 포함한 테스트 • Spring Boot 환경에서 Mock 구현체(ex. EmbededKafka)를 통합하여 처리된 결과까지 같이 테스트 |
|
넓은 범위 테스트 (5%권장) • 전체 시스템간 종단간 테스트 • 여럿을 조합해서 실행하면 나타나는 예기치 못한 동작 검증 |