Рубрики
Без рубрики

Тестирование плагинов Maven – По-современному – Часть III

Во второй части серии – Тестирование плагинов Maven – По-современному – Часть II мы увидели, как это делается… Помечено как программирование, java, maven, тестирование.

Во второй части серии – Тестирование плагинов Maven – По-современному – Часть II мы рассмотрели, как выполнить базовый интеграционный тест, проверяя выходные данные журнала сборок Maven.

В этой третьей части мы рассмотрим, как Maven будет вызываться по умолчанию во время интеграционных тестов и как мы можем повлиять на это поведение.

Давайте начнем со следующего базового интеграционного теста (мы игнорируем проект, который в данный момент используется для тестирования.)

@MavenJupiterExtension
class BaseIT {

  @MavenTest
  void the_first_test_case(MavenExecutionResult result) {
     ...
  }
}

Приведенный выше тест выполнит Apache Maven, используя по умолчанию следующие параметры:

  • -- пакетный режим
  • --шоу-версия
  • -- ошибки

Это означает, что каждое выполнение в рамках интеграционного тестирования будет выполняться следующим образом:

mvn --batch-mode --show-version --errors

Чтобы это работало правильно и, в частности, имело локальный кэш для каждого интеграционного тестового примера, платформа интеграционного тестирования добавит: -Dmaven.repo.local=... также для каждого вызова. Это необходимо для получения следующего результата:

.
└──target/
   └── maven-it/
       └── org/
           └── it/
               └── FirstMavenIT/
                   └── the_first_test_case/
                       ├── .m2/
                       ├── project/
                       │   ├── src/
                       │   ├── target/
                       │   └── pom.xml
                       ├── mvn-stdout.log
                       ├── mvn-stderr.log
                       └── mvn-arguments.log

Опция -Dmaven.repo.local=... |/в данный момент не может быть изменен. Используемые аргументы командной строки записываются в файл mvn-arguments.log , с которым можно ознакомиться для последующего анализа. Итак, в итоге командная строка для интеграционного теста выглядит следующим образом:

mvn -Dmaven.repo.local= --batch-mode --show-version --errors package

Используемая цель ( package ) и то, как ее можно изменить, будут рассмотрены в части IV серии.

Пока все хорошо, но иногда или, может быть, чаще требуется добавлять другие параметры командной строки к вызову Maven, в частности, в связи с интеграционными тестами.

Иногда ваш собственный плагин/расширение распечатывает некоторую полезную информацию на уровне отладки, но как это проверить? Ранее мы упоминали, что параметры, используемые для интеграционного теста, не содержат опции отладки.

Теперь мы можем выразить потребность с помощью этого ( basic_configuration_with_debug ):

@MavenJupiterExtension
class FailureIT {
  ...
  @MavenTest
  @MavenOption(MavenCLIOptions.DEBUG)
  void basic_configuration_with_debug(MavenExecutionResult result) {
    assertThat(result)
        .isSuccessful()
        .out()
        .info()
        .containsSubsequence(
            "--- maven-enforcer-plugin:3.0.0-M1:enforce (enforce-maven) @ basic_configuration_with_debug ---",
            "--- jacoco-maven-plugin:0.8.5:prepare-agent (default) @ basic_configuration_with_debug ---",
            "--- maven-resources-plugin:3.1.0:resources (default-resources) @ basic_configuration_with_debug ---",
            "--- maven-compiler-plugin:3.8.1:compile (default-compile) @ basic_configuration_with_debug ---",
            "--- maven-resources-plugin:3.1.0:testResources (default-testResources) @ basic_configuration_with_debug ---",
            "--- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ basic_configuration_with_debug ---",
            "--- maven-surefire-plugin:3.0.0-M4:test (default-test) @ basic_configuration_with_debug ---",
            "--- maven-jar-plugin:3.2.0:jar (default-jar) @ basic_configuration_with_debug ---",
            "--- maven-site-plugin:3.9.1:attach-descriptor (attach-descriptor) @ basic_configuration_with_debug ---"
        );
    assertThat(result)
        .isSuccessful()
        .out()
        .warn()
        .containsSubsequence(
            "Neither executionException nor failureException has been set.",
            "JAR will be empty - no content was marked for inclusion!");

    assertThat(result)
        .isSuccessful()
        .out()
        .debug()
        .containsSubsequence(
            "Created new class realm maven.api",
            "Project: com.soebes.itf.maven.plugin.its:basic_configuration_with_debug:jar:1.0",
            "Goal:          org.apache.maven.plugins:maven-resources-plugin:3.1.0:resources (default-resources)"
        );

  }
}

