Bagaimana cara membuat pengujian di Android Studio?

109

Baru saja mengunduh Android Studio yang didasarkan pada Ide Intellij.

Bagaimana cara membuat pengujian?

Saya melihat ada opsi untuk membuat Test Module tetapi ini sepertinya tidak melakukan apa-apa, hanya buat proyek baru dengan src

Saya juga mencoba menekan tombol pintas CTRL + AlT + T yang memungkinkan untuk membuat tes unit pada kelas yang ada tetapi tampaknya ingin menempatkannya di proyek saat ini. Tentu saja ini tidak membantu dengan TDD

Apakah ada yang punya pengalaman di sini?

Martin
sumber
2
Saya juga sudah mencoba membuat proyek uji coba. Jika Anda melakukannya dengan alat baris perintah Android seperti yang Anda lakukan dengan proyek Eclipse, maka Anda mendapatkan kesalahan karena tidak dapat menemukan file AndroidManifest.xml. Sepertinya Google perlu memperbarui alat Android mereka untuk menangani proyek Grundle. Namun, saya baru dalam pengujian di Android jadi saya tidak dapat membantu Anda = (
Kage

Jawaban:

56

Jawaban ini untuk orang yang baru memulai pengujian Android. Saya akan memberikan dua contoh sederhana untuk membantu Anda melihat cara kerja pengujian. Jika Anda mengikuti selama 10 menit berikutnya, Anda akan siap untuk mulai menambahkan pengujian Anda ke aplikasi Anda sendiri. Saya pikir Anda akan terkejut betapa mudahnya itu. Saya pasti.

Pengantar Pengujian Android

Ada dua jenis tes yang akan Anda lakukan.

  • Tes unit lokal. Ini dijalankan secara lokal di JVM (Java Virtual Machine). Karena mereka lokal, mereka cepat. Anda dapat menggunakannya untuk menguji bagian-bagian kode Anda yang hanya membutuhkan Java dan bukan Android API. (Terkadang Anda dapat membuat objek API palsu untuk menguji lebih banyak hal secara lokal. Ini disebut mocking . ContextContohnya adalah tiruan .)
  • Tes terinstrumen. Pengujian ini dijalankan di perangkat nyata atau di emulator. Itu membuat mereka lebih lambat dari pengujian lokal. Namun, mereka lebih fleksibel karena Anda memiliki API Android lengkap yang tersedia untuk Anda.

Buat proyek baru dan Anda akan melihat folder default berikut.

masukkan deskripsi gambar di sini

Semuanya sudah ada dan menunggu Anda untuk membuat pengujian. Semuanya sudah diatur!

Cara membuat pengujian unit lokal

Buka ExampleUnitTestfile yang ditunjukkan pada gambar di atas. itu akan terlihat seperti ini:

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

Tekan panah hijau ganda untuk menjalankan semua tes atau panah hijau tunggal untuk menjalankan hanya satu. (Dalam hal ini hanya ada satu pengujian sehingga keduanya melakukan hal yang sama.)

masukkan deskripsi gambar di sini

Ini harus lulus (selama 2 + 2masih 4ketika Anda membaca jawaban ini). Selamat, Anda baru saja menjalankan tes pertama Anda!

Membuat tes Anda sendiri

Ayo tulis tes kita sendiri. Pertama tambahkan kelas ini ke proyek aplikasi utama Anda sehingga kami memiliki sesuatu untuk diuji:

public class MyClass {
    public int add(int a, int b) {
        return a + b;
    }
}

Sekarang ubah addition_isCorrect()metode di kelas pengujian menjadi seperti kode berikut (atau tambahkan saja metode lain dengan nama yang berbeda):

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        MyClass myClass = new MyClass();
        int result = myClass.add(2, 2);
        int expected = 4;
        assertEquals(expected, result);
    }
}

Jalankan lagi dan Anda akan melihatnya lulus. Selamat, Anda baru saja membuat tes pertama Anda sendiri! (Yah, kurasa secara teknis itu milikku, tapi, hei, cukup dekat. Apa milikku adalah milikmu.)

Cara membuat tes berinstrumen

Buka ExampleInstrumentedTestfile. itu akan terlihat seperti ini:

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.myapp", appContext.getPackageName());
    }
}

Tekan salah satu tombol hijau itu lagi.

