2012-06-05 2 views
2

У меня есть проект градиента, который содержит только тестовые классы Selenium/TestNG. Они выполняются против развернутой военной заявки. Все работает отлично, и теперь я добавляю утилиту java, которая будет запрашивать базу тестов и распечатывать список тестов, принадлежащих данной группе TestNG. Утилита должна быть скомпилирована и выполнена отдельно от основного проекта, так как пользователи могут запросить тестовую базу до выполнения теста.Как скомпилировать зависимость одного класса в градиенте вне основного проекта

Я добавил следующее build.gradle:

task listgroups(dependsOn:'buildUtil') <<{ 
    ant.java(classname: 'util.TestGroupScanner', fork: true, 
      classpath: "src/test/java") 
} 

task buildUtil { 
    compile { 
     source = "src/test/java/util" 
    } 
} 

Однако при вызове listgroups задачу, я получаю следующее сообщение об ошибке:

C:\console-bg1>g listgroups 

FAILURE: Build failed with an exception. 
(...) 

* What went wrong: 
A problem occurred evaluating root project 'console-bg1'. 
> Could not find method compile() for arguments [build_4emu7duna2isgubc1k8uts8k9 
[email protected]] on root project 'console-bg1'. 

я не уверен, как решить этот вопрос, разумеется, пока не нашел ответа в Интернете. Любые указатели оценили.

ответ

2

Проблема в задаче buildUtil, как показывает ошибка. buildUtil объявляет закрытие compile, но такого закрытия не существует для задачи по умолчанию.

Позвольте мне пояснить, что такое ваша установка. Источник util.TestGroupScanner находится в каталоге src/test/java/util, который вы хотите скомпилировать отдельно от другого источника (предположительно src/main/java и src/test/java). Задача buildUtil должна собирать источники в src/test/java/util, а задача listgroups выполняет утилиту сканера в папке источника src/test/java.

В этом случае, я предлагаю вам объявить новый source set для ваших источников полезности, как это:

sourceSets { 
    util { 
    java { 
     srcDir 'src/test/java/util' 
    } 
    } 
} 

Это будет автоматически создавать задачу компиляции под названием compileUtilJava для вас, что будет собирать эти источники. Я также думаю, что вы захотите включить классы утилиты в путь к классам при выполнении своего инструмента, который может быть найден sourceSets.util.output.classesDir. Так что теперь ваша listgroups задача будет выглядеть следующим образом:

task listgroups(dependsOn: 'compileUtilJava') <<{ 
    ant.java(classname: 'util.TestGroupScanner', fork: true, 
      classpath: "src/test/java:" + sourceSets.util.output.classesDir) 
} 

Одна вещь, которую я заметил о вашей установке, является то, что src/test/java/util исходной папки вложены в src/test/java. Gradle будет считать, что src/test/java является папкой по умолчанию для вашего проекта, и поэтому автоматически будет включать его и всех его детей при выполнении тестов. Поскольку вы хотите, чтобы ваша папка утилиты была отделена от настройки по умолчанию, я бы порекомендовал вас поместить ее в src/testutil/java, чтобы избежать любых столкновений. Если вы это сделаете, не забудьте обновить установку sourceSets с правильным исходным кодом.

+0

Спасибо за подробности. Теперь я лучше понимаю, как работает градир ... Вы правы, мне нужно переместить утилиту из структуры каталога test/java. Спасибо, что указали это. Я объединил определение sourceSet с JavaExec из другого ответа, и он работает. – Lidia

0

Чтобы решить эту проблему с помощью градиента, я предлагаю создать определенный набор источников для вашего класса util и добавить задачу типа JavaExec, которая выполняет этот класс для печати ваших тестовых групп. Взгляните на следующий фрагмент:

apply plugin:'java' 
... 
... 
configurations{ 
    testUtilCompile.extendsFrom testCompile 
} 

... 
... 
sourceSets{ 
    testUtil{ 
     java { 
      srcDir "src/test/java" 
      include "util/**" 
     } 
    } 
} 

task printGroups(type:JavaExec){ 
    main = "util.TestGroupScanner" 
    classpath = sourceSets.testUtil.runtimeClasspath 
} 

С уважением, Рене

+0

Спасибо! Работает как шарм. – Lidia

Смежные вопросы