2013-01-14 3 views
26

PostgreSQL을 기반으로하는 응용 프로그램을 단위 테스트 할 수 있도록 임베디드 PostgreSql이 있습니까?PostgreSQL을 내장했습니다.

PostgreSql에는 몇 가지 언어가 있으므로 다른 내장 데이터베이스보다 내장 된 PostgreSql 자체를 사용하는 것이 좋습니다.

답변

29

아니요, 프로세스로드 가능한 데이터베이스 라이브러리라는 의미에서 PostgreSQL은 포함되어 있지 않습니다. PostgreSQL은 프로세스 지향적입니다. 각 백엔드에는 하나의 스레드가 있으며 작업을 수행하기 위해 여러 프로세스가 생성됩니다. 그것은 도서관으로서 이해가되지 않습니다.

The H2 databasea limited subset of the PostgreSQL SQL dialect을 지원하고 PgJDBC 드라이버를 사용합니다.

는, 다른 인스턴스와 충돌 테스트를 실행 한 다음 중지하고 마지막으로 임시 데이터베이스를 삭제 pg_ctl를 사용하지 않는 있도록 initdb a new temporary database이며, 무작위 포트에 pg_ctl로 시작 무엇을 할 수 있는지.

나는 강하게 그래서 당신이 테스트를 실행하는 시스템에 로컬로 설치된 PostgreSQL의 충돌 위험을 감수하지 않는 기본 포트가 아닌 포트에 임시 포스트 그레스에게 을 실행 추천 .

