inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Practical Testing: 실용적인 테스트 가이드

Classicist VS. Mockist

Classicist VS. Mockist

383

양성빈(Robert)

작성한 질문수 28

0

우빈님. 안녕하세요! 질문이 있어서 남겨드립니다.

제가 테스트할때는 repository부분의 쿼리메서드나 jpql로 작성한 코드들은 따로 테스트를 하지 않고 QueryDSL같은 외부 라이브러리를 사용할때만 단위 테스트를 진행합니다. 그리고 비즈니스 레이어에 대해서는 위의 repository를 mocking하여 사용하고 컨트롤러 부분에서 통합테스트를 진행합니다.

해당 부분에서 우빈님과 하는 방식이 다른것 같습니다. 우빈님은 비즈니스 레이어에서 통합테스트를 진행하고 Presentation 레이어에서 mocking을 이용한다고 하셨는데 혹시 제가 하는 방식에서 조언을 주실 수 있으실지 잘못된 방향성으로 가고 있는지에 대해 여쭤보고 싶습니다. 또한 우빈님께서 그렇게 진행하시는 이유에 대해 듣고 싶습니다.

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 1

3

박우빈

안녕하세요, 양성빈 님!

 

제가 테스트할때는 repository부분의 쿼리메서드나 jpql로 작성한 코드들은 따로 테스트를 하지 않고 QueryDSL같은 외부 라이브러리를 사용할때만 단위 테스트를 진행합니다.

아주 단순한, 쿼리가 예측되는 메서드라면 비용을 고려하여 테스트를 스킵할 수도 있겠으나, 결국 런타임 시점에 생성되는 SQL 쿼리를 검증하지 않고는 기능을 보장하기가 어렵습니다.

  • 쿼리 메서드 : Spring data JPA에서 제공하는 기능으로 결국 SQL를 생성해주는 것이니, 복잡한 쿼리일수록 예측이 어려울 수 있습니다.

  • JPQL : 문자열로 작성되기에, 단순한 오타 등 동작하지 않을 가능성이 쿼리 메서드보다 더 큽니다.

  • QueryDSL : 컴파일 타임에 어느 정도 기능 보장을 해주나, 마찬가지로 최종 생성되는 SQL에 대한 검증이 필요합니다.

그래서 사실 어떤 방식을 사용하든, 런타임 시점의 기능을 보장하기 위해서는 테스트가 필수라고 생각해요.

 

그리고 비즈니스 레이어에 대해서는 위의 repository를 mocking하여 사용하고 컨트롤러 부분에서 통합테스트를 진행합니다.

위에 말씀드린 이유로 인해, 복잡한 Repository의 쿼리 뿐만 아니라, 다양한 Repository, 비즈니스 로직이 얽힌 서비스 계층에서 Repository를 mocking하여 테스트하는 것은 저는 조금 위험할 수 있다고 생각해요.
저도 테스트를 작성하지 않고 기능을 개발했을 때, 쿼리가 실제 생각한대로 동작하지 않아 결국 시간을 더 사용하게 되었던 경험이 많습니다.

Controller 단에서 Repository를 포함한 전체 통합 테스트를 한다고 하더라도, Repository 단위 레이어 테스트로 보장할 수 있는 케이스를 가장 바깥 레이어의 통합 테스트 케이스로 커버하는 것은 비용 측면에서도 비효율적인 것 같아요 ㅎㅎ

도움이 되셨기를 바랍니다.
감사합니다 🙂

0

양성빈(Robert)

우빈님 답변 감사합니다! 정말 도움되는 답변이였습니다!

private 상수 테스트 관련 질문

0

82

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

124

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

159

2

테스트 문서화 질문입니다

0

104

2

단위테스트 질문이 있습니다

0

94

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

100

2

ERD 가장자리에 있는 도메인 테스트 질문

0

86

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

131

2

OrderCreateRequest DTO에 대해서 궁금한점

0

101

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

154

2

계층 관련 질문이 있습니다.

0

137

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

122

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

133

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

226

2

Service+Repository 통합테스트 관련 질문입니다.

0

149

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

183

2

test 용 .yml

0

89

2

throws Exception

0

78

2

카페키오스크 클래스 문의 ,,

0

87

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

171

2

테스트 코드에서 필요한 생성자

0

136

1

tearDown 순서

0

114

2

@Builder 생성자 private

0

133

2

@DisplayName gradle / intellJ

0

91

2