Отделив тесты интеграции от модульных тестов в 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
}