目錄
- 任務目標
- 安卓App構(gòu)建、打包、部署與自動化測試
- 安卓App持續(xù)集成體系建設實戰(zhàn)
一、任務目標
- 實戰(zhàn)任務的故事
- 從源碼制作出可運行App,支持測試工作
- 各種自動任務
- Daily Build打包
- Daily Build發(fā)布
- Daily Build UI自動測試(BVT - Build Verification Test)
- 利用技術(shù)來幫助做 “雜活兒”
- 優(yōu)勢:
- 重復性定式勞動任務,
- 減少人力參與,提升工作效率
- Build不再是阻礙測試進度的因素
- 自動化重用率高,維護頻率低
二、 安卓App構(gòu)建、打包、部署與自動化測試
涉及技術(shù)點
- Android App構(gòu)建
- Android SDK使用
- 安卓模擬器或真機
- Python + Appium自動化測試
- Jenkins持續(xù)集成
- Shell腳本開發(fā)
- Java程序開發(fā)
- Git ( github使用)
測試App構(gòu)建、打包過程
- Android應用(例子程序)
- 源碼位置:https://github.com/princeqjzh/AndroidSampleApp
- 安卓打包的目標文件:app-debug.apk文件
- 安卓打包命令:
gradlew clean assembleDebug - 安卓安裝包的輸出路徑:
/app/build/outputs/apk/debug/app-debug.apk - 關(guān)于安卓打包的環(huán)境要求
- JDK 1.8
- Android SDK
-
Gradle
image.png
image.png
安卓App部署
-
前提條件:
- 安卓實體機或者安卓模擬器
- 安卓SDK
目標:通過命令安裝/卸載App
-
命令控制apk安裝與卸載
- 安裝:
adb install <file_ path> - 卸載:
adb uninstall <package_ name>
- 安裝:
-
查找包名:
adb shell pm list packages | grep sample
image.png
安卓UI自動化測試
- Appium app自動測試
- 源碼位置:https://github.com/princeqjzh/iAppBVT_Python
- 開發(fā)工具:PyCharm
- UI自動化框架:Appium
- 測試執(zhí)行框架:pytest
- 實現(xiàn)驗證點:
- App可安裝
- App可啟動
- App首頁預期的元素存在
- 校驗步驟
- 啟動App
- 檢查Record Event是否存在
-
結(jié)束輸出結(jié)果
image.png
測試源碼
-
目錄樹
image.png Readme.me
**iApp BVT自動化測試程序(Python版)**
運行環(huán)境:
- appium server
- python3
- unittest, pytest
- git
配置文件:iAppBVT_Python.json
- 將配置文件復制到本地磁盤
- 填入設備的 deviceName 與 udid
運行命令:
pytest -sv test/bvt_test.py --tc-file /full path/iAppBVT_Python.json --tc-format json
- bvt_test.py 文件
from appium import webdriver
import unittest
import time
from pytest_testconfig import config
timeout = 30 # 超時
poll = 2 # 輪詢
class IAppBVT(unittest.TestCase):
def setUp(self):
desired_caps = {}
appium_server_url = config['appium_server_url']
desired_caps['platformName'] = config['desired_caps']['platformName']
desired_caps['udid'] = config['desired_caps']['udid']
desired_caps['deviceName'] = config['desired_caps']['deviceName']
desired_caps['appPackage'] = config['desired_caps']['appPackage']
desired_caps['appActivity'] = config['desired_caps']['appActivity']
desired_caps['automationName'] = config['desired_caps']['automationName']
desired_caps['noReset'] = config['desired_caps']['noReset']
self.driver = webdriver.Remote(appium_server_url, desired_caps)
def tearDown(self):
self.driver.quit()
def test_bvt(self):
print('BVT test is started!')
status = self.is_record_event_btn_exist()
print(f'The record event button is exist - {status}')
self.assertTrue(status, f'Check record_button result is {status}')
print('Test finished!')
def is_record_event_btn_exist(self):
elem = self._find_elem_by_xpath('//android.widget.Button[contains(@resource-id,"id/trackEventButton")]')
return elem is not None
def _find_elem_by_xpath(self, elem_xpath, time_out=timeout, raise_exception=True):
start = time.time()
elem = None
while time.time() - start < time_out and elem is None:
time.sleep(poll)
try:
elem = self.driver.find_element_by_xpath(elem_xpath)
except Exception:
print('by pass the element not found')
if elem is None and raise_exception:
raise LookupError(f'The element which xpath is {elem_xpath} could not be found')
return elem
- iAppBVT_Pyhon.json 文件
- 獲取udid:
adb devices
image.png
{
"desired_caps": {
"platformName": "Android",
"deviceName": "<your device name>",
"udid": "<your device udid>",
"noReset": "false",
"automationName": "UiAutomator2",
"appPackage": "com.appsflyer.androidsampleapp",
"appActivity": ".MainActivity"
},
"appium_server_url": "http://localhost:4723/wd/hub"
}
- requirements.txt
allure-pytest
appium-python-client
pytest
pytest-testconfig
requests
selenium
urllib3
三、安卓App持續(xù)集成體系建設實戰(zhàn)演練
- 將之前內(nèi)容所做事情用Jenkins任務來實現(xiàn)
- Jenkins平臺源碼構(gòu)建、打包、發(fā)布app測試包
- Jenkins自動部署、測試新app測試包
- Jenkins通知運行結(jié)果
實現(xiàn)流程圖

