Android Gradle'da testCompile ve androidTestCompile hakkında kafa karışıklığı


87

Dünyayı test etme konusunda yeniyim ve Android test dünyasında daha da fazlası. Robolectric üzerinde araştırma yaparken android üzerinde testlere yardımcı olan bir şey beni en çok şaşırtan şey. Bazen testCompileweb'de, başkaları kullanırken Robolectric'e atıfta bulunurken gradle oluşturma komut dosyasının bağımlılıklarında anahtar kelime kullanan kişileri görüyorum androidTestCompile. Kesinlikle ikisi de geçerli olamaz?

Robolectric'i kullanırken ikisi arasındaki farkı ve bunlardan hangisinin kullanılması gerektiğini birisi açıklayabilir mi?

Yanıtlar:


120

Bunun için testCompilebirim testler için yapılandırma (o bulunan bir src / test ) ve androidTestCompile(bulunan bu test API için kullanılan src / androidTest ). Birim testleri yazmak istediğiniz için kullanmalısınız testCompile.

Güncelleme: İkisi arasındaki temel ayrım, testkaynak kümesinin normal bir Java JVM'de çalışmasıdır, oysa androidTestkaynak kümesi testleri bir Android cihazda (veya bir emülatörde) çalışır.


Teşekkürler. İlk başta düşündüğüm buydu, ancak bu durumda neden bazı robolektrik bağımlılığı testCompile ile ve bazılarını androidTestCompile ile referans alıyor. Bu, entegrasyon testleri yazmaya yardımcı olan bir kitaplık değil mi? Öyleyse, androidTestCompile ile referans verilmemeli mi? Ancak robolectric'in resmi kılavuzu bile testCompile'ı kullanmaya yönlendiriyor ... Üzgünüm ama gördüğünüz gibi bu noktada benim için çok kafa karıştırıcı.
Lucas

3
Adlandırma kuralları biraz garip. Temel olarak, birim testleri (cihazda çalıştırılmayacak testler) yazıyorsanız, bunlar 'src / test' içinde var olur ve bu nedenle bunların bağımlılıkları testCompileyapılandırmaya aittir . androidTestCompileYapılandırmaya eklenen bağımlılıklar , gerçekte bir APK'de yerleşik olan ve bir cihaza dağıtılan "src / androidTest" içindeki kaynakta mevcut olacaktır.
Mark Vieira

Beni bir yöne yönlendirdiğiniz için teşekkürler. Tüm sorularıma cevap vermedi ama araştırmam sırasında bana yardımcı oldu. Söylediklerinizi açıklığa kavuşturmak için, Birim Testleri yalnızca test klasöründekiler değildir (varsayılan olarak). İronik olarak google bazen androidTest'te bulunan testleri Unit Test olarak da çağırır. Elbette belirli bir testin amacına bağlıdır, ancak yine de kafa karışıklığına katkıda bulunur.
Lucas

1
Bu esas olarak anlambilim, bu yüzden onlara takılıp kalmam. Roboelectric ile yazılan birçok test tartışmalı olarak entegrasyon testleridir ve zaten birim testleri değildir. Bununla birlikte, ikisi arasındaki temel ayrım, 'src / test'in standart bir JVM'de geliştiriciler makinesinde çalışması ve' src / androidTest'in bir APK içinde paketlenmesi ve gerçek bir cihazda (veya emülatörde) çalıştırılmasıdır.
Mark Vieira

1
Sanırım daha önce gördüğünüz 'src / test' desteği, standart Gradle Java eklentisi aracılığıyla sağlanandan ibaretti. Bu nedenle, tatlar veya türler oluşturmaya yönelik destek yoktu. Artık Android eklentisi, varyant başına birim test kaynak kümelerini dahil etmek için birim testleri için tam desteğe sahip.
Mark Vieira

3

Sorunuzu cevaplamak için - robolectric için testCompile kullanın

neden, çünkü robolectric JVM üzerinde tüm android cihaz davranışlarını alay ederek çalışıyor.

testCompile ve androidTestCompile, android eklentisi tarafından sağlanan görevleri çalıştırırken gradle'ın kullandığı "geleneksel" android klasörleridir.

androidTestDebug, androidTest klasöründen testleri seçer, testDebug testleri test klasöründen alır,

Yine bunlar, yalnızca bu yapılandırmalar için kaynak kümeleri verebileceğiniz kural klasörleridir.

Not: espresso harika bir kitaplık robolectric'ten uzaklaşmaya çalışın :)


1

// birim testi

testCompile 'junit:junit:4.12'

Yukarıdaki kod, android stüdyosundaki build.gradle dosyasındaki JUnit 4'ün bağımlılığıdır. TestCompile'a sahip olduğunu görüyorsunuz, çünkü JUnit JVM üzerinde çalışıyor ve çalıştırmak için bir cihaz veya emülatör gerektirmiyor. Bu aynı zamanda JUnit testlerinin uygulama bağlamının çalışmasını gerektirmeyeceği ve eğer gerekliyse bunları "MOCK" yapmamız gerektiği anlamına gelir.

// Insturmented Unit Testing

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

Şimdi burada androidTestCompile'ı görüyoruz, çünkü bu sefer testler için cihazı veya emülatörü kullanmayı planlıyoruz, yani Enstrümantasyon testi. Daha iyi açıklama için developer.android.com adresinden okumanızı öneririm.


0

JVM testi veya Birim testi için Bağımlılık eklemek için (yalnızca java ortamına bağlı olanları test etmek için herhangi bir android ortamına ihtiyacımız yoktur).

TestCompile yönergesini kullanıyoruz. Misal:

dependencies {
    testCompile gradleTestKit()
}

Enstrümantasyon testi için Bağımlılık eklemek için (Bu testler çoğunlukla Android ortamına dayanır), androidTestCompileyönergeyi kullanıyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.