masukkan deskripsi gambar di sini

Selama Anda memiliki perangkat nyata yang terhubung atau emulator sudah disiapkan, itu seharusnya sudah memulainya dan menjalankan aplikasi Anda. Selamat, Anda baru saja menjalankan pengujian berinstrumen pertama Anda!

Membuat tes Anda sendiri

Pengujian berinstrumen menggunakan Espresso untuk menjalankan pengujian. Ini seperti pengguna robot kecil Anda sendiri yang dapat menguji aplikasi Anda. Anda dapat memintanya untuk melakukan sesuatu seperti menekan tombol atau membaca properti TextView.

Anda dapat menulis instruksi bagaimana melakukan tes dengan tangan, tetapi karena kita baru memulai, mari gunakan fungsi rekam otomatis . Ini sangat sederhana.

Pertama tambahkan tombol ke UI Anda sehingga kami memiliki sesuatu untuk dikerjakan. Saya melakukan ini:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.myapp.MainActivity">

    <Button
        android:id="@+id/myButton"
        android:text="Click me"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</android.support.constraint.ConstraintLayout> 

Kemudian tekan Run> Record Espresso Test di menu.

masukkan deskripsi gambar di sini

Setelah dimulai, klik tombol di emulator lalu untuk menyelesaikan pilih OK pada dialog Record. Ini harus menghasilkan kode tes berikut secara otomatis.

@LargeTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void mainActivityTest() {
        ViewInteraction appCompatButton = onView(
                allOf(withId(R.id.myButton), withText("Click me"), isDisplayed()));
        appCompatButton.perform(click());
    }
}

Bagus! Anda baru saja membuat tes berinstrumen pertama Anda! Itu sangat mudah. Anda mungkin harus menambahkan pernyataan untuk membuatnya menjadi tes nyata, tetapi itu juga cukup mudah dilakukan dengan perekam. Tonton video ini untuk membahas lebih dalam.

Pelajaran lanjutan

Saya akan menonton videonya terlebih dahulu dan kemudian membaca dokumentasi. Itu semua sangat membantu. Tautan terakhir adalah serangkaian artikel yang membahas beberapa hal penting untuk dipikirkan saat memilih apa yang akan diuji.

Suragch
sumber
1
Jawaban bagus @Suragch. Pertanyaan singkat: di mana saya akan meletakkan file dukungan untuk kasus uji unit lokal? Ini hacky, tapi saya akan senang untuk meletakkan path lengkap dari dasar pengujian, tetapi jika saya menjalankan di Android Studio, pengujian dijalankan dari root_ /app, namun jika saya menjalankan dari baris perintah Gradle (atau CI) maka itu adalah _root . (Idealnya saya ingin mengakses assetsfolder tertentu saat dijalankan dengan cara apa pun).
mm2001
@ mm2001, saya menulis jawaban ini sebagai cara untuk mempelajari cara melakukan pengujian sendiri, jadi saya bahkan belum mencapai sejauh yang Anda miliki. Jika Anda mengetahui hal ini sebelum saya melakukannya, dapatkah Anda memberikan komentar?
Suragch
Saya menemukan ini berguna: stackoverflow.com/a/42751502/19506 - dikatakan buat folder test/resourcesdan letakkan file di sana, misalnya test.txtdan akses dengan getClass().getClassLoader().getResource("test.txt"). Saya telah memutuskan bahwa mengakses aset APK secara langsung kemungkinan merupakan ide yang buruk, jadi saya akan mengatasinya dengan menyalin file untuk diuji dalam langkah build, atau dalam proses pembaruan eksternal. Ada beberapa pertanyaan tersisa tentang berbagai versi Gradle, tetapi saya belum menghadapi itu.
mm2001
36

Sunting: Mulai 0.1.8, ini sekarang didukung di IDE . Harap ikuti petunjuk di sana, alih-alih menggunakan petunjuk di bawah ini.

Dengan mengikuti Panduan Pengguna Plugin Android Gradle, saya bisa mendapatkan pengujian yang bekerja pada baris perintah dengan melakukan langkah-langkah berikut pada proyek yang baru dibuat (saya menggunakan paket 'com.example.myapplication' default):

  1. Tambahkan direktori src / instrumentTest / java untuk pengujian
  2. Tambahkan kelas pengujian (memperluas ActivityTestCase) dalam paket com.example.myapplication.test
  3. Mulai perangkat virtual
  4. Pada baris perintah (di direktori MyApplicationProject / MyApplication) gunakan perintah '../gradlew connectedInstrumentTest'

