살면서 처음으로 단위테스트를 할 수 있는 코드를 짜라는 가르침을 받았고 이젠 "어떻게"에 대해서 고민을 하게 되었다.
데이터에 접근하는 클래스를 테스트하고 싶은건데 어떻게 하면 데이터베이스를 깔끔하게 Mocking 할 수 있을까?
원하는 데이터들을 집어넣는것은 둘째치고 내 테스트 코드를 실행하는 사람들에게 데이터베이스 인스턴스를 준비시킬 수 있을까에 대한 고민이 생겼다.
H2 디비를 어플리케이션에 embedding 하는 방법을 찾았다.
H2 디비는 embedded mode를 사용할 수있는데 사용하려면
위의 방법대로 했을때 내가 원하는 행동을 할 수 있을까. 저렇게 한다면 단순히 유닛 테스트를 하기 위한 디비가 계속 생길 수 있다. 아마 같은 유닛테스트에 대해서 두번 진행하려고 한다면 문제가 생길 수 있다. 이미 동일한 이름의 디비가 생성되어 있으니.. 디비를 지워놓고 Test를 다시 Run하는 행동을 반복해야할 것이다.. 유닛테스트를 위해..
나는 같이 협업하는 사람들이 내가짠 유닛테스트 코드를 언제든지 Run만 누르면 할 수 있게끔 하고싶다. 그래서 Embedded Mode에 있는 것이 In-memory이다.
in-memory mode?를 사용하면 실행했을 때 Database가 메모리에만 올라가 있기 때문에 마지막 Connection이 끝났을 때 데이터가 모두 날라가게 된다. 유닛테스트와 같은 상황에서는 테스트가 끝나면 데이터가 유지되어야 할 이유가 없기 때문에 아주 적합한 모드라고 볼 수 있다.
JDBC URL은 jdbc:h2:mem:test 이런식으로 하고 Connection을 열어준다면 메모리상에 이름이 test인 DB가 생기는 것이다.
그리고 Connection이 끝나도 프로세스가 끝나기 전까지 데이터를 살려놓고 싶다면 DB_CLOSE_DELAY=-1을 URL뒤에 적어주면 된다.
프로젝트의 Pom.xml파일에 H2 Database의 디펜던시를 추가해준다. Gradle로 빌드한 프로젝트이면 build.gradle 파일에 그 문법에 맞게 추가해주면 되고 그런것도 아니면 그냥 CLASSPATH에 추가해준다.
내가 Test할 클래스에 Connection을 주는 함수에 위에서 말한대로 url과 username, password 그리고 db driver설정을 해주면 이 함수가 호출될 때 메모리 상에 DB가 생성될 것이다.
Test 코드를 보면 테스트를 시작하면서 getConnection() 메소드를 호출한 순간 메모리상에는 test database가 만들어진 것이다. 그리고 그 커넥션을 가지고 테스트를 위한 데이터들을 준비해놓는 다던지의 행동을 할 수 있는 것이다.
이렇게 되면 그 누가 나의 테스트를 돌려도 간편하게 돌려볼 수 있게 된다.
다음에는 어떻게 데이터를 준비해놓는것이 좋을지에 대해서도 포스팅을 해야겠다. 그전에 데이터베이스를 mocking하는 방법중에서도 더 좋은 방법이 있나에 대해서도 알아봐야겠고...
출처
https://www.h2database.com/html/features.html#in_memory_databases
TDD란?) 클린 코드(로버트 C. 마틴) 9장 단위테스트 (0) | 2022.07.16 |
---|
댓글 영역