Как я могу проверить архетип maven, который я только что создал?
Я создал несколько архетипов для проекта, который отлично работает сейчас, но я хотел бы проверить, что код, созданный из архетипов, продолжает работать в будущем.
Я хочу, чтобы это была фаза построения архетипа, которая только что создала архетип, запускает на нем mvn archetype:generate
, а затем запускает mvn verify
в сгенерированном коде, чтобы убедиться, что сгенерированный код на самом деле ОК. Если понадобится, я напишу свой собственный mojo, чтобы сделать это, но хотел посмотреть, существует ли решение. Я вижу цель archetype:integration-test
, но, похоже, она не делает то, что я хочу.
Ответы
Ответ 1
ОБНОВЛЕНИЕ 2013: теперь это намного проще, чем предлагают другие ответы.
https://issues.apache.org/jira/browse/ARCHETYPE-334 был завершен в августе 2011 года
Для использования просто поместите слово install
в упомянутый выше файл goal.txt
, и тесты из проекта, который вы создаете, будут вызываться как часть обычной сборки. (И/или verify
в случае ОП.)
Однако, если вы новичок в создании архетипов, знайте, что это популярное мини-руководство устарело и, хотя оно будет работать для создания архетипа, оно не будет работать для запуска тестов интеграции архетипов. Вместо этого вы должны создать файл archetype-metadata.xml
как описано здесь. (С этим гораздо приятнее работать, поскольку он использует наборы файлов!)
Также обратите внимание, что эти интеграционные тесты не отвечают на -DskipTests
но это можно исправить следующим образом:
<build>
<plugins>
<plugin>
<artifactId>maven-archetype-plugin</artifactId>
<version>2.2</version>
<configuration>
<skip>${skipTests}</skip>
</configuration>
</plugin>
</plugins>
</build>
(Хотя это выглядит так, как будто он пропускает весь плагин, он на самом деле работает, возможно, потому, что он возвращается к унаследованному режиму; тогда как я не смог найти какого-либо успешного способа пропустить только выполнение цели integration-test
с использованием приведенного выше кода.)
Ответ 2
Помимо подхода использования плагина maven-invoker, мы используем другой подход. С помощью Maven Verifier вы можете легко протестировать свои плагины и архетипы maven.
Просто добавьте следующую зависимость в ваш pom вашего тестового проекта maven:
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-verifier</artifactId>
<version>1.2</version>
</dependency>
Теперь вы можете использовать
org.apache.maven.it.Verifier
в ваши обычные тесты JUnit. С помощью верификатора вы можете запускать цели maven и некоторые утверждения о результате.
Для полного примера просто проверьте интеграционные тесты maven-модулей наших javascript-архетипов:
https://github.com/akquinet/javascript-archetypes
Ответ 3
Я сам немного боролся с этим и подумал, что при использовании текущего v2.3 плагина maven-archetype в дополнение к src/test/resources/projects/first/goal.txt, также необходимо src/test/resources/projects/first/archetype.properties, содержащий что-то вроде этого:
sourceEncoding=UTF-8
groupId=integrationtest.group
artifactId=integrationtest.artifactId
version=1.0.0-SNAPSHOT
package=org.eclipse.xtend.xtend-archetype.integrationtest
packageInPathFormat=org/eclipse/xtend/xtend-archetype/integrationtest
Этот запрос на растяжение иллюстрирует полный рабочий пример.
Ответ 4
Чтобы ответить на мой собственный вопрос, "официальная" функция находится в разработке:
http://jira.codehaus.org/browse/ARCHETYPE-334
Тем временем эта ссылка обеспечивает обходной путь с использованием плагина maven-invoker:
http://maven.40175.n5.nabble.com/unit-testing-archetypes-td75257.html#a75257
Ответ 5
Я предполагаю, что это будет сценарий для сервера непрерывной интеграции, например hudson.
Вы определяете задание, которое
- пустет каталог (shell script)
- создает новый проект, основанный на архетипе (mvn archetype: generate)
- запускает проект (пакет mvn)
Хотя это, возможно, каким-то образом можно было бы вписаться в один жизненный цикл maven, это было бы ужасно беспорядочно. Вместо этого используйте CI.
Ответ 6
Я вижу цель архетипа: интеграция-тест, но, похоже, он не делает того, что я хочу.
Если я не понял, что вы хотите, цель archetype:integration-test
кажется очень хорошим решением:
Выполнить интеграцию архетипа испытаний, состоящих из создания проект из текущего архетипа с определенными свойствами и необязательными сравнение с эталонной копией. ИТ состоит из каталога в SRC/тест/ресурсы/проекты содержащий:
- target.txt(контент фактически не используется, но будущая версия должна интерпретировать его как цель бежать против сгенерированного проект: см. ARCHETYPE-334),
- archetype.properties со свойствами для генерации проекта,
- необязательный справочник/каталог, содержащий ссылочную копию ожидаемый проект, созданный из ИТ.
В соответствии с вышеприведенным описанием эти цели позволяют точно запускать теги интеграции, чтобы проверить проект, сгенерированный с помощью текущего архетипа, на ожидаемый результат, и это выглядит как простой, простой, автономный способ проверки архетипа.
Почему этот подход не удовлетворяет? Что я пропустил?