어제 저는 카우치베이스와 테스트 컨테이너로 단위 및 통합 테스트를 수행하는 방법. 이러한 테스트의 전제 조건 중 하나는 이미 구축된 이미지가 있어야 한다는 것이었습니다. 하지만 그런 이미지가 없는 것으로 밝혀졌습니다. 테스트를 실행하기 직전에 TestContainer를 사용하여 자신만의 사용자 지정 이미지를 빌드할 수 있으며 매우 쉽습니다. 덕분에 세르게이 이고로프 길을 알려주셔서 감사합니다!
즉석에서 이미지 만들기
이전 예제에서는 다음 코드를 사용하여 이미지를 인스턴스화했습니다:
1 2 3 4 5 6 |
@ClassRule public 정적 제네릭 컨테이너 카우치베이스 = new 제네릭 컨테이너("mycouchbase:최신") .노출된 포트(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093) .기다리는(new 카우치베이스 대기 전략()); |
GenericContainer 생성자는 문자열을 매개변수로 받습니다. 이 문자열은 테스트하려는 컨테이너의 이름입니다. 하지만 GenericContainer 생성자는 Future도 받습니다. ImageFromDockerfile 클래스가 바로 그것입니다. 이 클래스의 Docker 이미지가 사용자가 지정한 매개변수와 비동기적으로 생성됩니다.
여기서는 필요한 모든 것을 프로젝트의 리소스 폴더에 복사하여 클래스 경로에서 모두 액세스할 수 있도록 했습니다. 그래서 저는 위드파일로부터 클래스 경로
메서드를 사용합니다. 문자열, 절대 경로 또는 파일에서 파일을 가져올 수도 있습니다. 이에 대한 자세한 내용은 다음에서 확인할 수 있습니다. TestContainers 문서.
1 2 3 4 5 6 7 8 9 10 11 |
@ClassRule public 정적 제네릭 컨테이너 카우치베이스 = new 제네릭 컨테이너( new 이미지에서 도커파일().위드파일로부터 클래스 경로("도커파일", "도커파일") .위드파일로부터 클래스 경로("스크립트/더미.sh","스크립트/더미.sh") .위드파일로부터 클래스 경로("스크립트/엔트리포인트.sh","스크립트/엔트리포인트.sh") .위드파일로부터 클래스 경로("스크립트/실행","스크립트/실행") ) .노출된 포트(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093) .기다리는(new 카우치베이스 대기 전략()); |
그러면 테스트를 실행하기 전에 Docker 이미지가 자동으로 빌드됩니다. 기본적으로 이미지는 종료 시 삭제되지만 플래그를 전달하여 이미지를 유지하여 항상 다시 빌드하지 않도록 할 수 있습니다. 이는 테스트 전략에 따라 달라집니다.
문제 해결
이 글을 작성하는 동안 사소한 문제가 발생했습니다. 이미지 생성에 사용되었던 모든 리소스의 권한이 손실되어서 RUN chmod +x
를 복사하는 모든 리소스에 대해. 이 문제는 이제 알려진 문제이며 TestContainer의 친절하고 반응이 빠른 사람들이 이 문제를 해결하기 위해 노력하고 있습니다. 다음에서 그들과 대화를 나눌 수 있습니다. 슬랙 채널에서 카우치베이스 직원과 채팅을 할 수 있는 것과 마찬가지로 커뮤니티 채널.