Wednesday 23 May 2018

BAGAIMANA CARA MENGATUR LAPORAN CAKUPAN (COVERAGE) UNIFIED TEST DI ANDROID DENGAN JACOCO DAN SONARQUBE



Ini adalah terjemahan bahasa Indonesia dari artikel oleh Igor Torba dan Sergiy Grechukha yang diterbitkan di Komunitas Pengembang Ukraina.

Beberapa waktu yang lalu kami menghadapi tantangan untuk membuat laporan uji cakupan yang komprehensif untuk semua unit dan uji instrumentasi (uji-android) berjalan dalam proyek. Meskipun menyiapkan laporan cakupan terpisah untuk pengujian unit dan instrumentasi sama sekali tidak memiliki otak, membuat laporan terpadu adalah masalah yang membutuhkan pendekatan di luar kotak. Kami datang dengan solusi non-sepele yang akan saya jelaskan dalam artikel ini.

Untuk memberikan contoh yang lebih baik, kami membuat aplikasi Android dasar yang tujuannya adalah untuk membuat permintaan REST dengan klik tombol, menerima alamat IP kami sebagai respons dan menampilkannya di layar.

android unit testing


Untuk menyederhanakan pengujian, kami menggunakan pola model - tampilan - presenter (MVP) dan Ketergantungan Injeksi (DI) dengan Dagger 2 di aplikasi kami. Tata letak proyek terlihat sebagai berikut:
Screen Shot 2016-09-08 at 1.21.22 PM
REST API desain diimplementasikan dengan RX + Retrofit2 (kejutan, kejutan!); DI ditempatkan di Server API sehingga kami dapat lebih mudah menggantinya dalam pengujian UI di jalan.

Screen Shot 2016-09-08 at 1.27.37 PM


Jadi, setiap kali pengguna mengklik tombol "GET IP", aktivitas kami menggunakan metode presenter untuk mengeksekusi permintaan.
Screen Shot 2016-09-08 at 1.30.10 PM

Ketika presenter memiliki respons, ia memanggil metode panggilan balik masing-masing.
Screen Shot 2016-09-08 at 1.33.23 PM

Pada titik ini, beri perhatian Anda pada AppSchedulers kelas CSS kustom yang kami gunakan untuk RX. Tujuannya adalah untuk tumpang tindih asynchronous streams dengan stream sinkron selama proses pengujian.

Membuat kasus uji coba
Sekarang saatnya untuk menguji. Hanya untuk contoh yang lebih baik, kami membuat beberapa tes:
  • Tes unit;
  • Tes Espresso UI;
  • Tes robolectric

Tes Unit
Kami menggunakan Mockito untuk membuat objek tiruan:

Screen Shot 2016-09-08 at 1.42.38 PM

Tes Espresso UI
Di sini kami menggunakan aturan khusus untuk mengganti dataComponent untuk MockServerApi yang akan meniru Server kami dan tanggapannya.

Screen Shot 2016-09-08 at 1.46.59 PM

Tes robolectric
Kami menjalankan tes ini hanya sebagai tanda centang dan untuk memasukkan jenis tes ini ke proyek; sebenarnya, itu tidak memberikan nilai apapun untuk pengujian kami!

Screen Shot 2016-09-08 at 1.49.20 PM

Mengukur coverage tes
Sekarang ketika kita memiliki semua tes ini, kita dapat melanjutkan untuk mengukur coverage tes. Seperti disebutkan di atas, tidak ada Tombol Hijau ketika datang ke laporan coverage pengujian terpadu. Untuk membuat laporan terpadu, buka tes Unit Anda dan jalankan semuanya dengan coverage.

Screen Shot 2016-09-08 at 1.53.09 PM


Setelah semua tes dijalankan, Anda akan dapat melihat laporan cakupan:
unified test coverage report in Android


android test coverage report

Android-Test Coverage Report

Sekarang mari kita buat Laporan coverage (cakupan) Uji Android. Untuk tujuan ini kami harus "menyempurnakan" file gradle kami (saya akan tunjukkan nanti bagaimana) sebelum pindah ke gradle tab di Android Studio:

  • temukan tugas createDebugCoverageTest;
  • klik dua kali;
  • tunggu semua tes dijalankan

Catatan: Anda harus emulator tes Anda diluncurkan atau perangkat Android terhubung.

Saat Android Studio memberi tahu Anda bahwa semuanya baik-baik saja, Anda akan dapat menemukan laporan uji coba di “YOUR_PROJECT_PATH \ app \ build \ reports \ coverage \ debug \ index.html”:

Android gradle plugin

Menyatukan Laporan Uji Cakupan untuk Pengujian Unit- dan Android
Sekarang ketika kami memiliki uji coba unit-, android- dan robolectric, kami ingin menyatukannya untuk memahami apakah cakupan uji kami memenuhi persyaratan proyek serta menganalisis kualitas kode dengan lebih baik. Penyatuan dapat dicapai dengan dua alat - Jacoco dan SonarQube. Mari kita mengaturnya dalam file * .gradle terpisah (jacoco.gradle dan sonarqube.gradle) dan menghubungkannya di file build.gradle kami:

