Cara menguji Proyek Perpustakaan Android

97

Saya menulis Proyek Perpustakaan Android berdasarkan kelas Bitmap Android (sebut saja AndroindLib) yang hanya berisi kelas utilitas (tidak ada aktivitas). Saya mencoba mengujinya menggunakan Android JUnit, tetapi terus mengeluh bahwa tidak dapat menemukan AnroidLib.apk

Apa cara yang benar untuk menguji Unit Proyek Perpustakaan Android?

Bunga bakung
sumber
1
Atau ( peringatan steker tak tahu malu ) Anda bisa menggunakan proyek yang saya buat: Android Library Test Harness (yang saya sebut "Alt H"). Ini tersedia sebagai git repo: gitorious.org/alth Proyek ini masih dalam pengembangan dan dokumentasinya agak jarang jadi jangan ragu untuk menghubungi saya jika Anda memiliki pertanyaan.
i41

Jawaban:

75

Mengutip dokumentasi :

"Ada dua cara yang disarankan untuk menyiapkan pengujian pada kode dan sumber daya dalam proyek perpustakaan:

  • Anda dapat menyiapkan proyek uji yang melengkapi proyek aplikasi yang bergantung pada proyek perpustakaan. Anda kemudian dapat menambahkan pengujian ke proyek untuk fitur khusus pustaka.

  • Anda dapat menyiapkan proyek aplikasi standar yang bergantung pada pustaka dan meletakkan instrumentasi dalam proyek itu. Ini memungkinkan Anda membuat proyek mandiri yang berisi tes / instrumentasi dan kode untuk diuji. "

CommonsWare
sumber
27
jadi pada dasarnya yang harus Anda lakukan adalah menambahkan pustaka ke proyek pengujian Anda dan menguji proyek pengujian.
njzk2
Tautan tidak lagi valid, adakah kemungkinan Anda dapat mengarahkan kami ke tautan saat ini?
Abdullah Jibaly
4
Tidak yakin apakah ada orang lain yang berhasil dengan rekomendasi ini, tetapi saya belum. Mencoba solusi kedua terlebih dahulu dan ketika saya mencoba menjalankan di Eclipse, saya mendapatkan yang berikut: <ProjectName> tidak menetapkan instrumentasi android.test.InstrumentationTestRunner atau tidak mendeklarasikan using-library android.test.runner dalam AndroidManifest.xml-nya. Ini terlepas dari fakta bahwa saya menambahkan elemen instrumentasi dan pustaka penggunaan ke Manifest saya.
Bellinghammer
2
Punya cara kedua (dan cara kerja yang disukai). Sangat penting bagi Anda untuk mendapatkan pustaka penggunaan dan elemen instrumentasi di lokasi yang benar dalam manifes Anda. Elemen instrumentasi adalah turunan dari elemen manifes root dan elemen pustaka penggunaan adalah turunan dari elemen aplikasi. Saya meletakkan pustaka penggunaan di bawah elemen manifes dan berakhir dengan pesan kesalahan di atas ketika mencoba menjalankan tes.
Bellinghammer
17

Dalam proyek pengujian Anda, cukup ubah nama paket sehingga sama dengan paket perpustakaan Anda. Misalnya, Anda memiliki pustaka yang paketnya adalah "com.example.lib". Buat proyek uji yang menargetkan perpustakaan Anda. Dalam file manifes Anda akan melihat package="com.example.lib.test", dan targetPackage="com.example.lib". Ubah saja paket dari "com.example.lib.test" menjadi "com.example.lib" ( targetPackagebiarkan apa adanya).

Selain itu, pastikan library tersebut direferensikan ke project pengujian Anda BUKAN di jalur build Java, tetapi seperti library Android biasa: di Eclipse, library harus ditampilkan sebagai library di Project->Properties->Androidtab, bukan di Project->Properties->Java Build Pathtab.

Kemudian jalankan tes Anda.

alexaschka
sumber
Ide-ide Anda masuk akal bagi saya, sehingga pengujian menargetkan dirinya sendiri (sebagai aplikasi) dan aplikasi tersebut ditautkan dengan perpustakaan .... tetapi saya tidak dapat membuatnya bekerja melalui ant build atau IntelliJ .... sebagai .apk (diharapkan untuk aplikasi yang sedang diuji) tidak ada saat mencoba memasangnya, karena sedang dikompilasi ke "test / bin /.- debug.apk"
Andrew Mackenzie
Saya membuatnya berfungsi dengan hanya mengubah nama paket proyek uji dalam manifesnya (dan paket yang diuji - yang seharusnya sama) menjadi TIDAK bertepatan dengan nama paket proyek perpustakaan, ditambah menghapus referensi ke uji target proyek di file ant.properties.
Andrew Mackenzie
1
Saya pikir ini adalah jawaban yang lebih baik daripada yang diterima, yang hanya menggemakan dokumentasi - IMHO.
Andrew Mackenzie
5

Sesuai dokumentasi :

Menguji modul perpustakaan sama dengan menguji aplikasi. Perbedaan utamanya adalah library dan dependensinya otomatis disertakan sebagai dependensi APK pengujian. Artinya, APK pengujian tidak hanya menyertakan kodenya sendiri, tetapi juga AAR library dan semua dependensinya. Karena tidak ada "aplikasi dalam pengujian" terpisah, tugas androidTest hanya menginstal (dan mencopot pemasangan) APK pengujian. Saat menggabungkan beberapa file manifes, Gradle mengikuti urutan prioritas default dan menggabungkan manifes library ke dalam manifes utama APK pengujian.