image.png
安卓打包任務

image.png
安卓APP發(fā)布 輸出apk文件

image.png
安卓app自動部署、測試任務

image.png
App打包任務與自動部署、測試任務關(guān)聯(lián)
-
實現(xiàn)完成打包任務之后,運行自動測試任務,安裝新包,并運行UI自動測試驗證新安裝包的正確性
image.png
配置任務結(jié)果郵件通知
- 任務完成之后要把結(jié)果周知到相關(guān)人員,可以通過email的方式進行通知

image.png
-
結(jié)果通知:任務正確完成
image.png
三、安卓App持續(xù)集成體系建設實戰(zhàn)
創(chuàng)建打包任務
-
創(chuàng)建job
image.png -
選擇任務運行的節(jié)點-master
image.png -
添加項目的GitHub地址,并復制項目名稱
image.png -
將復制的項目名稱復制到sub-directory
image.png 添加shell命令
. ~/.bash_profile
cd AndroidSampleApp
sh gradlew clean assembleDebug

image.png
-
添加發(fā)布路徑:
AndroidSampleApp/app/build/outputs/apk/debug/app-debug.apk
image.png -
進行構(gòu)建,查看控制臺輸出以及運行結(jié)果
image.png
image.png
創(chuàng)建自動化測試任務
-
創(chuàng)建任務
image.png -
選擇打包的機器
image.png -
添加項目的GitHub地址,復制項目名稱
image.png -
粘貼項目名稱到sub-directory
image.png 輸入shell命令
- 如果apk 不存在執(zhí)行
uninstall命令會報錯,可以用以下命令過渡,中間的| |是或者的意思,先之前前面的命令,如果前面的命令報錯則執(zhí)行后面的命令
{
adb uninstall com.appsflyer.androidsampleapp
} | | {
echo 'no app package installed on the device'
}
-
pwd命令是為了獲取當前路徑
. ~/.bash_profilepwd= `pwd`
apk=$pwd/../1219_buildAndroidsample/AndroidSampleApp/app/build/outputs/apk/debug/app-debug.apk
{
adb uninstall com.appsflyer.androidsampleapp
}||{
echo 'no app package installed on the device'
}
adb install $apk
cd iAppBVT_Python
pip3.9 install -r requirements.txt
pytest -sv test/bvt_test.py --tc-file /Users/jizhiqian/iAppBvT_Python.json --tc-format json

image.png
-
構(gòu)建job,進行運行
image.png
配置消息通知
-
打包job和自動化測試job添加 Email Notification
image.png
關(guān)聯(lián)任務
-
在打包job中添加關(guān)聯(lián),Post-bulid Actions -> Build other projects
image.png
構(gòu)建打包任務會自動觸發(fā)自動化測試腳本

image.png

image.png
四、課程總結(jié)
- 從源碼到可測包,外加自動化測試驗證的全流程持續(xù)集成體系建設
- 安卓App的構(gòu)建、打包方法
- Apk文件發(fā)布
- 觸發(fā)自動測試
- Appium UI自動化測試
- 利用Jenkins平臺進行持續(xù)集成演練
五、FAQ
如何做失敗后的自動重試
- 在job的 Post-build Actions 中添加 Retry build after failure 插件
- Fixed -> Fixed delay:表示延遲多少秒再次構(gòu)建
- Maximum number of successive failed builds:重試次數(shù)
- 可以捕捉錯誤信息,使用正則表達式,
|表示或

image.png





















