iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
Mobile Development

從0開始,全方面自動化測試Android App系列 第 23

[Day 23] Android Integration Test in Jenkins

  • 分享至 

  • xImage
  •  

我們已經學會了一些Espresso基本的使用後,我們也寫了一些test,但是每次都在Local只有自己看得到結果,如果Application只有自己一個人開發那每次開發到一個段落後再做測試沒問題,反正本來測試結果也只有自己會看。但是如果在多人共同開發的商業Application,那只在自己本機的Local做測試的方式可能就行不通了。因為大家共同開發的東西可能會互相影響,你只測你改的部份可能沒問題,如果是整合別人的code進來一起測試就不一定了,所以我們需要一個定期測試development branch的程式來做一個整合性的測試,這就是CI/CD持續整合及發佈流程中的一個範疇,其中比較多人使用的就是Jenkins,就算沒用過也應該有聽說過。

講到這裡可能會想說做個測試還要自己搞DevOps的工作真麻煩,其實在Local架Jenkins一點都不難,因為Jenkins已經幫我們打包好一個安裝檔,安裝完成並不困難。比較麻煩的是設定的部份,必竟Jenkins不是專門為Android設計的工具,還是需要一些功夫才能開始測試。安裝的方式請參考中文官網https://jenkins.io/zh/ 本章節會關注在如何設定讓Android application可在Jenkins上進行測試。本章的範例會用目前工作的專案來示範,因為是private repository所以大家必須開自己的Github的專案來練習與Jenkins的連線。

一開始安裝完畢後,點開Jenkins並且登入後會進入到主畫面,如果還沒開過任何一個作業右邊的View會是空白的,我們要開始新的一個作業的話,點擊左方的新增作業。
https://ithelp.ithome.com.tw/upload/images/20191007/20120975Vb6f7JjHWG.png

輸入你的作業名稱跟選取free-style類別
https://ithelp.ithome.com.tw/upload/images/20191007/20120975DrfcJGhf3v.png

在General的Tab裡我這邊勾選忽略舊Build,因為每次Jenkins在build的時候會產生cache,選取這個選項可以幫我們把cache清除。我這裡的條件是設置清除超過7天或20次前的build。
https://ithelp.ithome.com.tw/upload/images/20191007/20120975FFvQ4w1Orm.png

在第二個Tab原始碼管理裡面,我們要選取Git。Repository URL請填上你的github repository SSH或HTTP位址,Credentials這個項目如果你連線的是private repository請選取Add進行認證。如果是public repository則不用認證即可使用。

在Branches to build的地方請填入你想要Build的branch位置,例如origin/master,如果你不填的話Jenkins的套件會預設幫你把全部branch都build一次。
https://ithelp.ithome.com.tw/upload/images/20191007/201209754MFrEzzoqQ.png

點選Credentials Add按鈕後,Github帳號應該都是用SSH的認證方式,請把username/passowrd加入後回到上一個步驟去選取這個Acoount連線你的private repository。
https://ithelp.ithome.com.tw/upload/images/20191007/20120975aJ42FQRtxw.png

第三個Tab建置觸發程序中,可以依需求設定讓Jenkins自動build code的條件,例如選取Pull Request選項,當有人想要對這個branch發Pull Request時候,Jenkins就會自動執行build code。
https://ithelp.ithome.com.tw/upload/images/20191007/20120975WUhE7KhLoq.png

第四個Tab建置環境是本章設定模擬器的重點,首先我們先選取Run an Android emulator during build。點選後會展開兩個項目

  • Run existing emulator 預設先在Machine上開好一個Android Emulator,這個只適合把Jenkins Server架在公司內部的機器上,你可以先開好模擬器等Jenkins來trigger,如果是部屬在Cloud上這個可能就不適合了,
  • Run emulator with properties 動態生成模擬器,當Build被trigger時候,由Jenkins Server臨時生成一個Android Emulator來執行,適合各種環境。

Run emulator with properties的config如下

  • Android OS version 模擬器的OS版本,Android 9就是帶入android-28
  • Screen density 螢幕顯示密度,也就是所謂的DPI
  • Screen resolution 螢幕解析度,用WxH的方式輸入
  • Device Definition 如果填入可以在手動下script時用avdmanager list device選取指定名稱的模擬器,可不填
  • Device locale 指定摸擬器的所在區域如en_US,可不填
  • SD card size 這應該不用講了:P,可不填
  • Target ABI 指定摸擬器的使用的CPU指令集接口,如armaeabi,x86,google_apis/x86_64,這個可以透過Android Studio的AVD Manager來看。
  • Emulator name suffix 模擬器的log名稱,可不填
  • Hardware 特殊硬體配置,可不填

在Common emulator options有三個選項可以使用如下

  • Reset emulator state at start-up 每次使用emulator都重新建立一個,如同你在Android Studio裡建立一個新的emulator
  • Show emulator window 選取觀看emulator的執行過程,如果架在remote時用處不大。不選就是讓UI在背景執行。
  • Use emulator snapshots 把上次建立的模擬器cache下來,可以加快build的速度但是會使用硬礏約150-200MB的空間。
    https://ithelp.ithome.com.tw/upload/images/20191007/201209755cKVmmk0bg.png

在第五個Tab建置部份,使用Gradle Wrapper這樣可以輸入gralde task

Pandroid.testInstrumentationRunnerArguments.class="your testing class" connected"Build Variants"AndroidTest

https://ithelp.ithome.com.tw/upload/images/20191007/20120975eTf5hW3Bqi.png

例如Pandroid.testInstrumentationRunnerArguments.class=com.daniel.demo.test.DemoTest connectedStagingDebugAndroidTest,其中com.daniel.demo.test.DemoTest就是我的test class path。這裡有一些指令可以方便讓我們指定測試範圍

  • 指定多個測試class
    Pandroid.testInstrumentationRunnerArguments.class=class1,class2,class3

  • 指定測試function
    Pandroid.testInstrumentationRunnerArguments.class=class#function name

而StagingDebug是我的BuildVariant(productFlavors+buildTypes),如果你的Application沒有指定Build Variant的話可以直接使用connectedAndroidTest(或是簡寫cAT)就好。

最後我們可以回到專案目錄去點選馬上建置在Jenkins上執行測試。
https://ithelp.ithome.com.tw/upload/images/20191007/20120975KMgKmThaUd.png

測試的結果我們可以選擇Console Output去看Log
https://ithelp.ithome.com.tw/upload/images/20191008/20120975lnj6fIKnmt.png

結論

經由本篇介紹後在Jenkins執行Android test也沒那麼難,本篇是用Integration Test來示範,你另外也可以把單元測試的部份利用Jenkins來跑,不用模擬器會比本篇講的步驟更簡單一點,gradle指令需要修改的部份就留給大家自己做功課。

下一個章節我們會進入End to End Test的部份,來講講同是UI測試,Integration Test跟End to End Test差別在哪。


上一篇
[Day 22] Integration Automation之前的注意事項
下一篇
[Day 24] End to End Test 介紹
系列文
從0開始,全方面自動化測試Android App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言