Avilio
sumber
tugas mana untuk menjalankan tes? gradle test, atau gradle androidTest? androidTest bukanlah tugas.
Hari
tetapi alat seperti Firebase Test Lab membutuhkan APK atau AAB dan tidak menerima file AAR yang merupakan output dari tugas assemble perpustakaan
Mustafa Berkay Mutlu
1

CATATAN: Solusi ini didasarkan pada penggunaan Eclipse Indigo (3.8.2) dan mungkin harus diimplementasikan sedikit berbeda untuk IDE lain meskipun prinsip dasarnya akan sama.

Saya memiliki masalah serupa dan saya menemukan bahwa melakukan hal berikut selalu berhasil:

( CATATAN: Petunjuk ini adalah untuk membangun grup proyek baru dari awal. Jika Anda telah membangun bagian-bagian dari grup proyek, Anda mungkin harus memodifikasi proyek Anda agar terhubung dengan cara yang sama. )

  1. Buat proyek Perpustakaan Android baru dengan mencentang kotak "Is Library" selama pembuatan. (misalnya, proyek Android bernama "RemingtonAndroidTools").
  2. Bangun proyek Perpustakaan Android dan verifikasi bahwa itu membuat file jar di folder bin. (misalnya file jar bernama "RemingtonAndroidTools.jar".)
  3. Buat Proyek Android kosong untuk menguji aplikasi Android yang akan berfungsi sebagai Aplikasi Pengujian Android. (Misalnya, proyek Android bernama "RemingtonAndroidToolsTestApp"). Anda tidak perlu mengubah kode sumber atau sumber daya dari proyek Aplikasi Pengujian Android kecuali Anda memiliki sesuatu yang harus ditambahkan untuk pengujian. Banyak hal yang dapat diuji tanpa modifikasi apa pun pada Proyek Aplikasi Uji Android. Proyek Android Test App adalah jembatan antara proyek Perpustakaan Android Anda dan proyek Android Junit yang memungkinkan pengujian proyek Perpustakaan Android melalui Android Junit.
  4. Buka tab Library di Java Build Path untuk project Android Test App ("RemingtonAndroidToolsTestApp" dalam contoh ini).
  5. Tambahkan file jar ("RemingtonAndroidTools.jar" dalam contoh ini) dari Proyek Perpustakaan Android ("RemingtonAndroidTools" dalam contoh ini) melalui tombol "Tambahkan Jars ...".
  6. Buat project Android Test baru (misalnya "RemingtonAndroidToolsTester") yang akan berfungsi sebagai Penguji Library Android dan pilih project Android Test App ("RemingtonAndroidToolsTestApp" dalam contoh ini) sebagai target.
  7. Buka tab Library di Java Build Path untuk project Android Library Tester ("RemingtonAndroidToolsTester" dalam contoh ini).
  8. Tambahkan file jar ("RemingtonAndroidTools.jar" dalam contoh ini) dari Proyek Perpustakaan Android ("RemingtonAndroidTools" dalam contoh ini) melalui tombol "Tambahkan Jars ...".
  9. Temukan folder terakhir paket Android Anda di proyek Android Library Tester (misalnya "danny.remington.remington_android_tools_test_app.test") dan tambahkan kelas pengujian (misalnya "MainActivityTest") yang diturunkan dari ActivityInstrumentationTestCase2.
  10. Edit kelas pengujian ("TestActivityTest" dalam contoh ini) untuk menggunakan aktivitas (misalnya "TestActivity") dari Android Test App ("RemingtonAndroidToolsTestApp" dalam contoh ini) sebagai parameter untuk ActivityInstrumentationTestCase2.
  11. Edit kelas pengujian ("TestActivityTest" dalam contoh ini) dan buat konstruktor default yang membuat panggilan ke super (Class) dan meneruskan kelas Aplikasi Android Test ("TestActivity.class" misalnya).

Anda akan mendapatkan tiga proyek (Perpustakaan Android, Aplikasi Tes Android, Penguji Perpustakaan Android) yang terlihat seperti ini:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Anda harus berakhir dengan kelas untuk menguji Perpustakaan Android Anda yang terlihat seperti ini:

package danny.remington.remington_android_tools_test_app.test;

import android.test.ActivityInstrumentationTestCase2;
import danny.remington.remington_android_tools_test_app.TestActivity;

/**
 * 
 */
public class TestActivityTest extends
      ActivityInstrumentationTestCase2<TestActivity> {

   public TestActivityTest() {
      super(TestActivity.class);
   }

}

Anda kemudian dapat menambahkan tes apa pun yang Anda inginkan. Anda tidak perlu merujuk Aplikasi Pengujian Android ("RemingtonAndroidToolsTestApp" dalam contoh ini) lebih lanjut untuk menjalankan pengujian Anda kecuali pengujian tersebut memerlukan akses ke komponen khusus Android (seperti folder Assets, misalnya). Jika Anda perlu mengakses komponen khusus Android, Anda dapat melakukannya dengan memodifikasi Aplikasi Pengujian Android ("RemingtonAndroidToolsTestApp" dalam contoh ini) dan kemudian mereferensikannya melalui instrumentasi yang disediakan oleh Android Junit API standar. (Anda dapat membaca lebih lanjut tentang itu di sini: http://developer.android.com/tools/testing/testing_android.html )

Danny Remington - OMS
sumber
0

Jika kelas ulitiy Anda tidak bergantung pada kode khusus Android, Anda cukup menggunakan pengujian unit JUnit standar. Tidak perlu menggunakan versi Android.

Cheryl Simon
sumber
2
Ini tidak berfungsi karena JUnit standar dikompilasi ke JVM standar sementara file java Android dikompilasi ke VM Dalvik.
Danny Remington - OMS