Maven 플러그인 테스트 - 현대적인 방식 - IV부
19634 단어 testingjavaprogrammingmaven
다음과 같은 간단한 예제 테스트 케이스로 시작하겠습니다.
@MavenJupiterExtension
class BaseIT {
@MavenTest
void the_first_test_case(MavenExecutionResult result) {
...
}
}
해당 통합 테스트를 실행하면 Maven이 다음과 같이 호출됩니다.
mvn -Dmaven.repo.local=<Directory> --batch-mode --show-version --errors package
우리는 위의 예에서
package
부분에 집중할 것입니다. Maven의 life cycle phase입니다. 그렇다면 대신 mvn .. verify
와 같은 것을 호출하고 싶다면 어떻게 해야 할까요? 이것은 다음과 같이 @MavenGoal
주석을 사용하여 간단히 달성할 수 있습니다.@MavenJupiterExtension
class BaseIT {
@MavenTest
@MavenGoal("verify")
void the_first_test_case(MavenExecutionResult result) {
...
}
}
따라서 다음 예를 자세히 살펴보겠습니다.
@MavenJupiterExtension
class BaseIT {
@MavenTest
@MavenGoal("verify")
void first(MavenExecutionResult result) {
...
}
@MavenTest
void second(MavenExecutionResult result) {
...
}
@MavenTest
void third(MavenExecutionResult result) {
...
}
}
테스트 케이스
first
는 verify
단계로 호출되는 반면 second
및 third
는 package
단계로 호출됩니다. 따라서 이는 각 테스트 케이스에 대한 기본 동작을 개별적으로 덮어쓸 수 있음을 의미합니다.때때로 다음과 같이 통합 테스트 중에 Maven을 실행하고 싶을 때가 있습니다.
mvn clean verify
또는 일반적으로 다중 수명 주기 단계에서. 이것은 다음 예와 같이 다중MavenGoal
주석을 사용하여 달성할 수 있습니다.@MavenJupiterExtension
class BaseIT {
@MavenTest
@MavenGoal("clean")
@MavenGoal("verify")
void first(MavenExecutionResult result) {
...
}
...
}
물론 이전에 정의된 목표를 실행하는 데 필요한 많은 통합 테스트가 있는 상황이 있습니다. 이것은 대신 다음과 같이 클래스 수준에서
@MavenGoal
주석을 정의하여 처리할 수 있습니다.@MavenJupiterExtension
@MavenGoal("clean")
@MavenGoal("verify")
class BaseIT {
@MavenTest
void first(MavenExecutionResult result) {
...
}
@MavenTest
void second(MavenExecutionResult result) {
...
}
@MavenTest
void third(MavenExecutionResult result) {
...
}
}
이것은 또한 달성하고자 하는 것에 따라 다른 목표를 가진 테스트 클래스 내에서 단일 테스트(또는 둘 이상) 케이스를 실행할 수 있는 기회를 제공합니다.
다음과 같은 클래스 수준에서
@MavenGoal
주석을 정의하는 방법에 대한 또 다른 예:@MavenJupiterExtension
@MavenGoal("clean")
class GoalsOnClassIT {
@MavenTest
@DisplayName("This will check the goal which is defined on the class.")
void goal_clean(MavenExecutionResult result) {
assertThat(result)
.isSuccessful()
.out()
.info()
.containsSubsequence(
"Scanning for projects...",
"-------------------< com.soebes.katas:kata-fraction >-------------------",
"Building kata-fraction 1.0-SNAPSHOT",
"--------------------------------[ jar ]---------------------------------",
"--- maven-clean-plugin:3.1.0:clean (default-clean) @ kata-fraction ---"
);
assertThat(result)
.isSuccessful()
.out()
.warn().isEmpty();
}
}
다음 논리적 단계는 삶을 더 쉽게 만들기 위해 메타 주석을 만드는 것입니다. 다음과 같이 수행할 수 있는 단일 주석
clean
내에서 verify
및 @GoalsCleanVerify
를 결합하고 싶습니다.@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RUNTIME)
@Inherited
@MavenGoal({"clean", "verify"})
public @interface GoalsCleanVerify {
}
이러한 종류의 메타 주석은 클래스 수준(주석 자체에 의해 정의됨)과 다음과 같은 메서드 수준에서 사용할 수 있습니다.
@MavenJupiterExtension
@GoalsCleanVerify
class MetaAnnotationGoalIT {
...
}
이제 이 메타 주석을 정의한 위치Part III에 대해 생각해 보겠습니다.
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RUNTIME)
@Inherited
@MavenOption(MavenCLIOptions.FAIL_AT_END)
@MavenOption(MavenCLIOptions.NON_RECURSIVE)
@MavenOption(MavenCLIOptions.ERRORS)
@MavenOption(MavenCLIOptions.DEBUG)
public @interface MavenTestOptions {
}
이 메타 주석은 이제 필요한
@MavenGoal
주석으로 향상될 수 있습니다.@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RUNTIME)
@Inherited
@MavenOption(MavenCLIOptions.FAIL_AT_END)
@MavenOption(MavenCLIOptions.NON_RECURSIVE)
@MavenOption(MavenCLIOptions.ERRORS)
@MavenOption(MavenCLIOptions.DEBUG)
@MavenGoal("clean")
@MavenGoal("verify")
public @interface MavenTestOptions {
}
즉, 주석 세트 또는 명령줄 옵션 및 목표 조합을 쉽게 정의하거나 더 정교하게 결합할 수 있습니다
@MavenJupiterExtension
.이와 같이:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RUNTIME)
@Inherited
@MavenJupiterExtension
@MavenOption(MavenCLIOptions.FAIL_AT_END)
@MavenOption(MavenCLIOptions.NON_RECURSIVE)
@MavenOption(MavenCLIOptions.ERRORS)
@MavenOption(MavenCLIOptions.DEBUG)
@MavenGoal("clean")
@MavenGoal("verify")
public @interface MavenTestOptions {
}
이렇게 하면 다음과 같이 사용할 수 있는 옵션이 제공됩니다.
@MavenTestOptions
class FailureIT {
@MavenTest
void case_one(MavenExecutionResult project) {
..
}
@MavenTest
void case_two(MavenExecutionResult result) {
..
}
@MavenTest
void case_three(MavenExecutionResult result) {
..
}
@MavenTest
@MavenOption(MavenCLIOptions.DEBUG)
void case_four(MavenExecutionResult result) {
..
}
}
이것은 하나의 주석에 정의된 목표와 주어진 옵션을 결합합니다. 변경해야 할 사항이 있으면 한 점만 수정하면 됩니다.
그래서 우리가 뭔가를 놓쳤습니까? 그래, 우리가 했어. 때때로 다음과 같은 별도의 목표로 플러그인을 호출하고 싶을 때가 있습니다.
mvn org.test.maven.plugin:maven-x-plugin:goal
이것은 다음과 같이
@MavenGoal
주석을 사용하여 달성할 수 있습니다.@MavenJupiterExtension
class BaseIT {
@MavenTest
@MavenGoal("org.test.maven.plugin:maven-x-plugin:goal")
void first(MavenExecutionResult result) {
...
}
...
}
이제 주어진 플러그인이 주어진 통합 테스트를 통해 테스트되어야 하는 플러그인이라고 가정하겠습니다. 그런 다음 올바른 groupId, artifactId, 버전 및
정확한 목표. 불행히도 플러그인의 각 릴리스와 함께 버전이 변경됩니다.
@MavenJupiterExtension
class BaseIT {
@MavenTest
@MavenGoal("${project.groupId}:${project.artifactId}:${project.version}:goal-to-test")
void first(MavenExecutionResult result) {
...
}
...
}
자리 표시자
${project.groupId}
, ${project.artifactId}
및 ${project.version}
는개발 중인 플러그인의 좌표를 정의하는 프로젝트 pom의 정보입니다. 이렇게 하면 이 플러그인 버전만 사용 중인지 확인합니다.
통합 테스트 중에 중앙 또는 다른 리포지토리에서 다른 버전을 다운로드하려고 시도하지 않습니다.
좋은 예는 다음에서 찾을 수 있습니다.
maven-invoker-plugin based integration tests .
그래서 이것은 파트 IV에 대한 것입니다. Integration Testing Framework에 대해 더 알고 싶다면 users guide 을 참조하십시오. 릴리스 상태를 알고 싶다면 release notes 을 살펴볼 수 있습니다.
아이디어, 제안 또는 발견된 버그가 있으면 file in an issue on github .
이전 예제를 보여주는 예제 프로젝트는 found on GitHub 입니다.
Reference
이 문제에 관하여(Maven 플러그인 테스트 - 현대적인 방식 - IV부), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/khmarbaise/maven-plugin-testing-in-a-modern-way-part-iv-4ko0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)