2012-01-03 3 views
2

제목에서 알 수 있듯이 데이터베이스를 "알려진 상태"로 설정하여 단위 테스트를 적용하려고합니다. 나는 단위 테스트를 실행하기 전에 매번 데이터베이스를 삭제할 수 있지만 더 좋은 방법이 있습니까?스프링 웹 유닛 테스트 - 데이터베이스를 알려진 상태로 만드는 방법은 무엇입니까?

내 웹 응용 프로그램은 현재 Spring 컨텍스트 & Hibernate와 함께 작동합니다.

답변

3

정확하게 원하는 것을 수행하도록 설계된 DBUnit이라는 도구를 사용하는 것이 좋습니다. Hibernate Spring &과 함께 웹을 사용하는 많은 예제가있다.

데이터를로드하려면 :

@Before 
public void onSetUpInTransaction() throws Exception { 
    Connection conn = dataSource.getConnection(); 
    try { 
     IDatabaseConnection connection = new DatabaseConnection(conn); 
     DatabaseConfig config = connection.getConfig(); 
     config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, 
       new HsqldbDataTypeFactory()); 
        DataFileLoader loader = new FlatXmlDataFileLoader(); 
      IDataSet ds = loader.load(TEST_DATA_FILE_CLUB); 
        DatabaseOperation.CLEAN_INSERT.execute(connection,ds); 
      } finally { 
     DataSourceUtils.releaseConnection(conn, dataSource); 
    } 
} 

이것은 TEST_DATA_FILE_CLUB 문자열에서 참조하는 XML 파일을 데이터베이스의 깨끗한 메모리 복사에로드됩니다.

정리하려면 @After로 주석을 달고 다른 방법을 사용하고 대신 DELETE_ALL 데이터베이스 작업을 사용하십시오.

JUnit을 사용 중이라고 가정하고 테스트 클래스 또는 테스트 클래스가 확장 할 수있는 수퍼 클래스에 이러한 메소드를 배치하면 각 개별 테스트에 대해 원하는대로 정확하게 데이터베이스를 설정할 수 있습니다. 로드

XML 파일은 간단합니다 : 지정된

<?xml version="1.0" encoding="UTF-8"?> 
<dataset> 
    <competition competitionId="1" competitionName="Competition 1" 
     senior="1" junior="0"/> 
</dataset> 

열 값으로, 경쟁 테이블에 대한 행을로드합니다. 수석 & 하위 열은 부울입니다.

+0

내가 전에 DBUnit에 대해 알고 있었다. 그러나 완전히 새로운 프레임 워크를 배울 가치가 있는지 모르겠다. DBUnit은 나에게 너무 큰 것 같습니다. –

+0

정말 어렵지 않습니다. 테스트 용 메모리 데이터베이스를 사용하므로 속도가 빠르며 각 테스트마다 d/b를 깨끗한 상태로 다시로드합니다. 내 대답에 위의 코드를 추가하겠습니다. – TrueDub

+0

감사합니다. 메모리 내 데이터베이스를 성공적으로 설정했지만 DBUnit을 설정하는 방법이 약간 불투명합니다. 나에게 자원을 가르쳐 주겠니? –

1

통합 테스트를 수행하는 경우 다른 테스트가 실패하더라도 각각의 테스트가 작동하도록 테스트를 수행하십시오.

그런 다음 한 번만 (첫 번째 테스트 전)

Btw는 설정에 데이터베이스를 필요 : 난 강력하게 (개발 한) 다른 데이터베이스를 사용하는 것이 좋습니다 만 시험에 사용 하나.

더 기술적 인 세부 사항 : 당신은 당신이 진짜 (큰) 통합 테스트를 위해 스프링 JDBC 지원

<jdbc:embedded-database id="dataSource" type="H2" > 
    <jdbc:script location="classpath:init.sql" />  
</jdbc:embedded-database> 
  • 을 사용할 수 있습니다 중소 시험에 대한 inmemmory의 DB를 사용하는 경우 *, 당신은 받는다는 사용할 수 sql-maven-plugin
+0

이것이 덤프 질문이지만 데이터베이스간에 쉽게 전환하는 방법은 아 닙니다.현재 환경에 따라 변경할 JVM 설정 변수를 구성하지만 테스트를 실행할 때마다 다시 설정해야합니다. –

+0

이것은 설정에 따라 크게 달라질 수 있습니다. 나는 개인적으로 JNDI를 사용한다. 여기에 JNDI 소스는 하나의 DB를 가리키며, 다른 하나는 통합 테스트를 일식 (테스트 개발을 위해)에서 직접 실행하기 위해 개발 서버 (내 eclise의 바람둥이)를 가지고 있습니다. 그런 다음 JNDI 소스가 3. DB를 가리키는 maven을 통해 구성된 tomcat이 있습니다. - 그래서 서로 다른 Tomcat 인스턴스를 가지며, 각각은 DB 연결에 대해 동일한 JNDI 이름을 사용하지만, 다른 DB에 대한 연결을 가리키고 있습니다. – Ralph

+0

복잡한 것처럼 들립니다. 내 개발 서버로 Eclipse와 통합 된 Tomcat이 하나뿐입니다. 그런 환경을 설정하는 방법에 관한 문서를 알고 있습니까? –

관련 문제