Di android kita biasa melakukan unit test ataupun instrumented (UI) test. Kita bisa melakukan testing sesaat setelah kita melakukan commit dan push code kita melalui git, semua secara otomatis, tanpa kita perlu menjalankan tes secara manual, bagaimana caranya?
Peringatan! Artikel ini hanya akan berfokus pada integrasi CI dan Firebase Test Lab. Untuk membuat Instrumented Test kalian bisa dapatkan banyak contoh di internet.
Firebase Test Lab
Salah satu tool dari firebase yang akan membantu kita menjalankan tes ini adalah Firebase Test Lab. Kita bisa menjalankan Robo Test dan Instrumented Test ke virtual devices maupun physical device yang tersedia. Lebih lanjut tentang Firebase Test Lab bisa dibaca disini.
Gitlab Continuous Integration
Kenapa pakai Gitlab CI? Jawawbannya simpel, karena saya belum coba pakai CI yang lain, Hahahaha. Gitlab CI ini cukup mudah di setup juga, jadi saya lebih suka pakai ini, gratis pula. Tutorial untuk setup Gitlab CI juga bisa kalian banyak temukan di internet.
Go Automation!
Oke, disini saya asumsikan kita sudah mempunyai repo project android di Gitlab, dan kita sudah pernah menggunakan Gitlab CI, minimal menggunakannya untuk build apk versi debug.
Pada file .gitlab-ci.yml
, saya menggunakan image docker milik jangrewe, karena dengan image ini kita tidak perlu melakukan setup lagi pada Android SDK. Untuk initial setup bisa ikuti intruksi yang ada di reponya. Sehingga secara default isi dari configurasi CI kita untuk melakukan build apk debug adalah seperti dibawah ini.
image: jangrewe/gitlab-ci-android
stages:
- build
before_script:
- export GRADLE_USER_HOME=$(pwd)/.gradle
- chmod +x ./gradlew
cache:
key: ${CI_PROJECT_ID}
paths:
- .gradle/
build_dev_debug:
stage: build
script:
- ./gradlew assembleDevDebug
only:
- dev
artifacts:
paths:
- app/build/outputs/
Disini saya juga asumsikan kita telah membuat project di Firebase dan sudah men-setup nya ke project android. Kita perlu mengaktifkan beberapa API dari Developer Console, diantaranya yaitu Google Cloud Testing API, Cloud Tool Results API, dan Google Cloud Storage JSON API. Pastikan project yang dipilih sudah sesuai.
Buat Service Account, ini digunakan untuk merepresentasikan identitas kita atau program yang akan menggunakan layanan Google Cloud. Service Account dapat dibuat dari menu Firebase Console -> Project Settings -> Service accounts -> Manage all service accounts
. Jangan lupa gunakan Role Editor.
Pada Service Account yang sudah kita buat, pilih option -> Create Key
, dan pilih format JSON.
Sebuah file berformat json akan terdownload, kita akan menggunakan isi dari file ini sebagai identitas untuk mengeksekusi Firebase Test Lab. Caranya, kita buka pengaturan CI repo di Gitlab (Settings -> CI / CD
), Expand Variables
, buat variabel baru dengan nama SERVICE_ACCOUNT
, untuk valuenya, copy-paste seluruh isi dari file json yang telah terdownload sebelumnya, kemudian simpan perubahannya.
Jika kalian membuka file json yang terdownload itu, akan ada value dari project_id
, buat sebuah variabel di CI/CD Gitlab lagi dengan nama PROJECT_ID
, isikan dengan value dari project_id
dari file json tersebut.
Kembali ke file .gitlab-ci.yml
, kita akan mengupdate beberapa scriptnya.
Pada job build_dev_debug
, tambahkan script untuk generate file APK yang nantinya digunakan untuk menjalankan Instrumented test. Perlu dicatat, untuk melakukan Instrumented test diperlukan dua buah file APK, satu adalah APK versi debug biasa, dan satunya APK untuk menjalankan testnya.
./gradlew assembleDevDebugAndroidTest
Syntax script ini bisa bervariasi, tergantung setup productFlavors
dan buildTypes
yang kalian gunakan. Pada kasus ini saya menggunakan productFlavors
dev
dan buildTypes
debug
.
Catatan: kalian bisa menggunakan
assembleAndroidTest
untuk generate apk di semua build variant.
Selanjutnya kita buat job baru dengan stage test dengan nama instrumentation_test_dev_debug
.
instrumentation_test_dev_debug:
stage: test
only:
- dev
before_script:
# Preparing wget
- apt-get update
- apt-get upgrade -y
- apt install python2.7 python-pip -y
- apt-get install wget
# Install Google Cloud SDK
- wget --quiet --output-document=/tmp/google-cloud-sdk.tar.gz https://dl.google.com/dl/cloudsdk/channels/rapid/google-cloud-sdk.tar.gz
- mkdir -p /opt
- tar zxf /tmp/google-cloud-sdk.tar.gz --directory /opt
- /opt/google-cloud-sdk/install.sh --quiet
- source /opt/google-cloud-sdk/path.bash.inc
# Setup and configure the project
- gcloud components update
- gcloud config set project $PROJECT_ID
# Activate cloud credentials
- echo $SERVICE_ACCOUNT > /tmp/service-account.json
- gcloud auth activate-service-account --key-file /tmp/service-account.json
script:
# copy file to root and rename it for easier access
- cp app/build/outputs/apk/dev/debug/app-dev-debug.apk ./app.apk
- cp app/build/outputs/apk/androidTest/dev/debug/app-dev-debug-androidTest.apk ./app-test.apk
# deploy to gcloud and run instrumented test
- gcloud firebase test android run --type instrumentation --app app.apk --test app-test.apk --device model=Nexus6P,version=26,locale=en,orientation=portrait
dependencies:
- build_dev_debug
Sedikit penjelasan dari before_script
diatas, pertama kita setup package wget
yang nantinya digunakan untuk mendownload file instalasi Google Cloud SDK, dan ternyata untuk setup wget diperlukan python juga. Setelah mendownload dan menginstall Google CLoud SDK, setup gcloud dengan menentukan project id nya. Setup identitas dengan variable Service Account yang kita buat tadi dan aktifkan service accountnya.
Kemudian pada script
, kita copy kedua APK ke root, dan merubah namanya, ini supaya nanti command run terakhir tidak terlalu panjang aja sih. Dan akhirnya, gcloud firebase test android run ...
akan menjalankan tugasnya.
Catatan: untuk menjalankan Robo test, kita hanya perlu mengganti
--type
, detail lainnya seperti memilih di device apa test akan dijalankan bisa cek disini.
Jangan lupa tambahkan stage baru, yaitu test
di file .gitlab-ci.yml
sehingga kita sekarang memiliki 2 stage, build
dan test
. Versi lengkap dari file yang sudah jadi bisa dilihat disini.
What’s next? commit dan push code kita dan biarkan Gitlab CI yang bekerja. Sesaat setelah tes berhasil, kita dapat melihat detail lengkapnya pada firebase console.
Sekian tutorial integrasi Gitlab CI dengan Firebase Test Lab, jika ada pertanyaan ataupun kiritk dan saran silahkan post di kolom komentar yak!
Referensi:
- https://medium.com/evenbit/firebase-test-lab-with-gitlab-continuous-integration-c66b93bf896a
- https://firebase.google.com/docs/test-lab/
- https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests