2010-01-06 4 views
39

embedded h2 datasource 및 선택적으로 JUnit을 사용하여 통합 테스트를위한 Spring 구성은 어떻게됩니까?테스트 용 임베디드 H2 데이터베이스 용 스프링 구성

기본적으로 SingleConnectionDataSource으로 처음 시도하지만 동시에 여러 연결이 필요하거나 트랜잭션이 일시 중단 된 더 복잡한 테스트에서는 실패했습니다. 나는 h2가 tcp based server mode에서 잘 작동한다고 생각하지만 이것은 아마도 메모리에 임시로 내장 된 데이터베이스에 대한 가장 빠른 통신 모드가 아닙니다.

가능성과 장단점은 무엇입니까? 또한 어떻게 테이블을 생성하고 데이터베이스를 채우는가?


업데이트 : 이러한 테스트에서 중요한 몇 가지 구체적인 요구 사항을 지정합시다.

  • 데이터베이스는 일시적이어야하며, 메모리에
  • 연결은 아마 속도 요구 사항, TCP를 사용하지 말아야
  • 나는 동안 데이터베이스의 내용을 검사하기 위해 데이터베이스 도구를 사용할 수 있다면 좋을 텐데 디버깅
  • 우리는 우리가 단위 애플리케이션 서버 데이터 소스를 사용할 수 없기 때문에 데이터 소스를 정의 할 필요가

답변

45

데이터베이스를 검사 할 수있는 도구가 있는지 모르겠으므로 간단한 해결책은 HSQL, H2 및 Derby를 지원하는 스프링 내장 데이터베이스 (3.1.x docs, current docs)를 사용하는 것입니다. . 당신이 자바 기반 구성을 선호하는 경우

<jdbc:embedded-database id="dataSource" type="H2"> 
    <jdbc:script location="classpath:db-schema.sql"/> 
    <jdbc:script location="classpath:db-test-data.sql"/> 
</jdbc:embedded-database> 

, 당신은 (EmbeddedDataBaseDataSource를 확장주의)이 같은 DataSource를 인스턴스화 할 수 있습니다 :

@Bean(destroyMethod = "shutdown") 
public EmbeddedDatabase dataSource() { 
    return new EmbeddedDatabaseBuilder(). 
      setType(EmbeddedDatabaseType.H2). 
      addScript("db-schema.sql"). 
      addScript("db-test-data.sql"). 
      build(); 
} 
H2를 사용

, XML 설정은 다음과 같을 것이다

데이터베이스 테이블은 db-schema.sql 스크립트에 의해 생성되며 db-test의 테스트 데이터로 채워집니다 -data.sql 스크립트.

클래스 경로에 H2 데이터베이스 드라이버를 추가하는 것을 잊지 마십시오.

+0

최대 절전 모드 (hbm2ddl)의 모델에서 자동 DDL 생성을 위해 구성된 데이터베이스가 최대 절전 모드를 통해 데이터 구조 생성 전에 실행되면 내 단위 테스트가 DB에서 CLOCKED_DELAY까지 mem DB에서 실패했습니다. hbm2ddl 이후에 이러한 스크립트를 실행할 수있는 솔루션이 있습니까? –

0

내가 그것을 프로덕션 데이터 소스 구현을 사용하는 것이 가장 좋습니다 생각 테스트 (단, 위스콘신 th 다른 connection-string)을 테스트합니다.

어쨌든 "더 복잡한 테스트를 통과하지 못했습니다"는 자세한 답변을 얻는 데 필요한 정보가 충분하지 않습니다.

(셀프 광고 : check this)

+5

단위 테스트 용 프로덕션 데이터베이스는 무엇입니까? 예를 들어 실제로 사용하는 경우 예를 들어 자동화 된 테스트를위한 오라클 데이터베이스. Maven 빌드는 쉽게 문제를 일으킬 수 있습니다. 그것은 매우 느리고, 거기에있는 데이터에 의존하고 다른 누구도 동시에 빌드를 수행해야하지 않습니다. 8-) 오라클 모드에서 h2를 선호합니다. BTW :이 질문은 사용 가능한 가능성에 대해 다소 일반적인 것이지만 내 구체적인 문제에 대해서는 적습니다. –

+0

아니요, 프로덕션 데이터 소스 구현입니다. 차이는 단지 연결 문자열 – Bozho

+0

아, 그래,하지만 그건 응용 프로그램 서버의 데이터 소스가 될거야. 그래서 이것은 불가능합니다. –

18

내가 현재 데이터 소스로 테스트 전용 springconfig 파일에 포함 :

<bean id="database.dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy"> 
    <constructor-arg> 
     <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
      <property name="driverClass" value="org.h2.Driver" /> 
      <property name="url" 
       value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2" /> 
     </bean> 
    </constructor-arg> 
</bean> 

<!-- provides a H2 console to look into the db if necessary --> 
<bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" 
    factory-method="createWebServer" depends-on="database.dataSource" 
    init-method="start" lazy-init="false"> 
    <constructor-arg value="-web,-webPort,11111" /> 
</bean> 
오버라이드 (override) 할 때

만들기/테이블은 executeSqlScript를 사용하여 수행 할 수 있습니다 떨어지고 AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction 또는 적절한 장소에 SimpleJdbcTestUtils.executeSqlScript으로 입력하십시오.

도 비교 this posting.

+0

"JUnit4 테스트로 executeSqlScript를 대체하지 못했습니다."org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests를 확장 해보십시오. –

+0

고맙습니다. –

8

H2는 기본 제공 연결 풀 구현과 번들로 제공됩니다. 데이터베이스가 Spring 애플리케이션 컨텍스트가 종료 될 때 Dispose 메서드를 호출하여 종료됩니다

<bean id="dataSource" class="org.h2.jdbcx.JdbcConnectionPool" destroy-method="dispose"> 
    <constructor-arg> 
     <bean class="org.h2.jdbcx.JdbcDataSource"> 
      <property name="URL" value="jdbc:h2:dbname"/> 
      <property name="user" value="user"/> 
      <property name="password" value="password"/> 
     </bean> 
    </constructor-arg> 
</bean> 

다음 XML은 DBCP 또는 C3P0에 추가 종속성을 도입 할 필요없이 데이터 소스 콩으로 사용의 예를 제공합니다.

관련 문제