UI自動化測試的價(jià)值
1、提升回歸測試的效率
2、可以進(jìn)行兼容性測試
UI 自動化測試應(yīng)用場景
? 冒煙測試自動化:提測之前自動斷言提測質(zhì)量,提供準(zhǔn)入?yún)⒖肌?/p>
? 功能測試自動化:輔助 QA 與測試工程師的快速驗(yàn)證。
? 驗(yàn)收測試自動化:兼容性測試等。
? 移動端性能專項(xiàng)測試自動化:性能、卡頓、健壯性測試、競品分析。
測試框架
? 阿里 Macaca
? 騰訊開源微信小程序自動化測試工具
? 百度內(nèi)部的 Cafe 框架
自動化測試常見誤區(qū)
強(qiáng)調(diào)自動化測試不代表手工測試無用
? 手工測試非常有用,僅有手工測試是不夠的。
? 手工測試 + 自動化測試才是企業(yè)快速迭代的根基
UI 自動化測試的“瓶頸”
? 技術(shù)成本高:
? 人力成本高:優(yōu)秀測試開發(fā)工程師難招
? 技術(shù)門檻高:80%的自動化測試工程師在自動化能力上都不及格
? 維護(hù)成本高
? 復(fù)用率不高:UI 和業(yè)務(wù)流程變更是最主要變更
? 穩(wěn)定性不足:容易被干擾,執(zhí)行慢
? 常見行業(yè)錯(cuò)誤觀點(diǎn)
? 錯(cuò)誤觀點(diǎn)一:UI 自動化測試無用論
? 錯(cuò)誤觀點(diǎn)二:UI 自動化測試只能模擬人工
合理地使用 UI 自動化
? 使用分層測試策略,控制 UI 自動化測試規(guī)模:
? 少數(shù)核心用例交給自動化測試
? 大部分的基礎(chǔ)回歸測試交給自動遍歷
? 新功能測試交給人工測試
? 技術(shù)改進(jìn)方案:
? 良好的維護(hù)模型:PageObject、數(shù)據(jù)驅(qū)動
? 更好的框架支持:增加 Watch,智能等待,失敗重試等機(jī)制
自動化測試就是機(jī)器點(diǎn)點(diǎn)點(diǎn)?
? 傳統(tǒng)自動化測試
? 自動探索測試 自動化對新功能進(jìn)行測試?
? codeless 方向的自動化測試? 不需要寫代碼就可以完成自動化測試
? 自動化測試用例智能生成?
如何高效實(shí)用的落地自動化
? 學(xué)習(xí)方向
? 了解待測產(chǎn)品和平臺:Android、iOS、App
? 精通最好的測試框架:Appium、UI Automator、WebDriverAgent
? 掌握自動化測試落地經(jīng)驗(yàn):PageObject、穩(wěn)定性提升、數(shù)據(jù)驅(qū)動……
? 達(dá)到的結(jié)果
? 一天搞定一款 app 的自動化測試腳手架
? 一天完成單個(gè)功能的業(yè)務(wù)測試自動化用例集合
? N 周內(nèi)搞定公司的 app 自動化測試
移動自動化測試的技術(shù)體系
UI 自動化分類
? Web 自動化:Selenium
? App 自動化:Appium
? GUI 自動化:Windows、Mac
? 微信小程序自動化:App + Web 測試技術(shù)的外延形態(tài)
? 更多平臺:智能設(shè)備、機(jī)器人、工業(yè) app
UI 自動化測試方面的成就
? Google:Espresso、UI Automator
? Facebook:WebDriverAgent
? 焰焮ibaba:Macaca
? Ebay:Selendroid
? Walmart:Robotium
? Sauce Labs:Appium
? ThoughtWorks:Selenium
Appium
Appium 的設(shè)計(jì)理念
Appium client:對應(yīng)語言的client包和腳本,如python的Appium-Python-Client并編寫腳本
Appium server:啟動服務(wù)開放端口,接收appium client客戶端的http請求
driver:appium需要driver來驅(qū)動移動端,Appium team目前維護(hù)了很多driver,需要根據(jù)平臺來選擇driver。Android平臺一般使用Uiautomator2 driver。。IOS使用XCUITest driver
?
自動化測試框架選擇
? 推薦 Appium
? 跨語言:Java、Python、Node.js 等
? 跨平臺:Andoid、iOS、Windows、Mac
? 底層多引擎可切換
? 生態(tài)豐富,社區(qū)強(qiáng)大
? iOS:KIF、WDA、XCTest
? Android:Robotium、UI Automator
? 特色框架:calabash、Macaca、ATX
Appium 引擎列表
? Android
? Selendroid、Espresso [推薦]
? UI Automator、UI Automator2 [推薦]
? iOS
? UI Automation [已廢棄]
? XCUITest [推薦]
? 更多平臺:Mac、Windows、游戲引擎等
Appium 多端架構(gòu)與自動化
UI 分層測試體系
移動 App 分層測試
?移動 App 快速迭代模型
自動遍歷測試與其價(jià)值
? 定義:以自動化的方式對 app 進(jìn)行充分的功能遍歷以探索 bug
? 價(jià)值
? 降低自動化維護(hù)成本,可替代 80% 的自動化測試
? 實(shí)現(xiàn)新功能的探索
? 實(shí)現(xiàn)老功能的回歸
? 用途:多設(shè)備兼容測試、自動化專項(xiàng)測試
常見遍歷工具與技術(shù)
? Android 原生 Monkey
? 百度 SmartMonkey
? 騰訊 New Monkey
? 阿里 Macaca 的 NoSmoke
? TesterHome 社區(qū) vigossjjj smart_monkey
? TesterHome 社區(qū) zhangzhao Maxim
? TesterHome 社區(qū) seveniruby AppCrawler
? Google 出品的 App Crawler
合理的使用 UI 自動化
? 單元測試:使用 App 分層測試策略,增加單測規(guī)模,控制 UI 自動化測試規(guī)模。
? 移動 App 自動化測試:核心集成與驗(yàn)收測試用例交給自動化測試。
? 自動遍歷測試:大部分的基礎(chǔ)回歸測試交給自動遍歷。
? 人工測試:測試團(tuán)隊(duì)主負(fù)責(zé),整個(gè)產(chǎn)品團(tuán)隊(duì)參與。
Android?app 的常見概念
Android 自動化前提依賴
? Android SDK:Android Studio 可輔助安裝
? 模擬器
? Android Studio 自帶 Emulator [推薦]
? Genymotion、網(wǎng)易 MuMu、BlueStacks
? 真機(jī)
獲取 App 的信息
? App 信息
? 獲取當(dāng)前界面元素:adb shell dumpsys activity top
? 獲取任務(wù)列表:adb shell dumpsys activity activities
? App 入口
? adb logcat |grep -i displayed
adb logcat | findstr Displayed? (windows cmd用這個(gè))
? aapt dump badging mobike.apk | grep launchable-activity
? apkanalyzer 最新版本的 SDK 中才有
? 啟動應(yīng)用
?Android 調(diào)試橋 adb 命令詳解
環(huán)境準(zhǔn)備
? 真機(jī) or 模擬器
? 下載 Android SDK
? 設(shè)置 PATH 變量加入 SDK 的工具目錄
Android 常用命令
? adb:Android Debug Bridge
? adb devices:查看設(shè)備
? adb kill-server:關(guān)閉 adb 的后臺進(jìn)程
? adb tcpip:讓 Android 脫離 USB 線的 TCP 連接方式
? adb connect:連接開啟了 TCP 連接方式的手機(jī)
? adb logcat:Android 日志查看
? adb bugreport:收集日志數(shù)據(jù),用于后續(xù)的分析,比如耗電量
adb shell
? adb shell 本身就是一個(gè) Linux 的 shell,可以調(diào)用 Android 內(nèi)置命令
? adb shell
? adb shell dumpsys
? adb shell pm
adb shell pm clear com.android.contacts
?
?清除包的緩存數(shù)據(jù)和權(quán)限,獲得一個(gè)比較新的環(huán)境。
? adb shell am
?? adb shell am start -W -n ?com.android.contacts/.activities.PeopleActivity -S
? adb shell ps
? adb shell monkey
常用命令列表
? adb
? pm 包管理工具
? am? 啟動一個(gè)APP
? dumpsys 獲取整個(gè)系統(tǒng)的性能數(shù)據(jù)
? uiautomator? 獲取APP的界面結(jié)構(gòu),執(zhí)行自動化測試?
? input 完成簡單的自動化指令
Android 性能統(tǒng)計(jì) dumpsys
? 獲取所有的 dumpsys 子命令 dumpsys | grep -i DUMP
? 獲取當(dāng)前 activity adb shell dumpsys activity top
? 獲取 activities 的記錄,可以獲取到 appium 依賴的原始 activity dumpsys activity activities
? 獲取特定包基本信息 adb shell dumpsys package com.xueqiu.android
? 獲取系統(tǒng)通知 adb shell dumpsys noti?cation
? 獲得內(nèi)存信息 adb shell dumpsys meminfo com.android.settings
? 獲取 cpu 信息 adb shell dumpsys cpuinfo
? 獲取 gpu 繪制分析 adb shell dumpsys gfxinfo com.android.settings
? 獲取短信 adb shell dumpsys activity broadcasts | grep senderName=
uiautomator
? adb shell uiautomator runtest ...
運(yùn)行自動化測試用例
? adb shell uiautomator dump
adb shell uiautomator dump
?把Android APP控件生成xml文件
UiAutomator是測試Android原生態(tài)APP的功能測試工具。Android 4.1發(fā)布時(shí)包含了這種新的測試工具—UiAutomator。UiAutomator用來做UI功能測試的。
uiautomator2是uiautomator的升級版,uiautomator是Google開發(fā)的一款用來做安卓自動化測試的Java庫。適用于Android4.4+
簡單的自動化工具 input 命令
? text (Default: touchscreen)
? keyevent [--longpress] ... (Default: keyboard)
? tap (Default: touchscreen)
adb shell input tap 529 1176
點(diǎn)擊屏幕上該坐標(biāo)??
? swipe [duration(ms)] (Default: touchscreen)
? draganddrop [duration(ms)] (Default: touchscreen)
? press (Default: trackball)
? roll (Default: trackbal
Appium 架構(gòu)介紹
文檔:The Context API - Appium Documentation
Appium 生態(tài)工具
? adb:Android 的控制工具,用于獲取 Android 的各種數(shù)據(jù)和控制
? Appium Desktop:內(nèi)嵌了 Appium Server 和 Inspector 的綜合工具
? Appium Server:Appium 的核心工具,命令行工具
? Appium Clients:各種語言的客戶端封裝庫,用于連接 appium server
? Java、Python、Ruby、robotframework-appium
? AppCrawler 自動遍歷工具
Desktop 主要功能
? UI 分析
? 錄制用例
? 元素查找測試
? Attach 已有的 session
? 云測試
python 客戶端安裝
? 客戶端安裝:pip install Appium-Python-Client
? IDE:PyCharm
? Python 多版本隔離工具:venv
? 國內(nèi)依賴源:http://pypi.douban.com/simple/
? 測試框架:unittest、pytest、nose,推薦 pytest
APP自動化
控件定位方法
常用定位手段
? id
? Accessibility ID
? XPath
元素定位
? 測試步驟三要素:
? 定位、交互、斷言
? 定位
? ID (重要)
? XPath(重要)
? Accessibility ID: content-desc(重要)
? 不推薦:Class -iOS -Android
常用自動化 API
常見自動化動作支持
? click
? sendKeys
? swipe
? touch action
手勢操作 TouchAction
? press release longPress
? tap wait
? moveTo
? perform
capabilities 設(shè)置
Capabilities - Appium Documentation
Capabilities是appium啟動server會話時(shí)設(shè)置的參數(shù),告訴server需要啟動的APP入口,android版本等信息。
? App APK 地址 appPackage 包名 appActivity Activity 名字
? automationName 默認(rèn)使? uiautomator2
? noReset fullReset 是否在測試前后重置相關(guān)環(huán)境
? autoGrantPermissions ?動賦予 App 權(quán)限
? unicodeKeyBoard resetKeyBoard 是否需要輸??英?之外的語?并在測試完成后重置輸?法
?Appium 設(shè)備交互 API
可見Appium Python Client 文檔Welcome to Appium python client’s documentation! — Python client 1.0 1.0 documentation
常用的設(shè)備交付命令
? 模擬電話、短信
用下面的命令模擬 GSM 電話和短信,注意:只能在模擬器上使用!
self.driver.make_gsm_call("5551234567", GsmCallActions.CALL);
?
self.driver.send_sms('555-123-4567', 'Hey lol')
?
Original error: gsmCall method is only available for emulators?這里在夜神模擬器上執(zhí)行是失敗的。
? 橫豎屏切換
? App 處理
# 實(shí)現(xiàn) APP 的安裝
self.driver.install_app('/Users/johndoe/path/to/app.apk')?
?
# 檢測 APP 是否被安裝
self.driver.is_app_installed('com.example.AppName');
?
# 啟動 APP
self.driver.launch_app()
?
? 鍵盤、粘貼板
設(shè)置系統(tǒng)剪貼板的內(nèi)容:
self.driver.set_clipboard('happy testing')
self.driver.set_clipboard_text('happy testing')
?
獲取到剪貼板的內(nèi)容:self.driver.get_clipboard()
self.driver.get_clipboard_text()
? 錄屏
顯式等待
? 功能差別
? 顯式等待的條件非常靈活
? 隱式等待只用于元素定位
? 執(zhí)行差別
? 顯式等待本地輪詢條件
? 隱式等待通過 appium server 輪詢條件
def assert_exist_element(self,loc): try: WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(loc)) return True except: print("元素{}不存在".format(loc)) return False
XPath 介紹
? 絕對定位:根據(jù)嚴(yán)格的父子關(guān)系定位
? 相對定位:根據(jù)條件匹配定位
? 慢的原因:XPath 定位比其他定位慢,因?yàn)樾枰f歸解析每個(gè)元素的屬性
? 慢的不明顯的原因:有 Cache 機(jī)制
常用 XPath 相對定位表達(dá)式
? 查找:
? //*[@text='登錄’]
? //*[contains(@resource-id, 'login’)]
? 條件匹配:
? //*[contains(@resource-id, ‘login’) and contains(@text, ‘登錄’)]]
? //*[contains(@text, ‘登錄’) or contains(@label, '登錄’)]]
? 尋找所有元素://*
Toast 識別方法
? automationName:uiautomator2
? getPageSource 是無法找到的
? 必須使用 xpath 查找
? 推薦 //*[@class= ‘a(chǎn)ndroid.widget.Toast']
? 或者 //*[contains(@text, "xxxxx")]
斷言體系
元素是否存在:?nd_elements
assert len(self.driver.find_elements(by=AppiumBy.XPATH, value='//*[@text="Battery"]'))>=1 #斷言存在該元素 assert "哈哈" in self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]').text
? 元素屬性正確性:get_attribute
xUint常用斷言
傳統(tǒng)的xUnit風(fēng)格的assertXXX()系列
Hamcrest斷言,基于更靈活的Matchers斷言方式 --推薦?https://github.com/hamcrest/PyHamcrest
參數(shù)化與數(shù)據(jù)驅(qū)動
參數(shù)化
? 參數(shù)化:根據(jù)傳入的數(shù)據(jù),對測試用例進(jìn)行迭代調(diào)用 如pytest的pytest.mark.parametrize
? 數(shù)據(jù)驅(qū)動:基于數(shù)據(jù)完成流程調(diào)度,通常數(shù)據(jù)來源自外部數(shù)據(jù)文件
? 參數(shù)化是數(shù)據(jù)驅(qū)動的基礎(chǔ)和特例
數(shù)據(jù)驅(qū)動
? 參數(shù)化數(shù)據(jù)讀取自外部文件:使用 YAML、JSON 讀取
? 測試步驟讀取自外部文件:定制執(zhí)行引擎
? 斷言步驟讀取自外部文件:定制執(zhí)行引擎
? 整個(gè)用例讀取自外部文件:動態(tài)創(chuàng)建用例
APP分類
Native 原生 App 的自動化測試
多種架構(gòu)支持
Native 原生應(yīng)用的分類
? Android 標(biāo)準(zhǔn)組件
Activity組件、service組件、content provider組件、broadcase receiver組件
? 非標(biāo)準(zhǔn)組件:
-Flutter:閑魚
-React Native:Facebook
- Weex:極客時(shí)間
也可以使用appium進(jìn)行測試?
? 游戲
非標(biāo)準(zhǔn)組件APP的特征
如極客時(shí)間APP,非標(biāo)準(zhǔn)控件會被解析
? 不是WebView 組件
? 原生控件可識別,非原生的被解析
? HTML 控件被編譯為 Native 控件如view
? HTML 的文本屬性被解析為 Native 屬性
? text 還是 content-desc 取決于 API 版本
常見 Native 自動化測試方式
? Android 原生組件:Appium 默認(rèn)支持
? Native非標(biāo)準(zhǔn)組件:Appium默認(rèn)支持
? 自定義 View 識別:
1)使用相對定位,父控件加百分比偏移
2)OCR、圖像識別、AI
? 游戲控件識別:使用游戲引擎特定技術(shù)
游戲自動化測試支持
? Appium 提供了簡單的游戲自動化測試支持
?1)圖像識別
?2)AI 識別
?游戲測試的推薦做法
1)提高可測性:編碼輸出游戲引擎下的控件布局信息,與 Appium 對接
2) 使用成熟的 airtest 框架
Hybrid 混合 App 的自動化測試
WebView 控件在 Appium 中的抽象
? Native 層面支持
1) uiautomator 解析 WebView 中的內(nèi)容并映射為原生控件
?2)getPageSource 為 DOM 結(jié)構(gòu)可發(fā)現(xiàn) WebView 組件和控件
? 切換為 WebView 上下文
1)切換后才是正規(guī)的 Web
2)getPageSource 為 HTML
3)可以使用 CSS 定位等
Hybrid 測試流程
? 首先進(jìn)去帶有 WebView 的頁面
? 使用 Contexts API 尋找 WebView
? 使用 Context 切換到 WebView
? 使用 CSS 等 Web 定位方式
? 使用 Context 重回 Native
真機(jī)進(jìn)行 WebView 測試的前提
? 模擬器默認(rèn)支持解析webview控件
? 物理機(jī)需要打開 app 內(nèi)開關(guān)(需要開發(fā)人員修改配置)
? 檢測是否打開:反編譯檢查對應(yīng)的 API 調(diào)用
?WebView 測試 - Python
找對 ChromeDriver 的版本
? Android 默認(rèn)瀏覽器:
? 老版本 Android 用 Browser,新版本 Android 用 Chrome
? adb shell dumpsys package com.android.webview | grep versionName
? adb shell dumpsys package com.android.chrome | grep versionName
? App 自帶 WebView 組件:每個(gè) App 自帶的 WebView 的版本也都不相同
Android WebView進(jìn)程信息
? getContextHandles
? 查看所有的 WebView 進(jìn)程
? adb shell cat /proc/net/unix | grep webview
? Context 切換
? 把 domain socket 映射為本地的 socket 端口
? adb forward tcp:$port localabstract:webview_devtools_remote_$pid
? 獲取對應(yīng)的 WebView 組件版本 http://localhost:$port/json/version
? ChromeDriver 協(xié)議交互
設(shè)置 ChromeDriver
? ChromeDriver 安裝
? 提前下載所有的 ChromeDriver 版本備用
? 運(yùn)行時(shí)指定
? 隱式選擇:1.8版本以后支持自動選擇 ChromeDriver
? 顯式指定:chromedriverExecutableDir 設(shè)置
? 調(diào)試開關(guān):
? showChromedriverLog
純 H5 站自動化測試
瀏覽器自動化技術(shù)原理
瀏覽器調(diào)試工具 DevTools
?對網(wǎng)站進(jìn)行分析
?移動瀏覽器測試 - Python
?
?小程序自動化測試
小程序自動化的三個(gè)方法
? 利用 Uiautomator 的原生定位
? 利用微信提供的小程序自動化 SDK
? 基于WebView的測試方法
基于原生定位的方法
? Appium 使用 Uiautomator2 定位可以識別內(nèi)部 WebView 組件
? 缺點(diǎn):元素定位符不夠精確,content-desc、resource-id 多數(shù)都沒有
? NoReset 默認(rèn)為 false,會默認(rèn)清空微信聊天記錄,所以請使用測試機(jī)測試帳號
基于微信提供的小程序自動化 SDK
? 使用 Node.js 體系
? 微信小程序自動化 SDK + 標(biāo)準(zhǔn)的測試框架
? 支持真機(jī)與 Web 模擬器
微信小程序自動化 SDK 的缺點(diǎn)
? 從官網(wǎng)提供的代碼示例來看,微信的這套體系主要用于研發(fā)自測
? 微信的研發(fā)對自動化測試?yán)斫獠坏轿?,大量?wait,實(shí)用性不高
? 需要在已有的 WebSocket 體系上做二次封裝對接 Appium
? 希望微信可以重視這塊的測試支持改進(jìn)
基于 WebView 的測試方法
? 微信6.x版本支持基于 WebView 自動化測試
? 7.x改版后默認(rèn)已經(jīng)無法使用基于 WebView 的自動化
? 7.x + root強(qiáng)行開啟 WebView debug + Appium hack
? 曾經(jīng)這個(gè)方案是最好用的,Appium 默認(rèn)支持
? 但是當(dāng)前微信版本里這個(gè)方法已經(jīng)被破壞,繞過條件比較苛刻,暫時(shí)不可用了
iOS 測試工具體系
主流移動測試框架
? Appium
? Calabash iOS
? KIF
? XCTest
? WebDriverAgent
? UIAutomation(在 Xcode8 后廢棄)
基礎(chǔ)工具
? Xcode??Xcode?是蘋果公司向開發(fā)人員提供的集成開發(fā)環(huán)境(非開源),用于開發(fā) Mac OS X 的應(yīng)用程序。
Xcode
? 演練 example:https://github.com/appium/ios-uicatalog
? Xcode 編譯
? 觀察 build 過程提取編譯文件
? 導(dǎo)出文件和 dSYM 文件
? xcodebuild??xcodebuild是一個(gè)命令行工具,允許你從命令行對Xcode項(xiàng)目和工作區(qū)執(zhí)行編譯、查詢、分析、測試和歸檔操作。它對項(xiàng)目中包含的一個(gè)或多個(gè)目標(biāo)或項(xiàng)目或工作區(qū)中包含的方案進(jìn)行操作
? instruments工具包-專項(xiàng)工具包
? libimobiledevice??libimobiledevice又稱libiphone,是一個(gè)開源包,可以讓Linux支持連接iPhone/iPod Touch等iOS設(shè)備
常用測試輔助工具
? 依賴工具包安裝:
? brew install --HEAD ideviceinstaller
? brew install --HEAD libimobiledevice
? brew install ios-deploy
? 查看模擬器列表:instruments -s devices
查看真機(jī)列表:idevice_id -l
? 安裝 app: ideviceinstaller -i demo.app 高版本使用:ios-deploy
? 命令行編譯:
? xcodebuild -scheme UICatalog -target iOS clean build
? xcodebuild -scheme UICatalog -target iOS archive
WDA 與 Appium 的關(guān)系
? WDA 本身也是一個(gè)完整的基于 WebDriver 協(xié)議的框架
? Appium 使用 WDA 作為底層的 iOS 自動化框架
iOS 模擬器自動化測試
常用控件定位方式
? name:ID 定位
? label:AccessibilityID 定位
? value:XPath 定位
用例演練
? 打開 UiCatalog
? 點(diǎn)擊 Buttons
? 斷言是否存在“More Info”按鈕
Page Object 模式
做法
? 以頁面為單位獨(dú)立建模
? 隱藏實(shí)現(xiàn)細(xì)節(jié)
? 本質(zhì)是面向接口編程
? 優(yōu)點(diǎn)
? 減少重復(fù) ?nd click 樣板代碼
? 易讀性提高
? 頁面修改不影響測試用例
Page?Object 六大設(shè)計(jì)原則
方法意義
? 用公共方法代表 UI 所提供的功能
? 方法應(yīng)該返回其他的 Page Object 或者返回用于斷言的數(shù)據(jù)
? 同樣的行為不同的結(jié)果可以建模為不同的方法
? 不要在方法內(nèi)加斷言
?字段意義
? 不要暴露頁面內(nèi)部的元素給外部
? 不需要建模 UI 內(nèi)的所有元素
登錄場景
? 登陸頁面提供 login ?ndPassword 功能
? Login 類 + login ?ndPassword 方法
? 登錄頁面內(nèi)的元素有多少并不關(guān)心,隱藏內(nèi)部界面控件
? 登錄成功和失敗會分別返回不同的頁面
? ?ndPassword
? loginSuccess
? loginFail
? 通過方法返回值判斷登錄是否符合預(yù)期
編寫用例順序
? 編寫用例
? 實(shí)現(xiàn) page頁面和?方法
? 調(diào)試使測試用例運(yùn)行通過
整體類似TDD風(fēng)格
BasePage 封裝
? 實(shí)現(xiàn)通用的 Page 方法,對常用自動化行為做封裝,其他頁面都需要繼承basepage
? 管理各種 Driver
? 減少每個(gè) Page 對 Appium、Selenium 等庫的太多依賴
自動化行為封裝
? 異常彈框處理:廣告、好評、升級、tips 等彈框
? 通用自動化能力封裝
Java Python的封裝方式
? Java:
? Page Factory + @FindBy
? Python:
? PyDOM、獨(dú)立封裝 如poium
基于 POM 的用例組織結(jié)構(gòu)
? page目錄:完成對頁面的封裝
driver聲明為WebDriver類型,可以在該類中調(diào)用driver的方法。?
class MainPage(BasePage):
_search_locator = (By.ID, "com.xueqiu.android:id/home_search")
def to_search(self):
#todo: too slow
self.find_element_and_click(self._search_locator)
return SearchPage(self.driver)
MainPage中點(diǎn)擊一個(gè)按鈕進(jìn)入另一個(gè)Page,所以返回searchPage?
? driver:完成對 Web、Android、iOS、接口的驅(qū)動
? testcase目錄:存放test_XX.py文件? 調(diào)用各類 page 完成業(yè)務(wù)流程并進(jìn)行斷言
? data:配置文件和數(shù)據(jù)驅(qū)動
? utils:其他便捷的功能封裝,可選
源碼:2504973175/Geek_AppAutomationTestingCode (gitee.com)
?
?
測試用例管理
? 用例組織結(jié)構(gòu):
? 使用 package 管理業(yè)務(wù)模塊
? 使用 class 管理業(yè)務(wù)對象、使用method完成業(yè)務(wù)具體行為
? 數(shù)據(jù)驅(qū)動:測試數(shù)據(jù)、測試步驟、測試斷言
? 測試用例:
? 使用 testcase 完成測試步驟的定義
? 使用 assertion 完成業(yè)務(wù)正確性校驗(yàn)
? 持續(xù)集成:使用 Jenkins 完成持續(xù)集成
Appium 錯(cuò)誤排查與日志分析
appium -g <log file path>
? shell 命令
? WebDriver 請求
? ChromeDriver 日志
調(diào)試分析方法
? Appium Log
清晰記錄了所有的請求和結(jié)果以及底層的一些錯(cuò)誤堆棧
? 分析界面數(shù)據(jù)
使用 getPageSource 獲取界面的完整 DOM 結(jié)構(gòu)
?利用 XPath 獲取所有匹配的元素
? 腳本外調(diào)試
借助于 curl 命令從腳本外探測界面數(shù)據(jù)
adb 知識與排錯(cuò)
?
adb 排錯(cuò)
? adb client:普通的 adb 命令,使用 shell 腳本代替
? adb server:
? pc 上的一直開啟的 server 進(jìn)程
? adb 命令通過 adb 協(xié)議與 adb server 通訊
? 通過代理轉(zhuǎn)發(fā)結(jié)合 capability
Appium 原理與 JSONWP 協(xié)議分析
WebDriver 協(xié)議與手工模擬
? WebDriver 協(xié)議基礎(chǔ)知識要懂
? session_id 獲取
? session_id= ` curl http://127.0.0.1:4723/wd/hub/sessions | awk -F\" '{print $8}' `
? element id 獲取
? curl -X POST http://127.0.0.1:4723/wd/hub/session/$session_id/elements --data-binary '{"using":"xpath" , "value":"http://*[@class=\"android.widget.Toast\"]"}' -H "Content-Type: application/ json;charset=UTF-8"
? 元素屬性獲取
? curl http://127.0.0.1:4723/wd/hub/session/$session_id/element/$element_id/attribute/text
? 元素動作
? curl -X POST http://127.0.0.1:4723/wd/hub/session/$session_id/element/$element_id/click
?Appium 源碼分析
所有源代碼
? appium server
? Node.js 系列包
? adb shell
? ChromeDriver
? 底層引擎
? Uiautomator Java
? WDA
? selenium
? appium client:Python、Java
Appium 二次封裝
自定義 Appium Server
? git clone文章來源:http://www.zghlxwxcb.cn/news/detail-635835.html
? npm install
重新編譯 Uiautomator
? git clone
? Gradle文章來源地址http://www.zghlxwxcb.cn/news/detail-635835.html
到了這里,關(guān)于移動端自動化測試實(shí)戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!