前言:javascript
隨着產品發佈的週期愈來愈快, 行業對測試的要求也愈來愈高; 每每須要在很短的時間內完成前端
多端測試(Android iOS 小程序、H5)、java
多環境測試(聯調環境、測試環境、預發佈環境)、android
多機型覆蓋(後逃統計到的top20 or top50?)web
多版本共存(歷史版本兼容?)shell
歷史用例的迴歸(迴歸測試時的覆蓋面?)json
這些問題都在推進這整個行業去尋求技術的突破, 自動化測試就是可以保證產品質量的一個重要手段, 其與企業小程序
產品線的CI CD 集成 完成迴歸測試 兼容性及自動化探索測試等;今天主要整理下UI自動化測試技術中的主流技術bash
手段 Appium.服務器
使用分層測試策略,控制UI自動化測試規模(在決定作UI自動化前 必定要肯定其主要解決的問題)
1、Appium應用原理:
Appium是一個獨立的模塊,使用的時候須要咱們啓動它; 當開啓appium服務器的同時就開啓了監聽端口;咱們運行腳本的時候,調用任何的appiumAPI,都會向Appium Server端post一條HTTP請求,(咱們可使用任何方式去發送交互的post http請求, 各語言腳本,或者是自定義curl等,只要請求符合webdirver協議 );請求內容就是根據webdriver wire protocol協議規定的一條JSON格式的數據;Appium Server端接收到請求後,解析出JSON數據併發送到手機端;(appium會給手機端發送一個apk, apk在手機上會監聽一個forword端口) 手機端上已經由BootStrap.jar(iOS爲BootStrip.js)開啓的socket服務器監聽相應的端口,BootStrap.jar在appium每一個session第一次訪問手機端的時候會自動安裝;手機端接收到對應的請求後,經過BootStrap.jar翻譯成UIAutomator能執行的命令,而後經過UIAutomator處理並操做APP完成測試。下面經過分析腳本與appium通信日誌 以及 appium與移動設備通信日誌來分析其運行原理.
2、使用Appium 啓動一個app實例來展現appium的工做流程
$(which emulator) -list-avds 查找可用的模擬器
$(which emulator) @XXX 啓動xxx模擬器
啓動Appium服務; start一個Session 而後導出logs
Running '/Users/wangjianqing/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb -P 5037 -s emulator-5554 shell dumpsys window'
主要分析Running 中的
adb -P 5037 -s emulator-5554 shell dumpsys window'
-P adb開的端口 -s 對應的設備 後面對應的執行腳本
爲了便於分析, 將android 中的adb 替換成以下腳本 將adb mock掉 原adb 改爲adb.bak mv adb adb.bak
```
log=/tmp/adb.log
echo "# $$ "$(date "+%Y/%m/%d %H:%M:%S") >> $log
echo "# ppid: $(ps -o command $(ps -o ppid $$ | tail -1) | tail -1)" >> $log
echo "adb $@" >> $log
if echo "$@" | grep -E "logcat |exec-out |uiautomator runtest" &>/dev/null; then
echo "exec" >> $log
exec /Users/wangjianqing/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb.bak "$@"
elif echo "$@" | grep "dumpsys package io.appium.settings" &>/dev/null; then
echo "mock" >> $log
cat /Users/wangjianqing/temp/appium/package.mock | tee -a $log
elif echo "$@" | grep "io\.appium\.settings" &>/dev/null;then
echo "mock" >> $log
echo "11111" | tee -a $log
else
result=$(/Users/wangjianqing/Applications/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/adb.bak "$@")
echo "origin" >> $log
echo "$result" | tee -a $log
fi
echo "" >> $log
```
將adb替換完成後, 默認會使用腳本中的adb執行邏輯; 執行完的log會保存到 /tmp/adb.log中; 如執行adb devices 以後,打開log日誌以下:
# 3779 2019/08/12 22:54:42
# ppid: -bash
adb devices
origin
List of devices attached
emulator-5554 device
此時再次使用appium'時生成的log就會是使用新adb產生的簡化結果日誌;
二、
使用curl命令來給appium發送請求,讓它執行啓動app的操做:
curl -H "Content-Type: application/json; charset=utf-8" \
-H "Cache-Control: no-cache" \
--data '{"desiredCapabilities":{"appActivity":".view.WelcomeActivityAlias","appPackage":"com.xueqiu.android","autoGrantPermissions":"true","deviceName":"hogwarts","platformName":"android","newCommandTimeout":0,"connectHardwareKeyboard":true}}' \
-XPOST http://127.0.0.1:5723/wd/hub/session
若是要封裝Appium 的話,首先要知道它作了什麼,才能作到使用你本身的語言或方式去操做appium,能夠直接按照webdriver協議規範封裝發送請求 ,編寫appium前端.
使用tcpdump監聽webdriver協議操做過程當中的端口,包括操做腳本與appium通信的端口和appium和手機交互過程當中的通信端口
adb forword
appium在和手機交互 會向手機推送一個apk ,這個apk啓動後會監聽一個端口,會把手機上的命令經過 forword命令映射到你的PC上去;你的PC機更多的是和
forword端口來和手機通信;
sudo tcpdump -i any port 5723 or port 4724 -vv -w /tmp/tcpdump.1 #5723是appium端口 4724是forword端口 將發送到這兩個端口的請求都錄下來
而後使用wireshark打開tcpdump 選擇某個tcp右鍵follow Http能夠查看具體的請求
POST /wd/hub/session HTTP/1.1
Connection: keep-alive
User-Agent: admc/wd/1.11.1
Accept: application/json
Content-Type: application/json; charset=UTF-8
Content-Length: 234
host: 127.0.0.1:5723
{"desiredCapabilities":{"appActivity":".view.WelcomeActivityAlias","appPackage":"com.xueqiu.android","autoGrantPermissions":"true","deviceName":"hogwarts","platformName":"android","newCommandTimeout":0,"connectHardwareKeyboard":true}}HTTP/1.1 200 OK
X-Powered-By: Express
Vary: X-HTTP-Method-Override
Content-Type: application/json; charset=utf-8
Content-Length: 856
ETag: W/"358-h2tUi1B25lJ0BAIZ1c7Eh+Nw5yY"
Date: Fri, 05 Jul 2019 13:19:54 GMT
Connection: keep-alive
{"status":0,"value":{"platform":"LINUX","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"appActivity":".view.WelcomeActivityAlias","appPackage":"com.xueqiu.android","autoGrantPermissions":true,"deviceName":"hogwarts","platformName":"android","newCommandTimeout":0,"connectHardwareKeyboard":true},"appActivity":".view.WelcomeActivityAlias","appPackage":"com.xueqiu.android","autoGrantPermissions":true,"deviceName":"emulator-5554","platformName":"android","newCommandTimeout":0,"connectHardwareKeyboard":true,"deviceUDID":"emulator-5554","platformVersion":"8.0.0","deviceScreenSize":"1080x1920","deviceModel":"Android SDK built for x86","deviceManufacturer":