Во второй части серии – Тестирование плагинов 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”