inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Presentation Layer 테스트 (1)

Presentation Layer 테스트 (1) 관련 질문이 있습니다!

1041

비가싫어요

작성한 질문수 87

0

안녕하세요! PresentationLayer 테스트(1) 수강하며 문득 든 궁금증이 있어서 질문을 드립니다.

강의 36:03 쯔음에서 Product가 하나도 저장되지 않은 상태를 테스트할 때, 새로운 Product의 최신 번호를 조회하게 되면 "001"이 되는 과정에서 ActiveProfiletest로 해주지 않아 DB에 데이터가 임의로 들어가 있던 것 때문에 테스트 통과가 되지 않았는데요.

그러면 그 전에 진행했던 createProduct 테스트의 given에서 Product를 하나 저장한다면 여기서도 ActiveProfiletest이지 않았던 상태였기 때문에 저장한 데이터가 4번째 데이터가 되어야 하고 그랬다면 테스트 통과가 안 되어야 하는게 맞지 않았나..? 하는 갑작스러운 의문이 들었습니다.

제가 놓치고 있는게 무엇일까요?

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

답변 2

1

박우빈

안녕하세요, JUNN님! :)

오 저도 진행하면서 의문을 갖지 않았던 부분인데 예리하시네요! ㅎㅎ
제가 다시 복기해보니, 다음과 같은 상황이네요.

현재 설계에서 가정하고 있는 기저 개념은 Product가 생성 요청되는 순으로 productNumber가 발급되어 저장되며, 그에 따라 auto increment되는 id값도 마찬가지로 그 순서대로 발급될 것이다 라는 내용입니다.
그래서 ProductRepository에서 가장 마지막 productNumber를 가져오기 위해 수행했던 쿼리가 다음과 같이 id 기반 역순 조회를 하는 것이었죠.

select p.product_number from product p order by id desc limit 1;

createOrder() 상황에서 디버거를 걸어놓고 현재 DB에 들어있는 값의 상태를 조회해보면 다음과 같습니다.

  • ID 1번 | 상품번호 001 | 아메리카노 (data.sql)

  • ID 2번 | 상품번호 002 | 카페라떼 (data.sql)

  • ID 3번 | 상품번호 003 | 크루아상 (data.sql)

  • ID 4번 | 상품번호 001 | 카푸치노 (테스트에서 저장한 fixture)

맨 마지막 ID로 상품번호를 조회하니 "001"이 조회되었고, 이를 통해 신규 Product를 만드니 "002"가 되어 data.sql의 영향을 받았음에도 테스트가 통과했습니다.


반대로 createProductWhenProductsIsEmpty() 에서는 다음과 같아요.

  • ID 1번 | 상품번호 001 | 아메리카노 (data.sql)

  • ID 2번 | 상품번호 002 | 카페라떼 (data.sql)

  • ID 3번 | 상품번호 003 | 크루아상 (data.sql)

  • (테스트에서는 아무런 fixture도 저장하지 않았음)

이렇게 되니 마지막 ID로 조회한 상품번호는 "003"이 되었고, 이를 통해 신규 Product를 만드니 "004"가 되어 테스트가 실패한 것이죠.


잘 아시겠지만 예시 프로젝트이기 때문에 구멍이 많은 설계임을 감안해주시면 좋을 것 같고요 ㅎㅎ
궁금증이 풀리셨기를 바랍니다.

감사합니다! :)

0

비가싫어요

와 친절한 설명 감사드립니다! :)

0

코딩천국

안녕하세요! 강의 잘 듣고 있습니다. 동시성 관련한 내용이 나와서 질문드립니다.

39분에 동시성 이슈를 unique 인덱스를 걸거나 UUID로 처리한다고 하셨잖아요. 만약 같은 데이터를 요청하는 경우라면은 어떤 식으로 동시성 처리를 할 수 있을까요 ? (예를 들어, 같은 상품 넘버로 카푸치노를 같은 가격으로 등록한다고 하면)

1

박우빈

안녕하세요, 코딩천국님! :)

앗 39분에서 말한 이야기가 바로 그 내용인데요.
같은 데이터로 요청이 들어왔을 때 서버에서는 동시간대에 서로 다른 스레드로 요청이 들어오니 판단하기가 어려울 수 있어, DB에서 unique 인덱스 등으로 방어하는 전략을 고려해 볼 수 있다는 의미로 말씀드린 것이었습니다.

그렇게 참고해주시면 좋을 것 같아요. :)

0

코딩천국

아하! 감사합니다. 바로 이해했습니다.
혹시 그럼 여러 서버 인스턴스를 사용하는 분산환경이라면, unique 인덱스 외에도 분산락, 비관락, 낙관락 등이 필요하겠죠??

테스트 강의에서 다른 질문해서 죄송합니다 ㅎㅎ 강의 듣다가 궁금해져서요!
좋은 하루 보내세요 :)

private 상수 테스트 관련 질문

0

83

1

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

0

126

2

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

0

161

2

테스트 문서화 질문입니다

0

106

2

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

0

96

2

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

0

103

2

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

0

89

2

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

0

135

2

OrderCreateRequest DTO에 대해서 궁금한점

0

102

2

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

0

156

2

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

0

139

3

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

1

124

2

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

0

135

2

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

0

229

2

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

0

150

2

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

0

185

2

test 용 .yml

0

91

2

throws Exception

0

80

2

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

0

89

2

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

0

174

2

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

0

138

1

tearDown 순서

0

116

2

@Builder 생성자 private

0

136

2

@DisplayName gradle / intellJ

0

93

2