Запутался в testCompile и androidTestCompile в Android Gradle

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

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


person Lucas    schedule 12.03.2015    source источник


Ответы (4)


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

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

person Mark Vieira    schedule 13.03.2015
comment
Спасибо. Это то, что я понял сначала, но если это так, то почему некоторые ссылки на robolectric зависимость с testCompile и некоторые с androidTestCompile. Разве это не библиотека, которая помогает писать интеграционные тесты? Если да, то не следует ли на него ссылаться с помощью androidTestCompile? Однако даже официальное руководство robolectric предписывает использовать testCompile... Извините, но на данный момент это слишком запутывает меня, как вы можете видеть. - person Lucas; 13.03.2015
comment
Соглашения об именах немного странные. По сути, если вы пишете модульные тесты (тесты, которые не будут запускаться на устройстве), то они будут существовать в «src/test», и поэтому их зависимости принадлежат конфигурации testCompile. Зависимости, добавленные в конфигурацию androidTestCompile, будут доступны только для источника в src/androidTest, который на самом деле встроен в APK и развернут на устройстве. - person Mark Vieira; 13.03.2015
comment
Спасибо, что указали мне какое-то направление. Он не ответил на все мои вопросы, но помог мне во время моего исследования. Просто чтобы уточнить, что вы сказали, модульные тесты - это не только тестовые папки (по умолчанию). По иронии судьбы Google иногда называет тесты, расположенные в androidTest, также как модульные тесты. Зависит, конечно, от цели конкретного теста, но все же добавляет путаницы. - person Lucas; 15.03.2015
comment
В основном это семантика, поэтому я бы не стал на них зацикливаться. Многие тесты, написанные с помощью Roboelectric, возможно, являются интеграционными тестами, а не модульными тестами. При этом основное различие между ними заключается в том, что «src/test» запускается на машине разработчика в стандартной JVM, а «src/androidTest» упакован в APK и запускается на реальном устройстве (или эмуляторе). - person Mark Vieira; 15.03.2015
comment
Большое спасибо. Да, тот факт, что один работает на JVM, а другой на эмуляторе или устройстве, является фактическим различием. Можете ли вы сказать мне, пока мы на этом, что изменилось, когда Google добавил экспериментальный junit с выпуском AS 1.1.0? Я спрашиваю, потому что еще до того, как была тестовая конфигурация и конфигурация androidTest, вы могли добавить зависимости к обоим, построенным задачам gradle как для интеграционных тестов, так и для модульных тестов (compileDebugTestJava), которые вы могли запускать с тестовой задачей. Не могли бы вы объяснить, что Really изменилось в этом отношении с введением экспериментальных модульных тестов по сравнению с тем, что было раньше? - person Lucas; 15.03.2015
comment
Я думаю, что поддержка «src/test», которую вы видели раньше, была просто доступна через стандартный плагин Gradle Java. Поэтому не было поддержки разновидностей или типов сборки. Теперь плагин для Android полностью поддерживает модульные тесты, включая наборы исходных кодов модульных тестов для каждого варианта. - person Mark Vieira; 15.03.2015
comment
Я бы немного отредактировал ответ, так как androidTestCompile также используется с Robolectric. Цель состоит в том, чтобы позволить писать код тестов Robolectric в Android Studio. Это был обходной путь до версии плагина android gradle 1.1. - person Eugen Martynov; 16.03.2015
comment
Как добавить оператор androidTestCompile в файл Android.mk? Не могли бы вы помочь мне с этим? - person Ambi; 08.08.2016

Чтобы ответить на ваш вопрос, используйте testCompile для robolectric.

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

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

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

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

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

person Amit Kaushik    schedule 04.11.2016

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

testCompile 'junit:junit:4.12'

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

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

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

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

person Lazycoder_007    schedule 07.07.2017

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

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

dependencies {
    testCompile gradleTestKit()
}

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

person Subhasish Nath    schedule 23.10.2018