Отделив тесты интеграции от модульных тестов в Android Studio
Я пытаюсь отделить интеграционные тесты в Android Studio 0.9.
Я добавил в файл сборки следующее:
sourceSets {
integrationTest {
java.srcDir file('src/integrationTest/java')
}
}
task integrationTest(type: Test) {
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
Я столкнулся с несколькими проблемами:
-
Задача будет выполняться, но у нее нет остальных доступных файлов проекта, поэтому я получаю ошибки в отношении отсутствующих классов. Есть некоторые конкретные Java-решения, которые я нашел, например:
Но я не смог понять, как заставить это работать с Android Studio. Различные комбинации main
и main.output
и игра с зависимостями, похоже, не работают, я получаю такие ошибки, как:
Error:(33, 0) Could not find property 'main' on SourceSet container..
Что имеет смысл, поскольку плагин android определяет свои собственные исходные наборы, но они также не работают.
-
IDE не распознает каталог как каталог исходного кода. В целях тестирования я изменил имя источника на androidTest
, и он правильно получил значок зеленой папки, а тесты запускаются вместе с существующими модульными тестами, которые уже определены в androidTest
.
Ответы
Ответ 1
Я сделал именно такое разделение в Gradle, но для чистого Java-проекта, а не для Android. Вы не указываете путь к классам в наборах источников, что, я думаю, является проблемой. Здесь соответствующая часть build.gradle
:
sourceSets {
integration {
java {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
srcDir file('src/integration/java')
}
resources {
srcDir 'src/integration/resources'
}
}
}
configurations {
integrationCompile.extendsFrom testCompile
integrationRuntime.extendsFrom testRuntime
}
task integrationTest(group: "verification", type: Test) {
testClassesDir = sourceSets.integration.output.classesDir
classpath = sourceSets.integration.runtimeClasspath
}
integrationTest.dependsOn testClasses
В IntelliJ идея подбирает папки под src/integration
, если у них есть стандартные имена (java, resources).
Ответ 2
Ответ на @sm4 действительно работает для модуля Java (с apply plugin: 'java'
), но, к сожалению, не для Android-приложения (apply plugin: 'com.android.application'
), ни для модулей библиотеки Android (apply plugin: com.android.library
).
Но я нашел обходное решение:
Создайте папки для тестов интеграции:
src/integrationTest/java
src/integrationTest/res
Добавьте исходные наборы для новых папок:
sourceSets {
integrationTest {
java {
srcDir file('src/integrationTest/java')
}
res {
srcDir file('src/integrationTest/res')
}
}
}
В чистом Java-модуле папка java
теперь станет зеленой, и значок папки res
изменится. В модуле приложения/библиотеки Android это не так.
Теперь создайте аромат продукта, идентично названный как папка, настроенная в sourceSet, и она работает!
productFlavors {
integrationTest {
}
}
И поставить вишню сверху:
configurations {
integrationTestCompile.extendsFrom testCompile
}