Ini menjalankan pengujian saya dan menempatkan hasil pengujian di MyApplicationProject / MyApplication / build / reports / instrumentTests / connected. Saya baru dalam menguji aplikasi Android, tetapi tampaknya berfungsi dengan baik.

Dari dalam IDE, dimungkinkan untuk mencoba dan menjalankan kelas pengujian yang sama. Anda harus melakukannya

  1. Perbarui build.gradle untuk mencantumkan Maven Central sebagai repo
  2. Perbarui build.gradle, tambahkan JUnit 3.8 sebagai dependensi instrumentTestCompile, misalnya instrumentTestCompile 'junit: junit: 3.8'
  3. Dalam 'Struktur Proyek', pindahkan JUnit secara manual untuk menjadi yang pertama dalam urutan ketergantungan

Namun ini gagal (jalur kelas yang digunakan saat menjalankan pengujian kehilangan direktori keluaran pengujian). Namun, saya tidak yakin ini akan berhasil terlepas dari pemahaman saya bahwa diperlukan runner pengujian khusus Android.

Chris
sumber
20

Saya akan menyarankan untuk menggunakan file gradle.build .

  1. Tambahkan direktori src / androidTest / java untuk pengujian (Seperti yang mulai dijelaskan Chris )

  2. Buka file gradle.build dan tentukan di sana:

    android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                java.srcDirs = ['androidTest/java']
            }
        }
    }
  3. Tekan "Sinkronkan Proyek dengan file Gradle" (di panel atas). Anda akan melihat sekarang folder "java" (di dalam "androidTest") berwarna hijau.

  4. Sekarang Anda dapat membuat file uji apa pun dan menjalankannya.

Yuriy Chernyshov
sumber
Jangan lupa androidTest.setRoot ('instrumentTest')
IgorGanapolsky
3
Dalam versi Android Studio saat ini tidak perlu, terlebih lagi - ganti semua yang memiliki nama instrumentTest dengan androidTest
Yuriy Chernyshov
Nama 'instrumentTest' dan 'androidTest' benar-benar sewenang-wenang. Ini hanyalah nama direktori untuk proyek pengujian Anda. Anda juga dapat membuat direktori 'tes'. Selain itu, nama paket SDK dalam kerangka pengujian adalah android.test.InstrumentationTestCase. Jadi secara kanonik saya percaya 'instrumen' atau 'instrumentasi' masih masuk akal untuk menamai tes seseorang. Lihat kode sumber berikut: grepcode.com/file/repository.grepcode.com/java/ext/…
IgorGanapolsky
7
Silakan, baca dokumentasinya di sini: tools.android.com/tech-docs/new-build-system . Sejak versi 0.9.0 instrumentTest diubah namanya menjadi androidTest .
Yuriy Chernyshov
1
@IgorGanapolsky Penamaan folder sebagai androidTest TIDAK sembarangan. Ini harus dilakukan agar folder menjadi hijau.
tukang jam
12

Saya pikir posting oleh Rex St John ini sangat berguna untuk pengujian unit dengan studio android.


(sumber: rexstjohn.com )

Saeed Zarinfam
sumber
10

Android Studio v.2.3.3

Sorot konteks kode yang ingin Anda uji, dan gunakan hotkey: CTRL+ SHIFT+T

Gunakan antarmuka dialog untuk menyelesaikan pengaturan Anda.

Framework pengujian seharusnya mencerminkan tata letak paket project Anda untuk mendapatkan hasil terbaik, tetapi Anda dapat membuat pengujian kustom secara manual, asalkan Anda memiliki direktori dan setelan build yang benar.

Sistem Hypersoft
sumber
7

Untuk sekarang (studio 0.61) memelihara struktur proyek yang tepat sudah cukup. Tidak perlu membuat proyek uji terpisah seperti pada gerhana (lihat di bawah).

Tes struktur

Daber
sumber
4

Android Studio terus berkembang sehingga respons di atas pada akhirnya tidak akan berlaku lagi. Untuk versi Android Studio 1.2.1.1 saat ini, ada tutorial bagus tentang pengujian di:

