최대 절전 모드 / 스프링 / 주니트로 복잡한 데이터베이스 상태의 설정 및 분해

StackOverflow https://stackoverflow.com/questions/822846

  •  03-07-2019
  •  | 
  •  

문제

개별 테스트 방법이 실행되기 전에 상당히 광범위한 데이터베이스 설정이 필요한 클래스 테스트가 있습니다. 이 설정은 오랜 시간이 걸립니다. 당면한 질문과 관련이없는 이유로 SQL 덤프에서 DB를 프로그래밍 방식으로 채워야합니다.

내가 가진 문제는 분해에 관한 것입니다. DB 설정 단계에서 모든 변경 사항을 쉽게 롤백하려면 어떻게해야합니까?

현재 개별 테스트 방법이 트랜잭션에 싸여 있도록 Hibernate + Spring Transactional Testing Support를 사용하고 있습니다.

한 가지 솔루션은 각 테스트 방법 내에서 DB 설정을 수행하여 DB 설정이 자동으로 롤백되도록하는 것입니다. 그러나 각 방법이 데이터베이스를 다시 준비해야하므로 테스트 방법은 영원히 실행됩니다.

다른 아이디어가 있습니까? 기본적으로 DB 설정을 실행하고 개별 테스트를 실행하는 방법을 찾고 있습니다 (각각 실행 후 롤백을받는 트랜잭션에 랩핑 한 다음 초기 DB 설정을 롤백합니다. 이것을 최대 절전 모드 / 스프링 / 주니트 방식으로 만드는 아이디어가 있습니까? 최대 절전 모드 "모든 테이블 드롭"등가 명령이 있습니까?

도움이 되었습니까?

해결책

특정 데이터베이스 공급 업체에 갇혀 있습니까? 그렇지 않다면, 당신은 HSQLDB. 테스트를 마치면 상태를 버립니다. 테스트 스위트가 시작될 때 테이블을 비울 수있는 경우에만 적절합니다 (프로그래밍 방식 설정 전).

여전히 테이블을 만들어야하지만 최대 절전 모드를 사용하여 모든 것이 깔끔하게 매핑되면 HBM2DDL을 사용하여 테이블을 생성 할 수 있습니다. 당신이해야 할 일은 다음을 당신의 테스트 세션 공장 정의 :

<session-factory>
    ...
    <property name="hibernate.hbm2ddl.auto">create</property>
    ...
</session-factory>

이 솔루션이 적용 가능한 것처럼 보이면 자세히 설명 할 수 있습니다.

다른 팁

Junit 4의 경우 @afterclass 주석을보고 싶을 수도 있습니다.이 주석은 테스트가 완료되면 실행됩니다.

http://cwiki.apache.org/dirxdev/junit4-primer.html

dnunit은 이와 관련하여 당신을 도와 줄 것입니다. 원하는 경우 각 개별 테스트 사례에 대해 별도의 데이터 세트를 만들 수 있습니다.

dbunit은 이것에 많은 도움이 될 것입니다. 이론적으로 JDBC에서 자동 커뮤니티를 끄면 털이 생길 수 있습니다. 가장 분명한 솔루션은 DBUNIT를 사용하여 테스트를 실행하기 전에 데이터를 알려진 상태로 설정하는 것입니다. 어떤 이유로 든 테스트가 실행 된 후 데이터가 필요하다면 모든 테스트를 실행하는 제품군에서 @AfterClass를 볼 수 있지만 일반적으로 테스트를 설정 한 다음 실행하는 것이 더 나은 관행으로 간주됩니다. 테스트가 실패하면 다른 테스트를 정리하지 않아 프레스틴 환경이 없었기 때문이 아닙니다. 각 테스트가 환경을 직접 설정해야합니다.

고려해야 할 솔루션 중 하나는 DB 찢어짐에서 "매뉴얼"롤백 또는 보상 거래를 사용하는 것입니다. 나는 (그리고 그것이 아닌 경우, 그것이 당신의 최대 절전 모드 엔티티에 대한 사소한 애드온이어야한다고 생각합니다) 모든 엔티티에는 테이블에 삽입 된 시점을 나타내는 DateTime 속성을 작성합니다. DB 설정 방법은 다른 모든 것에 시간을 기록해야합니다. 그런 다음 DB 설정에서 시간을 재활용 한 후 생성 된 모든 엔티티를 삭제하기 위해 DB 찢어짐에 대한 간단한 절차가 있습니다.

물론 이것은 DB 설정에서 업데이트에 효과가 없지만 업데이트가 제한된 경우이 유형의 데이터에 대한 깨끗한 이미지 저장을 고려하고 DB 중단 중에 복원하십시오.

비교적 작은 데이터베이스와 비교적 빠르게 백업/내보내기를 수행 할 수있는 DBMS로 작업하는 경우 (MS SQL Server와 같은) 테스트 전에 데이터베이스 백업을 작성 한 다음 모든 테스트가있을 때 복원 할 수 있습니다. 완벽한. 이를 통해 개발/테스트 데이터베이스를 설정하여 모든 테스트의 시작 상태로 사용할 수 있습니다.

기본 JDBC로``백업 데이터베이스 ''및``Restore Database '' 'T-SQL을 실행하여 테스트 중에서도 잘 작동했습니다.

그러나이 접근법은 로컬 컴퓨터에 DBMS 서버를 두는 데 달려 있으며 (합리적인 속도), 충분한 권한이있어 (문제가되지 않아야하는지), 데이터베이스의 총 크기는 MB에서 수십 개를 초과하지 않습니다. 최소한 내 경험에.

장치 테스트를 실행하기 위해 데이터베이스에 연결되어야하는 이유가 있습니까? 데이터베이스와의 상호 작용을 조롱 할 수 있도록 클래스를 리팩터링하는 것이 더 쉬울 수 있습니다. EasyMock (www.easymock.org)과의 인터페이스뿐만 아니라 클래스 (일부 예외 포함)를 조롱 할 수 있습니다.

클래스가 연결된 데이터베이스에서 복잡한 기존 상태에 의존하는 경우 모의를 사용하여 더 빠른 실행 테스트를 작성하는 것이 더 쉬울 것입니다. 우리는 프로젝트의 규모가 무엇인지 또는 테스트가 얼마나 자주 실행되는지 알지 못하지만 실행 시간은 특히 대규모 프로젝트에서 고려해야 할 사항 일 수 있습니다.

Hibernate는 깔끔한 작은 기능이 있습니다. 데이터베이스 스키마 생성 직후에 세션 기능 작성 중에 SQL 스크립트를 실행하여 새로운 데이터베이스에서 데이터를 가져올 수 있습니다. ClassPath 루트에 import.sql이라는 파일을 추가하고 hibernate.hbm2ddl.auto 속성으로 작성 또는 생성 드로프를 설정하면됩니다.

http://in.relation.to/bloggers/rotterdamjbugandhibernatesimportsql

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top