본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
https://fastcampus.info/4n8ztzq
안녕하세요 :)
오늘은 "50일의 기적 AI 환급반_ 대규모 채팅 플랫폼으로 한 번에 끝내는 실전 대용량 트래픽 커버 완전판 " 챌린지에 도전하는 열두번째 날입니다.
열한번째 날에는 Groovy Console에 대해 배웠었는데요. 오늘은 과연 어떤 내용들을 배울 수 있을지 공부하고 포스팅 하도록 하겠습니다. (참고로 "05. Spock 사용을 위한 Groovy 기본 문법" 은 실습 위주로 진행을 했다보니 따로 포스팅을 하지 않고, "06-1. JUnit과 Spock의 차이" 강의로 포스팅하도록 하겠습니다.)
오늘 학습할 내용의 제목은,
Part 2. 채팅 뼈대 프로젝트 개발 > Ch 1. 테스트에 대한 이야기 >
05. Spock 사용을 위한 Groovy 기본 문법
AND
06-1. JUnit과 Spock의 차이
입니다.
🧪 JUnit vs Spock: 테스트 프레임워크 비교 분석
1. 테스트 언어와 방식의 차이
- JUnit은 Java 기반의 전통적인 테스트 프레임워크로, 일반적으로 Mockito와 함께 사용됩니다. 명령형(Imperative) 방식으로, 테스트 로직을 하나하나 호출하고 그 결과를 assert 문으로 명시적으로 확인하는 구조입니다.
- 반면 Spock은 Groovy 기반의 프레임워크로, BDD(Behavior-Driven Development) 방식을 따릅니다. given-when-then 블록 구조를 통해 테스트 시나리오가 자연스럽게 문서화되며, 테스트 코드 자체가 명세(spec)가 되는 것이 특징입니다.
2. 테스트 구조 및 문법 차이
- JUnit은 테스트 메서드 하나에 준비, 실행, 검증을 명령형으로 기술합니다. 어떤 기능을 어떤 시나리오에서 테스트하고 있는지 파악하기 어렵고, 주로 메서드 레벨의 동작을 중심으로 검증합니다.
- Spock은 보다 선언적인 스타일로, 기능 단위의 테스트 시나리오를 강조합니다. 자연어에 가까운 문법과 구조 덕분에 기능 명세서 역할도 함께 수행할 수 있습니다.
given: "회원이 존재할 때"
when: "회원 정보를 조회하면"
then: "정상적으로 회원 정보가 반환된다"
- 이런 형태는 읽는 이로 하여금 테스트의 목적을 명확히 이해할 수 있게 해줍니다.
3. 테스트 더블 및 Stub/Mock 지원
- JUnit은 테스트 더블을 자체적으로 지원하지 않기 때문에, 별도로 Mockito를 사용하여 Stub/Mock 객체를 생성해야 합니다. 하지만 설정이 복잡하고, 메서드 체인이나 인자 매칭이 많아지면 가독성이 떨어질 수 있습니다.
- Spock은 Groovy의 연산자 오버로딩과 DSL 문법을 활용해 직관적인 테스트 더블 생성이 가능합니다. Mock(), Stub() 메서드로 간결하게 생성할 수 있으며, 메서드 호출 횟수, 파라미터 검증, 리턴값 설정 등을 코드 몇 줄로 명확히 표현할 수 있습니다.
4. 매개변수화 테스트(Parameterization)
- JUnit에서는 @ParameterizedTest와 함께 별도의 데이터 프로바이더 메서드를 구현해야 하며, 코드가 장황해지고 가독성이 떨어질 수 있습니다.
- Spock은 where: 블록을 사용해 데이터 드리븐 테스트를 지원하며, 입력 데이터를 마치 표처럼 구성할 수 있습니다. 한눈에 테스트 케이스를 파악할 수 있어 실무에서 매우 유용합니다.
5. BDD 문법 지원
- JUnit은 BDD 전용 문법을 제공하지 않으며, BDDMockito 등의 별도 구성으로만 일부 지원됩니다.
- Spock은 given, when, then, expect 등 BDD 스타일 문법을 기본으로 내장하고 있으며, 테스트가 이 구조를 따르지 않으면 컴파일 에러를 발생시켜 형식적 일관성도 보장합니다.
6. 학습 곡선 및 리포팅
- JUnit + Mockito는 자바 개발자에게 익숙한 문법과 구조로, 비교적 학습 비용이 낮고 진입장벽이 낮습니다.
- Spock은 Groovy라는 언어 자체가 낯선 데다, 연산자 오버로딩을 활용한 선언형 스타일이라 학습 곡선이 다소 가파를 수 있습니다. 그러나 익숙해지면 훨씬 더 간결하고 가독성 좋은 테스트를 작성할 수 있습니다.
- 실패 리포팅 측면에서도 Spock은 입력값, 기대값, 차이 비율 등을 시각적으로 자세히 출력해주며, 디버깅에 더 효과적입니다.
- JUnit은 익숙하고 안정적인 선택이지만, 테스트 코드가 많아질수록 반복성과 중복 코드가 많아지는 경향이 있습니다. 특히 Mockito와 함께 쓸 때는 코드가 장황해지고 복잡성이 증가하는 점이 아쉬웠습니다.
- 반면 Spock은 처음엔 생소하지만, 테스트 코드가 마치 기능 명세처럼 읽힌다는 점에서 강력한 장점이 있습니다. 특히 where: 블록을 통한 데이터 기반 테스트는 실제 업무에서도 반복적인 유닛 테스트를 대체할 수 있는 큰 가능성을 느꼈습니다.
- Spock은 단순한 테스트 도구가 아니라, 테스트와 문서화, 명세화를 동시에 가능하게 해주는 프레임워크입니다. 저는 앞으로 점점 더 복잡해지는 비즈니스 로직을 명확하게 표현하고 싶을 때, Spock을 더 많이 활용하게 될 것 같습니다.