Объркан относно 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 sourceset се изпълнява в обикновена Java JVM, докато androidTest sourceset тестовете се изпълняват на устройство с 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
Благодаря, че ме насочи към някаква посока. Не отговори на всичките ми въпроси, но ми помогна по време на моето проучване. Само за да изясня какво казахте, Unit Tests не са само тези в тестовата папка (по подразбиране). По ирония на съдбата google понякога нарича тестовете, намиращи се в androidTest, също като Unit Test. Зависи, разбира се, от целта на конкретния тест, но все още допринася за объркването. - 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), които можете да стартирате с тестова задача. Бихте ли обяснили какво наистина се е променило в това отношение с въвеждането на експериментални единични тестове спрямо предишното? - person Lucas; 15.03.2015
comment
Мисля, че поддръжката за 'src/test', която видяхте преди, беше просто тази, която беше достъпна чрез стандартния Java плъгин Gradle. Поради това нямаше поддръжка за разновидности или типове на компилация. Сега приставката за 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 studio. Виждате, че има testCompile, тъй като JUnit работи на JVM и не изисква устройство или емулатор за работа. Това също така означава, че тестовете на JUnit няма да изискват контекста на приложението, за да се изпълняват и ако изискват, ще трябва да ги „подиграваме“.

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

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()
}

За да добавим зависимост за тестване на инструментариума (Тези тестове разчитат главно на среда на Android), използваме директивата androidTestCompile.

person Subhasish Nath    schedule 23.10.2018