(ecpg의 의미, 프리 프로세서 기반의 C 언어 확장으로 C 소스 코드에 포함 기본적으로 PostgreSQL을 클라이언트 "내장의 PostgreSQL이 입니다. 아직 실행중인 서버가 필요하고 그것은에 약간 불쾌한입니다 . 사용 정말 권장되지는 대부분 쉽게 다양한 다른 데이터베이스에서 포팅하기 위해 존재)

+0

그게 내가하는 일이기도합니다. 설치 프로그램없이 Postgres를 설정하는 배치 파일/셸 스크립트는 약 5 줄의 코드입니다. 모든 유닛 테스트 실행에서 initdb를 수행하는 것은 아마도 너무 느릴 것입니다. –

+0

@a_horse_with_no_name 예, initdb 이전의 데이터베이스를 압축 해제하거나 빌드 프로세스 중에 initdb가없는 깨끗한 템플릿에서 복사 할 수 있습니다. Pg를 업그레이드 할 때 고통스러워. 개인적으로 initdb는 충분히 빠르지 만 회전 디스크는 더 이상 사용하지 않습니다. 배치 파일과 관련하여 주요 과제는 충돌하지 않는 포트를 사용하는 것입니다 (특히 동시 테스트를 실행하는 경우). 그리고 수행이 끝난 후 서버를 종료해야합니다. 특히 Windows에서 서버가 중지 될 때까지 datadir을 삭제할 수 없습니다. –

+4

당신은 "프로세스 지향적 인 부분을 라이브러리로 패키징하는 것은 의미가 없다"고 말합니다. 왜 안돼? 요즘 Java 라이브러리를 사용하여 IE를 자동화 할 수 있습니다. 물론 프로세스가 백그라운드에서 생성되지만 Java 라이브러리를 사용하여 편안하게 말할 수 있습니다. PostgreSQL에서도 마찬가지입니다. PostgreSQL 인스톨러를 임베딩함으로써 그 목표에 가까워 질 수 있지만, 그렇게 설정하는 데는 많은 상용구가 있습니다. –

35

(가) 자바에서 단위 테스트를 위해 설계되었습니다 "임베디드"포스트그레스 SQL 서버이다.

https://github.com/yandex-qatools/postgresql-embedded

임베디드 PostgreSQL은 단위 테스트에 포스트 그레스 바이너리를 실행하기위한 플랫폼 중립적 인 방법을 제공합니다. 코드의 대부분은 제쳐두고 같이 Flapdoodle OSS's embed process

에서 제작 된도 Mongo, Redis, Memcachednodejs 유사한 프로젝트가 존재한다.

+0

왜 이것이 정답으로 표시되지 않습니까? 이 라이브러리에 단점이 있습니까? 그것은 postgre의 모든 기능을 가지고 있습니까? 그것은 모듈 등으로 embelished 수 있습니까? –

+0

나는 그것이 잘 작동 함을 간증 할 수있다. 표준 포스트그레스. 사용 예 : https://github.com/icgc-dcc/dcc-submission/blob/develop/dcc-submission-loader/src/test/java/org/icgc/dcc/submission/loader/util/EmbeddedPostgres.java https : // github.com/icgc-dcc/dcc-submission/blob/c5f6e38783fe164b35a63ac15dfb22fe9559d5f5/dcc-submission-loader/src/test/java/org/icgc/dcc/submission/loader/util/AbstractPostgressTest.java – btiernay

+0

'포함 된' 불분명하지만 나에게 그것은 H2와 같이 기억에 남을 것입니다. yandex-qatools/postgresql-embedded는이 정의를 따르지 않습니다. 실제로 지정된 postgres 버전을 다운로드하고, 임시 디렉토리에 압축을 풀고 서버를 시작합니다.이 모든 것이 디스크 오버 헤드로 이어지고, 이는 비 엔터프라이즈 환경에서는 거의 받아 들일 수 없습니다. 나는이 샘플 프로젝트 (https://github.com/scottmf/postgresql-integration-test)를 심사 중이며, 여전히 좋은 예입니다. 내가 틀렸다면 나를 바로 잡으십시오. – Valya

2

통합 (또는 유사한) 테스트 스위트에서 포스트 프로세스 버전을 실행하려는 경우 postgresql-embedded이 정상적으로 작동합니다.

저는을 작성하여 forked 버전의 postgresql-embedded를 maven wrapper로 사용할 수 있습니다.

+0

다시 기본 설정을 벗어나면이 솔루션에 문제가 있음을 다시 한 번 경고하십시오 –

+0

충분합니다. 그러나 Maven 플러그인에서 바이너리의 다운로드 URL을 기본값이 아닌 다른 위치로 설정하는 구성 옵션을 추가했습니다. – aramcodez

+0

https://github.com/aramcodz/embedded-postgres-maven-plugin을 확인하고 "downloadUrl"플러그인 구성 매개 변수를 찾으십시오. – aramcodez

11

@btiernay (yandex-qatools)가 제안한 프로젝트를 시도했습니다. 나는 며칠을 좋은 시간을 보냈고, 공격을하지 않고도 공용 인터넷에 들어가기보다는 내부 리포지토리에서 바이너리를 다운로드하고 싶을 때 필자의 경우에는 작동하지 않는 설계된 솔루션을 사용했다. 이론적으로는 지원하지만 사실은 지원하지 않습니다.

나는 otj-pg-embedded을 사용하여 끝났으며 매력적으로 작동합니다. 코멘트에서 언급되었으므로 여기서도 언급 할 것입니다.

단위 테스트 및 로컬 개발 모두에 대해 규칙이 아닌 독립형 DB로 사용했습니다.

종속성 :

<dependency> 
    <groupId>com.opentable.components</groupId> 
    <artifactId>otj-pg-embedded</artifactId> 
    <version>0.7.1</version> 
</dependency> 

코드 :

@Bean 
public DataSource dataSource(PgBinaryResolver pgBinaryResolver) throws IOException { 
    EmbeddedPostgres pg = EmbeddedPostgres.builder() 
     .setPgBinaryResolver(pgBinaryResolver) 
     .start(); 


    // It doesn't not matter which databse it will be after all. We just use the default. 
    return pg.getPostgresDatabase(); 
} 

@Bean 
public PgBinaryResolver nexusPgBinaryResolver() { 
    return (system, machineHardware) -> { 
     String url = getArtifactUrl(postgrePackage, system + SEPARATOR + machineHardware); 
     log.info("Will download embedded Postgre package from: {}", url); 

     return new URL(url).openConnection().getInputStream(); 
    }; 
} 

private static String getArtifactUrl(PostgrePackage postgrePackage, String classifier) { 
    // Your internal repo URL logic 
} 
+0

'.tql-pg-embedded'에서'.sql' 파일로 스키마를 생성 할 수 있습니까? 나는 봄을 사용하지 않고있다. 나는 '규칙'이없는 어떤 예도 찾지 못했다. – tuk

2

당신은 PostgreSQL을의 container 인스턴스를 사용할 수 있습니다.

컨테이너를 회전시키는 데 몇 초가 걸리기 때문에 unittest에 충분해야합니다. 또한 데이터를 유지해야하는 경우 (예 : 조사를 위해 전체 컨테이너를 저장할 필요가 없으며 컨테이너 외부에 매핑 할 수있는 데이터 파일 만 저장할 수 있습니다.

이렇게하는 방법 중 하나는 here입니다.