개발/Spring

[Spring] Slice Test

hojak99 2020. 8. 12. 00:40

나는 테스트에 대해서 공부할 때 통합 테스트, 단위 테스트라는 단어를 많이 들었다.

그래서 내가 필요하다고 생각할 때 단위 테스트를 작성하고 좀 큰 기능인 것 같으면 통합 테스트를 이용해서 전체적인 흐름을 테스트를 하고 있다.

Slice Test

최근에 Mockito 라이브러리를 이용한 mock 을 주입해서 테스트를 하던 중, 슬라이스 테스트라는 용어를 알게 되었다.

Test slicing is about segmenting the ApplicationContext that is created for your test

spring.io 에 따르면 위와 같이 소개를 하고 있다.

https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4

 

Custom test slice with Spring Boot 1.4

 

Spring Boot 1.4 includes a major overhaul of testing support and one of these features is test slicing. I’d like to take the opportunity in this blog post to further explain what it is and how you can easily create your own slices.

Tes

spring.io

 

위 사이트에 나오는 내용을 간단하게 얘기하자면 mockMvc 를 이용해서 컨트롤러를 테스트를 할 때 데이터 레이어에 대해서는 신경쓰지 않아도 되지만 때때로 mock service 를 이용해서 여러 로직에 대해 예상대로 동작하거나 유효성을 검사하도록 하고 싶을 때가 있는데 이 때 mockBean 을 이용해서 할 수 있다... 라는 내용이다.

 

나는 결제 기능 개발 시에 이렇게 mock bean 을 주입해서 테스트를 했다.

우선 결제 기능 개발 시에 생각 해 보니 다음과 같이 로직이 정리가 됐다.

1. 결제 성공
2. 결제 실패
3. 결제 환불 (웹훅으로 작동)

그래서 이렇게 3가지에 대한 로직을 테스트를 하려고 했다. 

하지만 한 가지 기억해야 하는 점은 이 결제 요청이 올바른가에 대한 것인데 이 때 사용하고 있는 결제 대행 서비스가 존재할 것이다. 
이 때 아임포트를 사용하고 있다고 하겠다.

그러면 아임포트 측에 이 결제가 올바른가에 대해서 요청해서 유효성 검사를 해야 하는데 실제로 아임포트에 요청해서 유효성 검사를 한다면 테스트이기 때문에 매번 올바르지 않다고 결과를 던져줄 것이다.

그렇기 때문에 이 아임포트에 요청하는 service 에 mock 을 주입해서 내가 원하는 결과를 던져주도록 하면 된다.

그러면 위 사이트에서 얘기했던 것처럼 여러 로직에 대해 예상대로 동작하는가에 대한 질문에 대해 해결을 할 수 있을 것이다. 




아임포트에 유효성 검사하는 쪽을 mocking 해서 테스트 코드를 작성함으로 써 다음과 같은 동작을 확인하면 된다.


### 테스트 케이스
1. 결제 성공 request 직접 생성
2. 아임포트에서 결제 성공이라는 결과 반환
3. 결제 성공으로 인한 데이터 생성 여부 (로그, 구매 데이터 등)
4. 결제 성공으로 인한 데이터 변경 여부

1. 결제 성공 request 직접 생성
2. 아임포트에서 결제 실패라는 결과 반환
3. 그에 따른 데이터 생성 여부(로그)
4. 실패에 따른 데이터 변경 여부

1. 결제 실패 request 직접 생성 (이 부분은 요구사항에 따라 다르겠지만 결제 실패에 대한 동작이 필요해서 케이스로 만들었다)
2. 아임포트에서 결제 실패라는 결과 반환
3. 결제 실패로 인한 여러 동작 여부

1. 결제건에 대한 환불 요청
2. 아임포트에서 결제 환불이라는 결과 반환
3. 그에 따른 데이터 생성 여부
4. 환불에 따른 데이터 변경 여부


이런 식으로 슬라이스 테스트를 진행함으로 써 여러 로직이 문제 없이 동작했는지, 개발자가 의도한 대로 동작하는지 여부를 아주 편하게 테스트를 할 수 있다.

매번 결제 테스트를 진행할 때마다 낭비되는 시간을 줄일 수 있어서 매우 좋다. 

반응형