Maven과의 통합 테스트에 대한 모범 사례?
Hibernate (및 Spring)를 사용하여 데이터베이스 등에서 데이터를 검색하는 Maven으로 빌드중인 프로젝트가 있습니다.
내 프로젝트의 DAO에 대한 내 "테스트"는 Spring을 확장 AbstractTransactionalDataSourceSpringContextTests
하여 DataSource를 테스트중인 클래스에 연결하여 실제로 쿼리 / Hibernate 로직을 실행하고 데이터를 가져 오는 등의 작업을 수행 할 수 있습니다.
다른 여러 프로젝트에서 외부 데이터베이스에 의존하지 않고 실제 데이터베이스 쿼리 논리를 효율적으로 테스트 할 수 있도록 HSQL 데이터베이스 (인 메모리 또는 파일을 가리킴)와 함께 이러한 유형의 테스트를 사용했습니다. 이는 외부 종속성을 피하고 테스트를 실행하기 전에 데이터베이스의 "상태"(각각 롤백 된 트랜잭션에 래핑 됨)가 잘 정의되어 있기 때문에 훌륭하게 작동합니다.
하지만 Maven을 사용하여 통합 테스트의 느슨한 맛인 이러한 테스트를 구성하는 가장 좋은 방법이 궁금합니다. 이 테스트를에서 유지하는 것이 약간 더러워 src/test/java
보이지만 내가 읽은 내용에서 Maven과의 통합 테스트를 구성하는 일관된 전략이나 연습이없는 것 같습니다.
지금까지 읽은 내용에서 Failsafe 플러그인 (또는 Surefire의 두 번째 인스턴스)을 사용하고 integration-test
단계에 바인딩 할 수 있으며 사용자 지정 시작 또는 종료 논리 (예 : 시작 / stopping the HSQL instance) to pre-integration-test
또는 post-integration-test
. 그러나 이것이 정말로 최선의 방법입니까?
그래서 내 질문은 기본적으로-Maven으로 이것을 구성하는 데 일반적으로 허용되는 모범 사례는 무엇입니까? 문서에서 일관된 답변을 찾는 데 문제가 있습니다.
내가 원하는 것은 :
- 통합 테스트에서 단위 테스트를 분리하여
test
단계 동안 단위 테스트 만 실행합니다. - 사용자 지정 시작 / 종료 논리를
pre-integration-test
및post-integration-test
- 통합 테스트의 보고서를 단위 테스트 Surefire 보고서와 병합 / 표시합니다.
몇 가지 지침 이있는이 코드 하우스 페이지 가 있습니다. 나는 failsafe 플러그인이 약간의 해킹이라는 것을 알았고 Eclipse에서 단위 테스트를 실행하는 것이 엄청나게 복잡합니다. 나는 당신이 설명하는 것을 광범위하게 수행합니다.
src / itest / java에서 통합 테스트 정의 사전 통합 테스트 단계에서 :
- 목표 / 테스트 클래스 지우기
- 사용 빌드 도우미 - 받는다는 - 플러그인 itest 소스 위치를 추가의 추가 테스트 소스 목표를
- 사용자 정의 Mojo를 사용하여 구성에서 src / test / java를 제거하여 단위 테스트가 다시 컴파일되지 않도록합니다 (정말 마음에 들지 않지만 단위 테스트와 통합 테스트의 분리를 유지하는 데 필요합니다).
- 컴파일러 플러그인을 사용하여 통합 테스트 컴파일
그런 다음 통합 테스트 단계에서 surefire-plugin을 사용하여 테스트를 실행합니다.
마지막으로 정리 목표를 통합 후 테스트 단계에 연결합니다 (일반적으로 테스트 teardown ()을 사용하여 정리할 수 있으므로 필요하지 않음).
보고 단계가 지나도 테스트 결과를 병합하는 방법을 아직 찾지 못했지만 보고서를 통과하는 한 통합 테스트를 추가 보너스로 보는 경향이 있습니다.
업데이트 : Jetty 목표를 사용하는 대신 통합 테스트 내에서 Jetty를 실행할 수 있다는 점을 지적 할 가치가 있다고 생각합니다. 이렇게하면 테스트를 훨씬 더 세밀하게 제어 할 수 있습니다. 이 답변 과 참조 블로그 에서 자세한 내용을 얻을 수 있습니다 .
이를 수행하는 매우 간단한 방법은 JUnit 카테고리를 사용하는 것입니다.
그런 다음 테스트 단계에서 일부 테스트를 쉽게 실행할 수 있고 통합 테스트 단계에서 다른 테스트를 쉽게 실행할 수 있습니다.
몇 분이 걸리며 3 단계 만 필요합니다.
- 마커 인터페이스 정의
- 분할하려는 클래스에 주석 달기
- Maven 플러그인을 구성합니다.
여기에 전체 예가 나와 있습니다. https://stackoverflow.com/a/10381662/1365383
이 좋은 블로그 게시물 은 세 가지 옵션을 제안합니다.
1) 통합 테스트를위한 별도의 모듈
2) 다른 소스 디렉토리
3) 다른 파일 이름 패턴
나는 아직 세 가지를 모두 시도하지 않았으므로 내가 선호하는 의견을 제시 할 수 없습니다.
두 번째 옵션 인 다른 소스 디렉토리를 선호하지만 IT 통합 테스트를 끝내거나 패키지를 제외해야하는 것은 상당히 짜증나는 일이었습니다.
이것을 피하기 위해 다음 구성으로 끝났습니다.
<properties>
<testSource>src/test/java</testSource>
<testSourceResource>src/test/resources</testSourceResource>
</properties>
<build>
<testSourceDirectory>${testSource}</testSourceDirectory>
<testResources>
<testResource>
<directory>${testSourceResource}</directory>
</testResource>
</testResources>
.....
.....
그런 다음 통합 및 수락 테스트를 위해 서로 다른 프로필의 두 변수를 모두 재정의합니다.
<profiles>
<profile>
<id>acceptance-tests</id>
<properties>
<testSource>src/acceptance-test/java</testSource>
<testSourceResource>src/acceptance-test/resources</testSourceResource>
</properties>
</profile>
<profile>
<id>integration-tests</id>
<properties>
<testSource>src/integration-test/java</testSource>
<testSourceResource>src/integration-test/resources</testSourceResource>
</properties>
</profile>
.....
.....
.....
참고 URL : https://stackoverflow.com/questions/1228709/best-practices-for-integration-tests-with-maven
'programing tip' 카테고리의 다른 글
스크롤 할 때 페이드 인되는 Google Play와 같은 ActionBar를 만드는 방법 (0) | 2020.11.09 |
---|---|
JVM은 System.identityHashCode ()가 절대 변경되지 않도록 어떻게 보장합니까? (0) | 2020.11.09 |
OpenGL이 라디안 대신 각도를 사용하는 이유는 무엇입니까? (0) | 2020.11.09 |
종속성이있는 동적 라이브러리와 연결 (0) | 2020.11.09 |
iPhone을 백그라운드에서 iBeacon으로 실행 (0) | 2020.11.09 |