현재 Couchbase를 사용한 테스트 상태에서는 다음과 같은 것을 사용해야 합니다. 카우치베이스 모의를 사용하거나 직접 API를 모의 실행하거나 카우치베이스 서버 인스턴스를 실행하기 전에 시작해야 합니다. 모킹은 작동하지만 실제로 Couchbase를 테스트하는 것은 아닙니다. 단위 테스트에는 괜찮을 수 있지만 다음과 같은 경우에는 제외됩니다. 통합 테스트. Couchbase 인스턴스를 시작하는 것이 더 좋습니다. 이 방법은 효과가 있지만 쉽게 산업화할 수 있는 솔루션은 아닙니다. 아무 컴퓨터에서나 빌드를 실행하고 작동을 기대할 수는 없습니다. 모든 사람이 Couchbase Server를 설치하고 항상 온라인 상태로 유지해야 합니다. 그렇게 되면 매우 행복하겠지만 그럴 가능성은 거의 없습니다.
따라서 또 다른 접근 방식은 테스트가 데이터베이스 시작을 담당하도록 하는 것입니다. 빌드 스크립트에 이를 포함할 수도 있습니다. Maven, Gradle 등은 빌드 수명 주기에 대한 후크를 제공할 수 있습니다. 이렇게 하면 통합 테스트를 실행하기 전에 DB를 시작하고 중지할 수 있습니다. 하지만 사용 중인 빌드 도구에 약간의 종속성이 추가됩니다. 빌드 도구에 독립적이 되려면 코드에서 DB를 시작하고 중지해야 합니다.
이를 설정하는 동안 직면하게 될 또 다른 문제는 다른 OS를 지원해야 한다는 것입니다. Linux, Windows 또는 OSX를 실행하는 경우 DB를 시작하고 중지하는 방법이 달라집니다. 그리고 이것은 DB가 이미 머신에 설치되어 있다는 가정 하에 설명한 것입니다. 이러한 문제를 방지하려면 이러한 모든 플랫폼에 공통된 런타임이 필요합니다. 그리고 이것은 Docker 가 제공할 수 있습니다.
Docker는 원하는 모든 DB의 이미지를 다운로드할 수 있는 분산 바이너리 저장소 역할을 합니다. 그리고 Docker 컨테이너를 관리하는 방식은 플랫폼에 관계없이 동일합니다. 가상 머신에 대한 초경량 대안을 제공하며, 다음과 같은 문제점이 있을 수 있습니다. 프로덕션의 일부 특정 사례이 사용 사례에 완벽합니다.
위대한 사람들의 행동 테스트 컨테이너 는 이를 이해하고 위의 모든 문제에 대한 통합 솔루션을 제안하고 있습니다.
TestContainers는 JUnit 테스트를 지원하는 Java 라이브러리로, 일반적인 데이터베이스, Selenium 웹 브라우저 또는 Docker 컨테이너에서 실행할 수 있는 모든 것의 경량의 일회용 인스턴스를 제공합니다.
TestContainers는 현재 Java만 지원하지만 이 개념은 Docker 클라이언트가 있는 모든 언어에 적용할 수 있습니다. 간단한 Java 프로젝트에서 어떻게 작동하는지 살펴보겠습니다.
맥주 샘플 테스트 방법
저는 프로젝트 사용해야 하는 모든 것을 보여줍니다. 테스트 컨테이너 및 Couchbase. 이 프로젝트가 작동하려면 테스트를 실행하는 컴퓨터에서 Docker를 실행해야 합니다. 작동하는지 확인하려면 터미널을 열고 다음을 입력합니다. 도커 정보
. 이렇게 하면 다음과 같은 대답이 나옵니다:
이제 테스트를 작성해 보겠습니다. 먼저 제네릭 컨테이너 인스턴스를 사용할 수 있습니다. 이는 테스트를 실행하기 전에 컨테이너가 설정되고 테스트가 끝난 후에 컨테이너가 해체된다는 의미입니다. 실행 중인 클래스의 각 테스트에 대해 이 작업을 수행하려면 @Rule을 사용할 수 있습니다. 이 GenericContainer에는 이름이 필요합니다. 이것은 사용하려는 Docker 이미지의 전체 식별자, 이름 및 태그입니다. 여기서는 맥주 샘플이 미리 로드된 상태에서 Couchbase Server를 시작하는 사용자 정의 이미지를 사용하고 있습니다. 다음과 같이 입력하여 해당 이미지를 빌드할 수 있습니다. 도커 빌드 -t mycouchbase .
를 프로젝트의 루트에 추가합니다.
다음으로 노출할 포트 목록과 대기 전략을 설정할 수 있습니다. 이 대기 전략 부분은 매우 중요하므로 나중에 다시 설명하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public 클래스 예제 테스트 { @ClassRule public 정적 제네릭 컨테이너 카우치베이스 = new 제네릭 컨테이너("mycouchbase:최신") .노출된 포트(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093) .기다리는(new 카우치베이스 대기 전략()); @테스트 public void 맥주버킷테스트() 던지기 중단된 예외 { 카우치베이스 환경 환경 = 기본 카우치 기반 환경.빌더() .부트스트랩 캐리어 다이렉트 포트(카우치베이스.getMappedPort(11210)) .부트스트랩캐리어Ssl포트(카우치베이스.getMappedPort(11207)) .부트스트랩HttpDirectPort(카우치베이스.getMappedPort(8091)) .부트스트랩HttpSslPort(카우치베이스.getMappedPort(18091)) .쿼리포트(카우치베이스.getMappedPort(8093)) .빌드(); 카우치베이스클러스터 cc = 카우치베이스클러스터.create(환경); ClusterManager cm = cc.클러스터 관리자("관리자", "비밀번호"); assertTrue(cm.hasBucket("맥주 샘플")); 버킷 버킷 = cc.오픈버킷("맥주 샘플"); assertTrue(버킷.존재("21st_개정안_브루어리_카페")); 버킷.닫기(); } |
그런 다음 테스트 방법이 있습니다. 먼저 새로운 카우치베이스 환경. 노출된 모든 포트가 다른 포트에 매핑되었으므로 이를 지정해야 합니다. GenericContainer에서 getMappedPort(yourPort)를 호출하면 매핑된 포트를 가져올 수 있습니다. 그런 다음 CouchbaseCluster를 생성하고 테스트를 계속 진행합니다.
이것은 사용자 지정 대기 전략을 추가했기 때문에 작동합니다. waitingFor(new CouchbaseWaitStrategy())
. 기본적으로 TestContainer를 사용하면 포트에 액세스할 수 있거나 URL 호출이 특정 상태 코드를 반환할 때까지 기다릴 수 있습니다. 안타깝게도 Couchbase에서는 이것만으로는 충분하지 않습니다. Couchbase 서버를 시작할 때 클러스터의 노드에 대한 워밍업 단계가 있습니다. GET on http://couchabseserver:8091/ui/index.html
가 200 상태 코드를 반환하거나 포트 8091이 응답하는 경우 노드가 아직 워밍업 단계에 있으므로 SDK에서 액세스할 수 없습니다.
즉, 노드의 상태가 정상인지 알기 위해서는 구체적인 대기 전략이 필요합니다. 노드가 정상인지 확인하려면 다음 URL을 얻으면 됩니다. http://couchabseserver:8091/pools/default/
. 이 함수는 클러스터의 노드에 대한 정보가 포함된 JSON을 반환합니다. 즉, 해당 JSON을 가져와 노드의 상태가 '정상'인지 테스트하는 대기 전략이 필요합니다. 일반 HTTPWaitStrategy 몇 가지 추가 동작이 있습니다.
안타깝게도 이 클래스는 대부분 비공개 및 보호 필드로 구성되어 있어 프로젝트에서 확장하기가 어려웠습니다. 안타깝게도 이 클래스를 복제하고 저만의 로직을 추가해야 했습니다. 대기 전략의 전체 코드는 다음에서 확인할 수 있습니다. Github. 이것이 제가 추가한 부분입니다.
1 2 3 4 5 6 7 8 |
// 노드가 온라인 상태이고 정상인지 확인하기 위한 특정 카우치베이스 대기 전략 JsonNode 노드 = om.readTree(연결.getInputStream()); JsonNode 상태 노드 = 노드.에서("/nodes/0/status"); 문자열 상태 = 상태 노드.asText(); 만약 (!"건강한".같음(상태)){ throw new 런타임 예외(문자열.형식("카우치베이스 노드 상태: %s", 상태)); } |
결론
이 코드는 여전히 매우 구체적이며 이미 설치되어 있고 데이터가 포함된 자체 Couchbase 이미지를 구축해야 합니다. 통합 테스트를 위해 데이터가 준비된 미리 만들어진 이미지를 사용하면 특히 통합 테스트에 매우 유용할 수 있습니다. 하지만 단위 테스트에는 더 가벼운 접근 방식을 원할 수도 있습니다. 테스트 컨테이너에는 이미 특정 DB에 특화된 여러 모듈이 있습니다. 특정 이미지가 필요하지 않고 테스트에 원하는 방식으로 기본 이미지를 설정할 수 있는 Couchbase용 모듈을 만들어 보겠습니다.
이러한 기능을 원하시면 알려주세요!