http://evgenii.com/blog/testing-activity-in-android-studio-tutorial-part-1/

AndroidDev
sumber
2
Ya, AS terus berkembang, jadi agak konyol bagi seseorang untuk membuat artikel tentang teknologi mutakhir, dan tidak pernah menyebutkan nomor versi yang diterapkan. satu-satunya petunjuk adalah tanggal di bagian paling bawah.
Tom
3

Salah satu perubahan besar tampaknya adalah dengan Android Studio, aplikasi pengujian diintegrasikan ke dalam proyek aplikasi.

Saya tidak yakin apakah ini membantu masalah spesifik Anda, tetapi saya menemukan panduan untuk melakukan pengujian dengan proyek Gradle. Panduan pengguna Android Gradle

Kage
sumber
3

Cara termudah yang saya temukan adalah yang efisien dalam posting blog saya berikut ini :

  1. Buat folder tempat Anda akan menulis semua pengujian unit Anda (sebaiknya com.example.app.tests)
  2. Buat kelas pengujian baru (sebaiknya NameOfClassTestedTests, yaitu BankAccountLoginActivityTests)
  3. Perpanjang InstrumentationTestCase
  4. Tulis pengujian unit yang gagal untuk memastikan kami berhasil mengonfigurasi pengujian unit
  5. Perhatikan bahwa nama metode pengujian unit harus dimulai dengan kata "test" (sebaiknya testTestedMethodNameExpectedResult () yaitu testBankAccountValidationFailedShouldLogout ())
  6. Konfigurasikan proyek Anda untuk pengujian unit:
  7. Buka menu 'Jalankan ...' dan klik 'edit konfigurasi'
  8. Klik tombol +
  9. Pilih template Tes Android
  10. Masukkan nama untuk konfigurasi yang Anda jalankan (sebaiknya 'Tes AppName')
  11. Pilih aplikasi Anda di kotak kombo modul
  12. Pilih tombol radio "Paket Lengkap" (umumnya Anda ingin memilih opsi ini karena ini menjalankan semua pengujian unit di semua kelas pengujian Anda)
  13. Isi nama paket pengujian dari langkah 1 (yaitu com.example.app.tests)
  14. Pilih perangkat yang ingin Anda gunakan untuk menjalankan pengujian
  15. Terapkan dan simpan konfigurasi
  16. Jalankan pengujian unit (dan perkirakan kegagalan):
  17. Pilih konfigurasi Tes Anda yang baru dibuat dari menu Jalankan
  18. Klik Jalankan dan baca hasilnya di konsol keluaran

Semoga berhasil membuat kode Anda lebih mudah dibaca, dipelihara, dan diuji dengan baik!

nurnachman
sumber
Pertanyaannya adalah tentang uji instrumentasi! Saya juga kesulitan menulis beberapa tes instrumentasi. Lihat pertanyaan saya di stackoverflow.com/questions/35426990/…
Monica
2

Android Studio telah menjadi semacam target yang bergerak, pertama menjadi pratinjau pengembang dan sekarang dalam versi beta. Jalur untuk kelas Tes dalam proyek telah berubah selama waktu, tetapi apa pun versi AS yang Anda gunakan, jalur tersebut dinyatakan dalam file .iml Anda. Saat ini, dengan versi 0.8.3, Anda akan menemukan yang berikut ini di dalam file iml bagian dalam:

      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/groovy" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />

File .iml memberi tahu Anda di mana harus menempatkan kelas pengujian Anda.

Miguel El Merendero
sumber
0

Tambahkan di bawah lib di dalam file gradle

 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

Buat kelas HomeActivityTest di dalam direktori androidTest dan sebelum menjalankan pengujian, tambahkan string flurry_api_key dan sender_id di dalam file sumber daya string dan ubah nilai untuk kasus kegagalan dan keberhasilan.

@RunWith(AndroidJUnit4.class)
public class HomeActivityTest
{
    private static final String SENDER_ID = "abc";
    private static final String RELEASE_FLURRY_API_KEY = "xyz";

    @Test
    public void gcmRegistrationId_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(SENDER_ID, appContext.getString(R.string.sender_id));
    }

    @Test
    public void flurryApiKey_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(RELEASE_FLURRY_API_KEY, appContext.getString(R.string.flurry_api_key));
    }
}
Bishwajeet Biswas
sumber