Важно сказать, что с помощью @Moveoption(..) автоматически все другие ранее упомянутые параметры командной строки больше не будут использоваться. В этом примере конечная командная строка выглядит следующим образом для тестового примера basic_configuration_with_debug/|:

mvn -Dmaven.repo.local= --debug package

Таким образом, на основе включения вывода отладки это означает, что вы можете проверить вывод отладки следующим образом:

assertThat(result)
    .isSuccessful()
    .out()
    .debug()
    .containsSubsequence(
        "Created new class realm maven.api",
        "Project: com.soebes.itf.maven.plugin.its:basic_configuration_with_debug:jar:1.0",
        "Goal:          org.apache.maven.plugins:maven-resources-plugin:3.1.0:resources (default-resources)"
    );

Если вы хотите, чтобы в вашем тестовом примере были опции --batch-mode , --show-version , а также опция --error , добавьте их следующим образом:

  @MavenTest
  @MavenOption(MavenCLIOptions.BATCH_MDOE)
  @MavenOption(MavenCLIOptions.SHOW_VERSION)
  @MavenOption(MavenCLIOptions.ERRORS)
  @MavenOption(MavenCLIOptions.DEBUG)
  void basic_configuration_with_debug(MavenExecutionResult result) {
  ...
  }

Результатом будет то, что ваша командная строка Maven теперь будет выглядеть так, как до включения дополнительной опции --debug :

mvn -Dmaven.repo.local= --batch-mode --show-version --errors --debug package

Это показывает, что вы можете легко комбинировать несколько параметров командной строки для тестового примера с помощью аннотации @Moveoption .

Некоторым параметрам командной строки в Maven требуется дополнительная информация, например --log-file , для которой требуется имя файла журнала, в который перенаправляются все выходные данные. Как мы можем выразить это с помощью аннотации @Moveoption ? Это может быть просто достигнуто следующим образом:

  @MavenTest
  @MavenOption(QUIET)
  @MavenOption(SHOW_VERSION)
  @MavenOption(value = LOG_FILE, parameter = "test.log")
  void basic_configuration_with_debug(MavenExecutionResult result) {
  ...
  }

Как вы можете видеть в приведенном выше примере, вы должны указать опцию через значение аннотации. Параметр опции должен быть задан через parameter . В этом случае мы использовали статический импорт, чтобы сделать его более читаемым. Ты можешь of курсовая работа без статического импорта, подобного этому (просто вопрос

  @MavenTest
  @MavenOption(MavenCLIOptions.QUIET)
  @MavenOption(MavenCLIOptions.SHOW_VERSION)
  @MavenOption(value = MavenCLIOptions.LOG_FILE, parameter = "test.log")
  void basic_configuration_with_debug(MavenExecutionResult result) {
  ...
  }

of || курсовая работа без статического импорта, подобного этому (просто вопрос Вы можете просто добавить параметры командной строки на уровень тестового класса, который выглядит следующим образом:

@MavenJupiterExtension
@MavenOption(MavenCLIOptions.FAIL_AT_END)
@MavenOption(MavenCLIOptions.NON_RECURSIVE)
@MavenOption(MavenCLIOptions.ERRORS)
@MavenOption(MavenCLIOptions.DEBUG)
class FailureIT {

  @MavenTest
  void case_one(MavenExecutionResult project) {
    ..
  }

  @MavenTest
  void case_two(MavenExecutionResult result) {
    ..
  }

  @MavenTest
  void case_three(MavenExecutionResult result) {
    ..
  }

  @MavenTest
  void case_four(MavenExecutionResult result) {
    ..
  }

}

Вы можете просто добавить параметры командной строки на уровень тестового класса, который выглядит следующим образом: Вы можете просто добавить параметры командной строки на уровень тестового класса, который выглядит следующим образом: Кроме того, гораздо удобнее определять параметры командной строки только один раз , а не для каждого отдельного тестового примера.

Кроме того, гораздо удобнее определять параметры командной строки только один раз , а не для каждого отдельного тестового примера. Я хочу выполнить case_four

@MavenJupiterExtension
@MavenOption(MavenCLIOptions.FAIL_AT_END)
@MavenOption(MavenCLIOptions.NON_RECURSIVE)
@MavenOption(MavenCLIOptions.ERRORS)
@MavenOption(MavenCLIOptions.DEBUG)
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) {
    ..
  }

}

