에서 이전 시리즈 블로그 게시물 수 Java Junit 테스트에 TestContainer를 사용하는 방법을 설명했습니다. 다루지 않은 몇 가지 문제는 N1QL 테스트, 자체 버킷 생성, 인덱스 생성 등에 관한 것이었는데요... 이 게시물은 Spring 데이터 카우치베이스 테스트 사례와 우리가 생략한 질문들을 다루고 있습니다.
구성할 수 없는 포트 하드와이어
현재 Couchbase Server의 제한 사항 중 하나는 기본 포트 중 일부를 변경할 수 없다는 것입니다. 이는 포트 변경 시 별도의 알림 없이 포트만 변경하는 Docker의 문제입니다. 이는 동일한 컴퓨터에서 여러 개의 Couchbase 인스턴스를 실행할 수 있다는 의미이므로 유용할 수 있습니다. 하지만 안타깝게도 작동하지 않으므로 일부 포트를 수정해야 합니다. 이는 addFixedExposedPort 메서드를 사용하여 TestContainers에서 매우 쉽게 선언할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 |
@오버라이드 보호됨 void 구성() { 추가 노출된 포트(8091, 11207, 11210, 11211, 18091, 18092, 18093); 추가 고정 노출 포트(8092, 8092); 추가 고정 노출 포트(8093, 8093); 추가 고정 노출 포트(8094, 8094); 추가 고정 노출 포트(8095, 8095); 설정 대기 전략(new HttpWaitStrategy().forPath("/ui/index.html#/")); } |
이 문제를 해결하면 Java SDK가 N1QL에 연결할 수 있게 됩니다.
추상 Spring 데이터 카우치베이스 도커 테스트 사례
여기서 목표는 Couchbase 인스턴스와 Spring 데이터 Couchbase를 구성해야 하는 모든 클래스에서 사용할 추상 테스트 케이스를 만드는 것입니다. 이전 게시물에서와 마찬가지로 CouchbaseContainer 필드를 인스턴스화하여 시작합니다. Spring 데이터를 테스트하고 있으므로 인덱스, 쿼리에 대한 지원을 구성하고 나중에 FTS를 추가해 보겠습니다.
이 클래스가 애플리케이션에 대한 테스트를 실행하도록 하려면, 이 클래스에 @RunWith(SpringRunner.class)
어노테이션을 추가하세요. 또한 애플리케이션 구성이 사용자 지정 구성뿐만 아니라 테스트되었는지 확인하려면 스프링 부트 테스트(클래스 = {GittalentBackendApplication.class, AbstractSPDataTestConfig.CouchbaseTestConfig.class})
.
이제 사용자 지정 구성에 대해 이야기하자면 무엇이 필요할까요? 앱의 기본 Couchbase 구성을 재정의하고 싶습니다. 그러기 위해서는 CouchbaseConfigurer를 구현해야 합니다. 이 인터페이스는 스프링 데이터 카우치베이스가 제대로 작동하는 데 필요한 모든 빈을 정의합니다. 이 인터페이스는 CouchbaseEnvironment, ClusterInfo, Cluster 및 Bucket에 대한 인스턴스를 제공합니다.
테스트를 실행하기 전에 모두 CouchbaseContainer 설정에서 가져옵니다. 따라서 모든 빈을 초기화하기 전에 컨테이너가 실행 중이고 준비되었는지 확인해야 합니다. 이는 @PostConstruct로 어노테이션된 init() 메서드를 추가하여 수행할 수 있습니다. 이렇게 하면 먼저 컨테이너가 실행 중인지 확인한 다음 추가 사항을 설정할 수 있습니다. 다음 예제에서는 default라는 버킷을 설정하고 인덱스 유형을 MOI로 설정합니다.
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
@RunWith(SpringRunner.클래스) @스프링 부팅 테스트(클래스 = {기탤런트백엔드애플리케이션.클래스, AbstractSPDataTestConfig.CouchbaseTestConfig.클래스}) public 초록 클래스 AbstractSPDataTestConfig { public 정적 final 문자열 클러스터 사용자 = "관리자"; public 정적 final 문자열 클러스터 비밀번호 = "비밀번호"; @ClassRule public 정적 카우치베이스 컨테이너 카우치베이스 컨테이너 = new 카우치베이스 컨테이너() .withFTS(true) .withIndex(true) .withQuery(true) .withClusterUsername(클러스터 사용자) .위드클러스터패스워드(클러스터 비밀번호); @구성 정적 클래스 CouchbaseTestConfig 구현 카우치베이스 컨피규레이터 { 비공개 카우치베이스 컨테이너 카우치베이스 컨테이너; @포스트 컨스트럭트 public void init() 던지기 예외 { 카우치베이스 컨테이너 = AbstractSPDataTestConfig.카우치베이스 컨테이너; 버킷 설정 설정 = 기본 버킷 설정.빌더() .활성화Flush(true).이름("default").할당량(100).복제본(0).유형(버킷 유형.터치베이스).빌드(); 설정 = 카우치베이스클러스터().클러스터 관리자(클러스터 사용자, 클러스터 비밀번호).삽입 버킷(설정); 카우치베이스 컨테이너.callCouchbaseRestAPI("/설정/인덱스", "indexerThreads=0&logLevel=info&최대 롤백 포인트=5&스토리지 모드=메모리_최적화", "관리자", "비밀번호"); waitForContainer(); } public void waitForContainer(){ 카우치베이스 대기 전략 s = new 카우치베이스 대기 전략(); s.withBasicCredentials(클러스터 사용자, 클러스터 비밀번호); s.waitUntilReady(카우치베이스 컨테이너); } @오버라이드 @Bean public 카우치베이스 환경 카우치베이스환경() { 반환 카우치베이스 컨테이너.getCouchbaseEnvironment(); } @오버라이드 @Bean public 클러스터 카우치베이스클러스터() 던지기 예외 { 반환 카우치베이스 컨테이너.geCouchbaseCluster(); } @오버라이드 @Bean public 클러스터 정보 카우치베이스클러스터정보() 던지기 예외 { 클러스터 cc = 카우치베이스클러스터(); ClusterManager 관리자 = cc.클러스터 관리자(클러스터 사용자, 클러스터 비밀번호); 반환 관리자.정보(); } @오버라이드 @Bean public 버킷 카우치베이스클라이언트() 던지기 예외 { 반환 카우치베이스 컨테이너.geCouchbaseCluster().오픈버킷("default"); } } } |
이 추상적인 테스트 케이스가 만들어지면, 다음으로 해야 할 일은 이를 확장하는 클래스를 만들고 테스트를 작성하는 것입니다! 여기에서는 애플리케이션의 서비스뿐만 아니라 하위 수준의 버킷도 삽입할 수 있습니다. 이 테스트에서 볼 수 있는 것은 먼저 문서를 생성하는 임포터 서비스에 대한 호출입니다. 그런 다음 기본 버킷에 인덱스를 생성하고 이에 대한 쿼리를 테스트합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public 클래스 GitTalentGHImportTests 확장 AbstractSPDataTestConfig { @자동 유선 비공개 GithubImportService githubImportService; @자동 유선 비공개 버킷 버킷; @테스트 public void 수입개발자팀(){ githubImportService.importOneDeveloper("ldoguin"); N1qlQueryResult 결과 = 버킷.쿼리(N1qlQuery.simple("기본값에 기본 인덱스 만들기")); N1qlQuery 쿼리 = N1qlQuery.simple("SELECT * FROM default WHERE developerInfo.username = 'ldoguin'"); 결과 = 버킷.쿼리(쿼리); N1qlQueryRow 행 = 결과.행().다음(); Assert.assertNotNull(행); } } |
추상 테스트 케이스가 생성되면 보시다시피 코드의 양이 매우 적고 테스트하려는 항목과 정확히 일치합니다.
[...] 카우치베이스 개발자 옹호자 로랑 도귄이 테스트 컨테이너와 스프링으로 스프링 데이터 카우치베이스 애플리케이션을 테스트하는 방법을 정리했습니다 [...]
안녕하세요,
Abstract 클래스를 확장하는 여러 파일을 만들 때 문제가 발생하고 있습니다.
옆에서 해보실 수 있나요? 내가 뭔가 잘못하고 있는 건 아닌지...
미리 감사드립니다,
감사합니다,