apply from: './fileName.gradle'

Juga perhatikan bahwa Anda perlu menambahkan beberapa baris ke aplikasi / build.gradle untuk mengaktifkan pengukuran pengukuran pengujian (saya sebutkan di atas ini, ingat?):

Screen Shot 2016-09-08 at 2.25.56 PM

Jacoco adalah plugin Java gratis yang memungkinkan pembuatan dasar laporan pengujian.
Screen Shot 2016-09-08 at 2.29.48 PM

Sekarang mari kita lihat ke dalam:
  • Tambahkan plugin Jacoco untuk gradle;
  • Instal versi Jacoco;
  • Buat tugas yang akan menjalankan tes dan menyatukan hasilnya

Deskripsi tugas secara singkat: sebut saja taskName, konfigurasikan jenis dan tugasnya yang akan bergantung pada (atau yang akan bergantung pada tugas ini), indikasikan grupnya dan berikan deskripsi.

Kemudian tentukan filter, yaitu daftar file yang dikecualikan dari analisis. Dalam kasus kami, ini adalah daftar file-file android yang dihasilkan, retrolambdas dan Dagger. Kami menyiapkan sourceDirectories dan classDirectories dan menambahkan fileFilter.

Dan sekarang bagian yang paling menarik datang - mari kita buat data eksekusi dari mana kami akan sumber data untuk penyatuan: uji laporan cakupan untuk tes Unit dihasilkan dalam file * .exec dan disimpan di: YOUR_PROJECT_PATH \ app \ build \ jacoco \ *. Exec

androidTest disimpan dalam file * .ec yang terletak di: YOUR_PROJECT_PATH \ app \ build \ outputs \ code-coverage \ connected \ **. ec

Pada titik ini kami dapat menghasilkan laporan terpadu. Untuk melakukan ini, buka konsol Anda dan masukkan perintah berikut:

./gradlew bersih createDebugCoverageReport jacocoTestReport

Urutan perintah sangat penting: android-tes pertama, unit-tes kedua (diaktifkan melalui testDebugUnitTests).

Dan hanya itu, kita sekarang dapat melihat laporan coverage tes komprehensif untuk android dan tes unit. Anda dapat menemukannya di: YOUR_PROJECT_PATH \ app \ build \ reports \ jacoco \ jacocoTestReport \ index.html

Meskipun semuanya tampak keren, satu fitur sangat membuat kami prihatin! Saya sudah memberi tahu Anda sebelum kami menambahkan tes Robotolectric ke cakupan uji kami, ingat? Sekarang adalah saat kemuliaan mereka! Ternyata bahwa jenis tes ini tidak termasuk dalam laporan liputan out-of-box! Namun, ada satu solusi: tambahkan baris berikut ke file app / build.gradle Anda:

Screen Shot 2016-09-08 at 2.49.46 PM

Sekarang kami sudah siap: kami memiliki laporan cakupan tes yang benar-benar penuh dan yang masih harus dilakukan adalah meluncurkan kembali tugas.

Namun, kami ingin melakukan lebih banyak dan melihat apakah kami dapat menyimpan seluruh analisis kode kami termasuk cakupan pengujian, gaya, kualitas, dll. Dalam satu hub. Kami memutuskan untuk memberi umpan laporan uji coba kami kepada sonarQube. Untuk mempersingkatnya, luncurkan sonarQube, pasang dan mulai server sonarQube. Setelah menginstal sonarQube, Anda sekarang dapat menambahkan sejumlah plugin yang tersedia untuk itu. Dalam kasus kami, kami menggunakan plugin berikut: Android, CheckStyle, FindBugs, Git, Java, XML. Anda juga dapat membuat aturan khusus untuk analisis kode Anda tergantung pada tujuan akhir dan preferensi Anda. Setelah Anda bersahabat dengan server sonarQube, Anda dapat kembali ke proyek Android Anda dan mengatur tugas sonarQube:

Screen Shot 2016-09-08 at 3.02.32 PM

Klarifikasi:

  • Tambahkan gradle plugin;
  • Tambahkan sonarQube-host ke ekstensi untuk kenyamanan;
  • Jelaskan pengaturan sonarQube (lihat contoh)


Dalam kasus kami, perhatikan pengaturan berikut:

  • sonar.java.test.binaries
  • sonar.java.binaries
  • sonar.tests
  • sonar.jacoco.reportPath
  • sonar.jacoco.itReportPath

Mari kita jalankan: ./gradlew clean createDebugCoverageReport jacocoTestReport sonarqube

Sekarang, masuklah ke server sonarQube Anda, temukan proyek Anda di sana dan analisis:

Screen Shot 2016-09-08 at 3.07.37 PM

Screen Shot 2016-09-08 at 3.08.01 PM

No comments:

Post a Comment