Bingung tentang testCompile dan androidTestCompile di Android Gradle

87

Saya baru mengenal dunia pengujian dan bahkan lebih dalam dunia pengujian Android. Saat melakukan penelitian tentang Robolectric yang membantu pengujian pada android, ada satu hal yang paling membingungkan saya. Terkadang di web saya melihat orang-orang menggunakan testCompilekata kunci dalam ketergantungan skrip build gradle saat mereferensikan Robolectric sementara yang lain menggunakan androidTestCompile. Tentu keduanya tidak bisa valid?

Adakah yang bisa menjelaskan perbedaan antara keduanya dan mana yang harus digunakan saat menggunakan Robolectric?

Lucas
sumber

Jawaban:

120

Sederhananya testCompileadalah konfigurasi untuk pengujian unit (yang terletak di src / test ) dan androidTestCompiledigunakan untuk api pengujian (yang terletak di src / androidTest ). Karena Anda bermaksud menulis pengujian unit, Anda harus menggunakan testCompile.

Update: Perbedaan utama antara keduanya adalah testkumpulan sumber berjalan di Java JVM biasa, sedangkan androidTestpengujian kumpulan sumber dijalankan di perangkat Android (atau emulator).

Mark Vieira
sumber
Terima kasih. Itulah yang saya pikirkan pada awalnya, tetapi jika itu masalahnya mengapa beberapa referensi ketergantungan robolectric dengan testCompile dan beberapa dengan androidTestCompile. Bukankah itu perpustakaan yang membantu menulis tes integrasi? Jika demikian, bukankah seharusnya itu direferensikan dengan androidTestCompile? Namun bahkan panduan resmi robolectric mengarahkan untuk menggunakan testCompile ... Maaf tapi itu terlalu membingungkan saya pada saat ini seperti yang Anda lihat.
Lucas
3
Konvensi penamaan agak aneh. Pada dasarnya, jika Anda menulis pengujian unit (pengujian yang tidak akan dijalankan pada perangkat) maka pengujian tersebut akan ada di 'src / test' dan oleh karena itu dependensinya termasuk dalam testCompilekonfigurasi. Dependensi yang ditambahkan ke androidTestCompilekonfigurasi hanya akan tersedia ke sumber di 'src / androidTest', yang sebenarnya dibuat ke dalam APK dan diterapkan pada perangkat.
Mark Vieira
Terima kasih telah mengarahkan saya ke beberapa arah. Itu tidak menjawab semua pertanyaan saya tetapi membantu saya selama penelitian saya. Hanya untuk memperjelas apa yang Anda katakan, Tes Unit tidak hanya yang ada di folder tes (secara default). Ironisnya, google menyebut terkadang pengujian yang terletak di androidTest juga sebagai Unit Test. Tentu saja tergantung pada tujuan tes tertentu, tetapi masih menambah kebingungan.
Lucas
1
Ini sebagian besar adalah semantik, jadi saya tidak akan terpaku pada mereka. Banyak pengujian yang ditulis dengan Roboelectric yang bisa dibilang merupakan pengujian integrasi, dan bukan pengujian unit. Meskipun demikian, perbedaan utama antara keduanya adalah bahwa 'src / test' berjalan pada mesin developer dalam JVM standar dan 'src / androidTest' dikemas dalam APK dan dijalankan pada perangkat (atau emulator) sebenarnya.
Mark Vieira
1
Saya pikir dukungan untuk 'src / test' yang Anda lihat sebelumnya hanyalah yang tersedia melalui plugin Java Gradle standar. Oleh karena itu, tidak ada dukungan untuk build flavours atau type. Sekarang plugin Android memiliki dukungan penuh untuk pengujian unit, untuk menyertakan kumpulan sumber pengujian unit per varian.
Mark Vieira
3

Untuk menjawab pertanyaan Anda - Gunakan testCompile untuk robolectric

mengapa, karena robolectric berjalan di JVM yang meniru semua perilaku perangkat android.

testCompile dan androidTestCompile adalah folder android "berdasarkan konvensi" yang digunakan gradle saat menjalankan tugas yang disediakan oleh plugin android.

androidTestDebug mengambil pengujian dari folder androidTest, testDebug mengambil pengujian dari folder pengujian,

Sekali lagi ini hanya dengan folder konvensi Anda dapat memberikan kumpulan sumber untuk konfigurasi ini

Catatan: espresso adalah perpustakaan yang luar biasa yang mencoba menjauh dari robolectric :)

Amit Kaushik
sumber
1

// pengujian unit

testCompile 'junit:junit:4.12'

Kode di atas merupakan dependensi JUnit 4 dalam file build.gradle di android studio. Anda melihat bahwa ia memiliki testCompile, karena JUnit berjalan di JVM dan tidak memerlukan perangkat atau emulator untuk dijalankan. Itu juga berarti bahwa pengujian JUnit tidak akan memerlukan konteks aplikasi untuk dijalankan dan jika diperlukan, kami perlu "MENGEJAR" mereka.

// Pengujian Unit Insturmented

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

Sekarang kita lihat androidTestCompile disini, karena kali ini kita bermaksud menggunakan device atau emulator untuk test, yaitu Instrumentation testing. Untuk klarifikasi yang lebih baik saya sarankan untuk membaca dari developer.android.com

Lazycoder_007
sumber
0

Untuk menambahkan Dependensi untuk pengujian JVM atau pengujian Unit (pengujian yang hanya mengandalkan lingkungan java, kami tidak memerlukan lingkungan android).

Kami Menggunakan direktif testCompile. Contoh:

dependencies {
    testCompile gradleTestKit()
}

Untuk menambahkan Dependensi untuk uji Instrumentasi (Pengujian tersebut terutama bergantung pada lingkungan Android), kami menggunakan androidTestCompiledirektif.

Subhasish Nath
sumber