Тестовый пример case_four не будет наследовать параметры командной строки, определенные на уровне класса. Он будет использовать только те, которые определены в самом тестовом примере.

Теперь обычный вопрос разработчика: я действительно ленив, я не хочу писать все эти четыре Maven Option аннотации для каждого тестового класса. В частности, если мне нужно изменить эти параметры командной строки, я должен пройти каждый тестовый класс один за другим?

Конечно, есть более удобное решение этой проблемы. Это называется мета-аннотацией. Мы можем просто создать мета-аннотацию, которую мы называем Maven Test Options . Эта мета-аннотация выглядит следующим образом:

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

Эта мета-аннотация теперь может использоваться для изменения тестового класса предыдущего примера следующим образом:

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

}

Эта мета-аннотация теперь может использоваться для изменения тестового класса в предыдущем примере следующим образом: Вышеизложенное можно немного улучшить. Эта мета-аннотация теперь может использоваться для изменения тестового класса в предыдущем примере следующим образом: Вышеизложенное можно немного улучшить. Мы можем интегрировать аннотацию @MavenJupiterExtension в нашу самостоятельно определенную мета-аннотацию следующим образом (В примере проекта Эта мета-аннотация теперь может использоваться для изменения тестового класса в предыдущем примере следующим образом: Вышеизложенное можно немного улучшить. Мы можем интегрировать аннотацию @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)
public @interface MavenTestOptions {
}

Эта мета-аннотация теперь может использоваться для изменения тестового класса в предыдущем примере следующим образом: Вышеизложенное можно немного улучшить. Мы можем интегрировать аннотацию || @MavenJupiterExtension || в нашу самостоятельно определенную мета-аннотацию следующим образом (В || пример проекта || Я назвал мета-аннотацию || @MavenITExecution ||, чтобы иметь разные примеры в одном проекте.): На основе этого мы можем изменить тестовый пример, чтобы он выглядел следующим образом:

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

}

Эта мета-аннотация теперь может использоваться для изменения тестового класса в предыдущем примере следующим образом: Вышеизложенное можно немного улучшить. Мы можем интегрировать аннотацию @MavenJupiterExtension в нашу самостоятельно определенную мета-аннотацию следующим образом (В пример проекта Я назвал мета-аннотацию @MavenITExecution , чтобы иметь разные примеры в одном проекте.): На основе So это для части III. что мы можем изменить тестовый пример, чтобы он выглядел следующим образом: Эта мета-аннотация теперь может использоваться для изменения тестового класса в предыдущем примере следующим образом: Вышеизложенное можно немного улучшить. Мы можем интегрировать аннотацию

Эта мета-аннотация теперь может использоваться для изменения тестового класса в предыдущем примере следующим образом: Вышеизложенное можно немного улучшить. Мы можем интегрировать аннотацию @MavenJupiterExtension в нашу самостоятельно определенную мета-аннотацию следующим образом (В

Эта мета-аннотация теперь может использоваться для изменения тестового класса в предыдущем примере следующим образом: Вышеизложенное можно немного улучшить. Мы можем интегрировать аннотацию @MavenJupiterExtension в нашу самостоятельно определенную мета-аннотацию следующим образом (В

Оригинал: “https://dev.to/khmarbaise/maven-plugin-testing-in-a-modern-way-part-iii-16jc”