Смущает testCompile и androidTestCompile в Android Gradle

87

Я новичок в мире тестирования и даже больше в мире тестирования Android. Во время исследования Robolectric, которое помогает с тестами на Android, меня больше всего смущает одна вещь. Иногда в сети я вижу людей, использующих testCompileключевое слово в зависимостях скрипта сборки gradle при обращении к Robolectric, в то время как другие используют androidTestCompile. Конечно, оба не могут быть действительными?

Может кто-нибудь объяснить разницу между ними и какой из них следует использовать при использовании Robolectric?

Лукас
источник

Ответы:

120

Просто testCompileэто конфигурация для модульных тестов (которые находятся в src / test ) и androidTestCompileиспользуется для тестового api (который находится в src / androidTest ). Поскольку вы собираетесь писать модульные тесты, вам следует использовать testCompile.

Обновление: основное различие между ними заключается в том, что testисходный код запускается в обычной Java JVM, тогда как androidTestтесты исходного кода запускаются на устройстве Android (или эмуляторе).

Марк Виейра
источник
Спасибо. Это то, что я подумал сначала, но если это так, почему некоторые ссылки на робоэлектрическую зависимость с testCompile и некоторые с androidTestCompile. Разве это не библиотека, которая помогает писать интеграционные тесты? Если да, то не следует ли на него ссылаться с помощью androidTestCompile? Однако даже официальное руководство по robolectric предписывает использовать testCompile ... Извините, но, как вы можете видеть, на данный момент это меня слишком сбивает с толку.
Лукас,
3
Соглашения об именах немного странные. По сути, если вы пишете модульные тесты (тесты, которые не будут запускаться на устройстве), они будут существовать в 'src / test' и, следовательно, их зависимости будут входить в testCompileконфигурацию. Зависимости, добавленные в androidTestCompileконфигурацию, будут доступны только источнику в src / androidTest, который фактически встроен в APK и развернут на устройстве.
Марк Виейра,
Спасибо, что указали мне направление. Он не ответил на все мои вопросы, но помог мне во время моего исследования. Чтобы прояснить, что вы сказали, модульные тесты - это не только те, которые находятся в тестовой папке (по умолчанию). Как ни странно, Google иногда называет тесты, расположенные в androidTest, также как Unit Test. Зависит, конечно, от цели конкретного теста, но все же добавляет путаницы.
Лукас,
1
В основном это семантика, поэтому я бы не зацикливался на них. Многие тесты, написанные с помощью Roboelectric, возможно, являются интеграционными, а не модульными тестами. При этом основное различие между ними заключается в том, что «src / test» запускается на машине разработчиков в стандартной JVM, а «src / androidTest» упаковывается в APK и запускается на реальном устройстве (или эмуляторе).
Марк Виейра,
1
Я думаю, что поддержка src / test, которую вы видели раньше, была просто той, которая была доступна через стандартный плагин Gradle Java. Поэтому не было поддержки разновидностей или типов сборки. Теперь плагин Android полностью поддерживает модульные тесты, включая наборы исходных текстов модульных тестов для каждого варианта.
Марк Виейра
3

Чтобы ответить на ваш вопрос - используйте testCompile для робоэлектрика

почему, потому что robolectric работает на JVM, имитируя все поведение устройства Android.

testCompile и androidTestCompile - это "по соглашению" папки Android, которые Gradle использует при выполнении задач, предоставляемых плагином Android.

androidTestDebug выбирает тесты из папки androidTest, testDebug выбирает тесты из тестовой папки,

Опять же, это только условные папки, которые вы можете предоставить исходные наборы для этих конфигураций.

Примечание: эспрессо - такая классная библиотека, попробуйте отойти от робоэлектрика :)

Амит Кошик
источник
1

// модульное тестирование

testCompile 'junit:junit:4.12'

Приведенный выше код является зависимостью JUnit 4 в файле build.gradle в студии Android. Вы видите, что у него есть testCompile, потому что JUnit работает на JVM и не требует для запуска устройства или эмулятора. Это также означает, что тесты JUnit не требуют запуска контекста приложения, и, если они этого требуют, нам нужно будет их «ЗАМКЕТАТЬ».

// Интегрированное модульное тестирование

androidTestCompile('com.android.support.test:runner:0.5', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Теперь мы видим здесь androidTestCompile, потому что на этот раз мы намерены использовать устройство или эмулятор для тестов, то есть инструментального тестирования. Для лучшего разъяснения я предлагаю прочитать с сайта developer.android.com.

Lazycoder_007
источник
0

Чтобы добавить зависимость для тестирования JVM или модульного тестирования (тестирование основывается только на среде Java, нам не нужна среда Android).

Используем директиву testCompile. Пример:

dependencies {
    testCompile gradleTestKit()
}

Чтобы добавить тест Dependency for Instrumentation (тестирование в основном полагается на среду Android), мы используем androidTestCompileдирективу.

Субхасиш Натх
источник