해결된 질문
작성
·
383
·
수정됨
1
안녕하세요 코틀린강의부터 코프링까지 잘 듣고 있습니다.
바로 질문 드리자면,!
1.saveUserTest2라는 테스트케이스를 한 개 더 만들어서 모든 테스트를 진행 시킨다면, saveUserTest는 통과하지만 saveUserTest2는 DB데이터가 2개가 있어서 통과되지 못 합니다. 이럴 때는 어떻게 해야 독립적으로 DB값을 가지게 할 수 있나요? @Transactional 쓰는 rollback된다고 얼핏 들은 거 같은데 잘 모르겠네요..
2.실제 h2 DB에는 유저가 2명이 저장이 되어 있는데 테스트환경에서는 0명인 이유는 @SpringBootTest 어노테이션이 실제 실행환경과 완전히 독립된 환경을 만들어 주어서 그런 건가요?
감사드립니다.
답변 1
0
안녕하세요, 차가운물님!! 😊 좋은 질문 질문 감사드립니다!! 🙏
하나씩 답변 드려보겠습니다!
[1. 공유자원 관리]
서로 다른 테스트 함수에서 같은 DB를 사용해서 테스트가 실패하는 경우, 말씀해주신것처럼 @Transactional
어노테이션을 활용해서 rollback을 시키는 방법도 있고요!
@AfterEach
어노테이션이나 @BeforeEach
어노테이션에서 사용했던 DB 자원을 정리해주는 방법도 있습니다! 두 번째 방법을 <8강. 유저 관련 기능 테스트 작성하기>에서 소개해드리고 있어요!
개인적인 선호는 두 번째 방식인데요!! 그 이유는 트랜잭션 어노테이션을 테스트 함수에 작성하게 되었을 때, 원래는 테스트가 실패해야 함에도 @Transactional
어노테이션이 생김으로 인해 테스트가 성공해버릴 수 있기 때문인데요! 이 경우 잘못된 정보를 알려주기 때문에 매우 위험한 테스트라고 할 수 있습니다. 그래서 이런 경우를 원천적으로 막기 위해 저는 저는 두 번째 방식을 선호합니다!!
[2. H2 환경]
그렇지는 않습니다! 정확히는 @SpringBootTest
가 독립된 환경을 만들어주지 않고, 현재 되어 있는 H2
의 기본 설정 자체가 스프링이 시작할 때 완전히 새로운 H2
(메모리 DB) 를 만들도록 되어 있어 가능한 것입니다!
만약 테스트를 시작할 때 (그래서는 안되겠지만..) 개발환경의 MySQL을 쓰거나 운영환경의 MySQL을 쓰도록 하면 진짜 해당 DB의 데이터를 가져와 테스트가 이루어지게 됩니다.
혹시나 또 궁금한 점 있으시면 편하게 질문 주세요~
감사합니다! 🙇
ㅎㅎㅎ 맞습니다! 그래서 혹시나 개발환경 혹은 운영환경 profile 설정을 하고 테스트를 돌리면 끔찍한 일이 벌어지죠... 이런일을 아예 막기 위해 IP차단(ex. RDS security group) 등을 하게 되고요!
감사합니다!! 🙏
아하 친절하고 빠른 답변 감사드립니다!
2번 질문에서 ddl 설정이 create로 되어 있어서 그런거였군요
환경을 mysql로 바꾼 뒤 ddl-auto를 validate로 하니까 테스트의 결과가 실제 DB에 반영이 되는군요.(실제론 그래서는 안되겠지만..)
감사합니다.