Статьи

Spock 1.0 со сравнением конфигурации Groovy 2.4 в Maven и Gradle

Краткое руководство по настройке Spock 1.0 с Groovy 2.4 с использованием Maven и Gradle.

Спок 1.0 был наконец выпущен . О новых возможностях и улучшениях я уже написал два поста в блоге. Одним из последних изменений было разделение на артефакты, разработанные для определенных версий Groovy: 2.0, 2.2, 2.3 и 2.4, чтобы минимизировать шанс встретить двоичную несовместимость во время выполнения (в прошлом были только версии для Groovy 1.8 и 2.0+) , Это было сделано внезапно, и, основываясь на сообщениях в списке рассылки, это смутило некоторых людей. После того, как меня дважды попросили помочь правильно настроить два проекта, я решил написать небольшую статью, в которой рассказывалось, как настроить Spock 1.0 с Groovy 2.4 в Maven и Gradle. Это также отличное место для сравнения того, сколько работы требуется для выполнения этих двух очень популярных систем сборки.

специалист

Maven изначально не поддерживает другие языки JVM (например, Groovy или Scala). Чтобы использовать его в проекте Maven, необходимо использовать сторонний плагин. Для Groovy лучшим вариантом кажется GMavenPlus (переписанный плагин GMaven, который больше не поддерживается). Альтернативой является плагин, который позволяет использовать компилятор Groovy-Eclipse с Maven, но он не использует официальный groovyc и в прошлом были проблемы с тем, чтобы быть в курсе новых выпусков / функций Groovy.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
<plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Поскольку мы хотим написать тесты в Spock, который рекомендует дополнительно именовать файлы с суффиксом Spec (из спецификации), необходимо указать Surefire искать тесты также в этих файлах:

01
02
03
04
05
06
07
08
09
10
<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${surefire.version}</version>
    <configuration>
        <includes>
            <include>**/*Spec.java</include> <!-- Yes, .java extension -->
            <include>**/*Test.java</include> <!-- Just in case of having also "normal" JUnit tests -->
        </includes>
    </configuration>
</plugin>

Стоит обратить внимание, что нам нужно включить **/*Spec.java не **/*Spec.groovy чтобы это работало.

В конце должны быть добавлены зависимости:

01
02
03
04
05
06
07
08
09
10
11
12
13
<dependencies>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.spockframework</groupId>
            <artifactId>spock-core</artifactId>
            <version>1.0-groovy-2.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Очень важно взять правильную версию Спока. Для Groovy 2.4 требуется версия 1.0-groovy-2.4. Для Groovy 2.3 версия 1.0-groovy-2.3. В случае ошибки Спок протестует с явным сообщением об ошибке:

1
2
3
4
5
6
7
8
9
Could not instantiate global transform class
org.spockframework.compiler.SpockTransform specified at
jar:file:/home/foo/.../spock-core-1.0-groovy-2.3.jar!/META-INF/services/org.codehaus.groovy.transform.ASTTransformation
because of exception
org.spockframework.util.IncompatibleGroovyVersionException:
The Spock compiler plugin cannot execute because Spock 1.0.0-groovy-2.3 is
not compatible with Groovy 2.4.0. For more information, see
 
http://versioninfo.spockframework.org

Вместе с другими обязательными элементами pom.xml размер файла увеличился до более чем 50 строк XML. Довольно много только для Groovy и Спока. Посмотрим, насколько это сложно в Gradle.

Gradle

Gradle имеет встроенную поддержку Groovy и Scala . Без дальнейших церемоний плагин Groovy просто должен быть применен.

1
apply plugin: 'groovy'

Далее необходимо добавить зависимости:

1
2
compile 'org.codehaus.groovy:groovy-all:2.4.1'
testCompile 'org.spockframework:spock-core:1.0-groovy-2.4'

и информация, где Gradle должен искать их:

1
2
3
repositories {
    mavenCentral()
}

Вместе с определением группы пакетов и версии потребовалось 15 строк кода в основанном на Groovy DSL.

Между прочим, в случае Gradle также очень важно сопоставить версии Spock и Groovy, например Groovy 2.4.1 и Spock 1.0-groovy-2.4.

Резюме

Благодаря встроенной поддержке Groovy и компактному DSL Gradle является предпочтительным решением для начала игры со Споком (и Groovy в целом). Тем не менее, если вы предпочитаете Apache Maven с помощью GMavenPlus (и XML), также возможно создать проект, протестированный с помощью Spock.

Минимальный рабочий проект со Spock 1.0 и Groovy 2.4, настроенным в Maven и Gradle, можно клонировать с моего GitHub .

Spock-заводной-Maven-Gradle

Бонус: графическое сравнение конфигурации Спока и Groovy в Maven и Gradle

Запись. Я не использовал Maven в своем проекте более 2 лет (я предпочитаю Gradle), поэтому, если есть лучший / более простой способ настройки Groovy и Spock с Maven, просто дайте мне знать в комментариях.
Примечание 2. В примерах конфигурации предполагается, что Groovy используется только для тестов, а рабочий код написан на Java. Можно смешивать Groovy и Java-код вместе, но тогда конфигурация немного сложнее.
Примечание 3. Если вы заинтересованы в получении полезных советов и рекомендаций по использованию Spock Framework для тестирования кода Java и Groovy, я выступлю с докладом об этом на конференции 4Developers , 20 апреля 2015 г.

Обновление 20150310 . Переработано резюме.

Ссылка: Spock 1.0 со сравнением конфигурации Groovy 2.4 в Maven и Gradle от нашего партнера по JCG Марцина Заячковского в блоге Solid Soft .