인프런 커뮤니티 질문&답변

김정기님의 프로필 이미지

작성한 질문수

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

키워드 정리

테스트를 위한 테스트쿼리 작성시 궁금증

작성

·

240

0

  • 학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!
  • 먼저 유사한 질문이 있었는지 검색해 보세요.
  • 서로 예의를 지키며 존중하는 문화를 만들어가요. 
    현재 자바 백엔드 개발자입니다. 현재 마이바티스로 테스트 코드를 짜려고하는데 검증할 쿼리는 어떤 테이블의 특정 버전의 가장 높은 버전을 가져오는 쿼리로 그 특정버전으로 정렬을 시키고 top(1)을 사용해서 가져오게하는 쿼리로 짜놓은 상태입니다. 그러면 이걸 테스트를 하려고하면 셀렉트 쿼리를 하나 더짜서 그 특정버전에 max()를 사용해서 값으로 가져온 후 검증을 하는 방법이 떠오르는데요 그러면 이런 또하나의 쿼리가 생기는데 또하나의 쿼리가 잘 못 된다면 그 테스트의 경우가 잘못되는것을 말하는데 이런 상황에서 어떻게 하셨는지 궁금합니다

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 김정기 님! :)

말씀주신 고민이 JPA와 mybatis의 차이에서 발생하는 고민이라기 보다는, 검증하는 방법에 대해 한번 고민해보시면 좋을 것 같은데요. ㅎㅎ
강의에서 말씀 드린 것처럼 테스트는 세 가지 단계를 거치게 됩니다.

  • given

    • 해당 테스트 케이스(이하 TC)에 사용할 데이터(fixture)를 생성하는 단계입니다.

  • when

    • TC에 해당하는 행위를 수행합니다.

  • then

    • 행위를 수행한 후, 의도한대로 동작했는지 검증합니다.

김정기 님이 댓글에 말씀주신 예시를 가지고 구성해본다면, 다음과 같을 것입니다.

  • given

    • 아메리카노, 카페라떼, 스무디 데이터 생성 및 저장

    • 이 때, 스무디를 가장 비싼 가격으로 설정

  • when

    • 가장 비싼 메뉴를 가져오는 쿼리 or 메서드 수행

  • then

    • 1. 가져온 결과가 가장 비싼 메뉴인지 검증

    • 2. 가져온 결과가 스무디인지 검증

차이점은 then절에서 생길텐데요.
말씀주신 방법은 1번으로, 다시 DB에서 가장 비싼 메뉴를 검증하기 위해 쿼리를 날려서 해당 메뉴를 가져와 비교하는 방법입니다.
이미 고민하고 계신 것처럼, 검증을 위한 테스트 쿼리가 잘못되면 테스트 자체가 무의미한 테스트가 될 수 있습니다.

사실 잘 생각해보면, 우리는 given절에서 테스트 케이스를 구상하며 데이터를 만들면서, (즉, TC를 위한 상황을 임의로 구성하면서) 스무디가 가장 비싼 메뉴라는 것을 알고 있습니다.
그렇다는 것은, when절에서 프로덕션 쿼리를 수행해 나온 결과가 가장 비싼 메뉴인지를 다시 조회하여 검증하는 것이 아니라, 이미 우리가 스무디가 가장 비싼 메뉴라는 것을 가정하고 TC 상황을 구성했기 때문에 2번 방법처럼 결과가 스무디인지를 검증하면 되는 것이죠. (메뉴의 이름, 가격 등으로)

새로운 테스트용 쿼리를 짜서 검증하게 되면 (when절에서 수행하는) 프로덕션 쿼리와 거의 같은 쿼리를 짜게 될텐데, 검증이라는 단계가 큰 의미가 없어질 것 같아요.

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

0

김정기님의 프로필 이미지
김정기
질문자

카페라고 예시를 들겠습니다

아메리카노 카페라떼 스무디가 있다면

스무디가 가장비싼 음료라고 가정을 하겠습니다

현재 제가짠 쿼리는 스무디를 정상적으로 잘 가져오고 있습니나

그런데 짠 쿼리를 검증하려면 스무디가 가장 비싼 가격이라는 것을 검증을 해야하는데 이 가격을 검증을하려면 데이터베이스를 한번더 조회하는 쿼리를 짜서 확인을 해야하는데 이 테스트 쿼리가 잘못됐다면

테스트가 잘못된 테스트가 되어버리는건디

이러한 상황에서 다들 어떻게 하셨는지 궁금합니다

jpa가 아닌 경우여서 발생하는 상황인데 충분히 생길 수 있는 상황이라 궁금합니다