Maven 플러그인 테스트 - 현대적인 방식 - IV부

previous part of the series - Maven Plugin Testing - In a Modern way - Part III에서 명령줄 옵션을 정의하는 방법을 보았습니다. 이 부분에서는 각 테스트 사례에 대해 실행할 목표와 이를 변경할 수 있는 방법을 자세히 살펴보겠습니다.

다음과 같은 간단한 예제 테스트 케이스로 시작하겠습니다.

@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) {
     ...
  }
}

테스트 케이스firstverify 단계로 호출되는 반면 secondthirdpackage 단계로 호출됩니다. 따라서 이는 각 테스트 케이스에 대한 기본 동작을 개별적으로 덮어쓸 수 있음을 의미합니다.

때때로 다음과 같이 통합 테스트 중에 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 입니다.

좋은 웹페이지 즐겨찾기