Test

Testcontainers?

자바생 2022. 7. 30. 00:48
728x90

발단

인메모리 DB인 H2를 사용하여 로컬에서 통합 테스트를 구성했습니다. 하지만 해당 프로젝트의 서버 DB는 mysql이기 때문에 호환성 여부를 확인했습니다. H2에서는 Compatibility mode 를 지원하여 다른 DB 쿼리와 호환성을 제공하지만 100% 보장이 되지 않기 때문에 MySQL에서만 사용하는 특정 쿼리에 에러가 발생합니다. 그래서 로컬에서 서버 DB와 똑같은 MySQL를 통한 통합 테스트를 구성하면 괜찮을 것이라 생각했습니다. 하지만 해당 방법은 환경 세팅이 되어있지 않는 동료가 접하기에는 환경 세팅이 헤비할 수 있습니다. 독립적인 테스트 환경, 즉, 멱등성을 보장하기 위해 JUnit 테스트를 지원하는 Java 라이브러리인 Test Container를 알게 됐습니다.

 

Test Container?

Test containers는 Docker 컨테이너를 이용하여 JUnit 테스트를 지원하는 Java 라이브러리입니다.

사용하면서 정말 편리한 점은 Docker만 설치되어있다면 사용할 수 있는 점이었습니다. Dockerfile, Docker-compose로 Container를 시작할 수 있지만, Java로도 Container 를 동작시킬 수 있습니다.(설정 부분에서 얘기합니다)

또한, Container의 Life Cycle도 Java로 관리할 수 있습니다

 

DB를 이용한 테스트

 

Local에서의 테스트

  • 로컬에 설치해서 환경 구축 후 테스트에 사용
  • 동료들이 테스트를 구동하기 위해 환경 세팅을 해야하는 번거로움

 

In-Memory를 이용한 테스트

  • 인 메모리 DB(ex h2)를 이용하여 테스트 구동 시 사용
  • 호환성 문제(compatibilty mode가 있지만 100% 호환 X)로 인해 데이터가 깨질 수 있음

 

Test Container Life Cycle

containers는 두 가지 방법으로 custom하게 life cycle을 관리할 수 있습니다. 모든 테스트 메서드마다 start, stop 메서드를 사용하여 restart 하는 방법,모든 테스트 메서드에서 shared한 container를 만들 수 있습니다

 

 

restarted(stop - start)

  • 테스트 메서드가 수행될 때마다 container가 새로 시작
  • 메서드마다 container가 새로 시작하기 때문에 멱등성을 보장함
  • 하지만 메서드마다 새로 시작하기 때문에 테스트에 오랜 시간이 걸림

 

shared

  • 명시한 container의 class가 시작될 때 한 번 container가 시작하고, 모든 메서드에서 container를 공유
  • 위와 다르게 테스트 시간을 줄일 수 있으나 멱등성을 보장할 수 있지 않기 때문에 데이터 관리가 필요

 

REFERENCES

Testcontainers 공식문서

h2의 compatibility mode는 MySQL를 100% compatible하는가?

 
728x90