一、前言
項目閑置下來了,終于抽空有時間搞自動化了,看了下網(wǎng)上的教程基本通篇都是android自動化的介紹 ,ios自動化方面的內(nèi)容網(wǎng)上簡介的少之可憐。由于本人對ios自動化也是第一次做,甚至對蘋果電腦的使用都不太熟悉,花了大概一周時間粗略的看下ios開發(fā)知識,網(wǎng)上隨手下載的來源于這兩本《iOS開發(fā)從入門到精通.pdf》、《iOS開發(fā)指南:從零基礎(chǔ)到App上架.pdf 》、至于Mac筆記本的學(xué)習(xí)完全是邊使用邊查詢操作 ;本文完全秉著指導(dǎo)小白操作的流程帶你一步一步搭建IOS自動化測試環(huán)境
二、iOS 自動化相關(guān)框架介紹
自動化測試類工具 隨著移動互聯(lián)網(wǎng)的興起,APP 測試的越來越被重視!Android 系統(tǒng)因為自己的開源性,測試工具和測試方法比較廣為流傳,但是 iOS 系統(tǒng)的私密性,導(dǎo)致很多測試的執(zhí)行都有點麻煩。
為了幫助大家更好的執(zhí)行 iOS APP 的測試,以下為大家收集了非常全面的 iOS 測試工具,涵蓋各大領(lǐng)域,希望各位能有所認(rèn)識
三、自動化測試類工具
1. UIAutomation
UIAutomation 是蘋果提供的UI 自動化測試框架,使用 JavaScript 編寫。
基于 UIAutomation 有擴(kuò)展型的工具框架和驅(qū)動型的框架。擴(kuò)展型框架以 JavaScript 擴(kuò)展庫方法提供了很多好用 js 工具,注入式的框架通常會提供一些 Lib 或者是 Framework,要求測試人員在待測應(yīng)用的代碼工程中導(dǎo)入這些內(nèi)容,框架可以通過他們完成對 app 的驅(qū)動。
驅(qū)動型 UI Automation 在自動化測試底層使用了 UI Automation 庫,通過 TCP 通信的方式驅(qū)動 UI Automation 來完成自動化測試,通過這種方式,編輯腳本的語言不再局限于 JavaScript。
這個工具在 iOS UI 自動化測試中使用非常廣泛。
具體參考資料:https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/UIAutomation.html
2.XCTest
XCTest 是蘋果在 iOS 7 和 Xcode5 引入的一個簡單而強大的測試框架,集成在 Xcode 中,用來編寫測試代碼。它提供了各個層次的測試。
XCTest 測試編寫起來非常簡單,并且遵循 xUnit 風(fēng)格。
Xcode 在創(chuàng)建工程時,會默認(rèn)使用 XCTest,并且默認(rèn)創(chuàng)建了Unit Test(單元測試)和UI Test(界面測試)兩個 Target,其中 Unit Test 主要用于測試代碼的大部分基本功能,比如絕大多數(shù) Model 的類和方法測試,業(yè)務(wù)邏輯測試,網(wǎng)絡(luò)接口調(diào)用測試等等。
UI Test 一般會考慮到用戶的交互流程,模擬用戶的交互操作,利用 XCTest 的 UI 記錄特性來獲取界面上的一些列視圖元素和操作事件,然后在測試方法中觸發(fā)事件。
所以這是一個可以提供各個層次的測試的框架,比如單元測試,自動化測試,性能測試等。
具體參考資料:
https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/01-introduction.html
3. KIF
KIF 是 Keep It Functional 項目的縮寫,是一款iOS app 功能性測試框架,來自 Square,該測試框架只支持 iOS。
所有測試使用 Objective-C 語言編寫,對測試人員來講,需要熟練的掌握 Objective-C 語言 , 對蘋果開發(fā)者來說非常容易上手,更是一款開發(fā)者廣為推薦的測試工具。
KIF 使用未公開的 Apple API(私有 API),這對于測試目的而言是安全的,基于第三方 iOS UI 的單元測試框架,所以可以做項目的單元測試,也可以做 UI 集成測試。但缺點是運行較慢。
具體參考資料:https://github.com/kif-framework/KIF
4. Frank
Frank 是 iOS 開發(fā)環(huán)境下一款實現(xiàn)自動測試的工具,Xcode 環(huán)境下開發(fā)完成后,通過 Frank 實現(xiàn)結(jié)構(gòu)化的測試用例,其底層語言為 Ruby,作為一款開源的 iOS 測試工具,在國外已經(jīng)有廣泛的應(yīng)用。
但是國內(nèi)相關(guān)資料卻比較少。其最大的優(yōu)點是允許我們用熟悉的自然語言實現(xiàn)實際的操作邏輯。
它提供了針對 iOS 平臺的功能測試能力,可以模擬用戶的操作對應(yīng)用程序進(jìn)行黑盒測試,并且使用 Cucumber 編寫測試用例,使測試用例如同自然語言一樣描述功能需求,讓測試以“可執(zhí)行的文檔”的形式成為業(yè)務(wù)客戶與交付團(tuán)隊之間的橋梁。
優(yōu)點:測試場景是在 Cucumber 的幫助下,用可理解的英語句子寫的,還有活躍的社區(qū)支持,以及不斷擴(kuò)大中的庫。
缺點:對手勢的支持有限,所以在設(shè)備上運行測試有點難。
具體參考資料:https://www.testingwithfrank.com/
5. Calabash-iOS
Calabash 是一個適用于 iOS 和 Android 開發(fā)者的跨平臺 app 測試框架,可用來測試屏幕截圖、手勢和實際功能代碼。
Calabash 開源免費并支持 Cucumber 語言,Cucumber 能讓你用自然的英語語言表述 app 的行為,實現(xiàn) BDD(Behavior Driven Development,行為驅(qū)動開發(fā))。
而 Calabash-iOS 就是一個基于 Calabash 的 iOS 的功能、自動化測試框架。
優(yōu)點:
有大型社區(qū)支持;
列表項簡單,類似英語表述的測試語句支持在屏幕上的所有動作,如滑動,縮放,旋轉(zhuǎn),敲擊等。
缺點:
測試步驟失敗后,將跳過所有的后續(xù)步驟,這可能會導(dǎo)致錯過更嚴(yán)重的產(chǎn)品問題。
測試耗費時間,因為它總是默認(rèn)先安裝 app,需要 Calabash 框架安裝在 iOS 的 ipa 文件中, 因此測試人員必須要有 iOS 的 app 源碼。
除了 Ruby,對其他語言不友好
具體資料獲取路徑:https://github.com/calabash/calabash-ios
6. Subliminal
Subliminal 是另一款與 XCTest 集成的框架,也是個不錯 iOS 集成測試框架。
與 KIF 不同的是,它基于 UIAutomation 編寫,對開發(fā)者隱藏 UIAutomation 中一些復(fù)雜的細(xì)節(jié)。可惜近幾年沒有更新了,若能支持 swift 就好了。
具體資料獲取路徑:https://github.com/Diaoul/subliminal
7. Kiwi
Kiwi 是對 XCTest 的一個完整替代,使用 xSpec 風(fēng)格編寫測試。Kiwi 帶有自己的一套工具集,包括 expectations、mocks、stubs,甚至還支持異步測試。
它是一個適用于 iOS 開發(fā)的 Behavior Driven Development(BDD)庫,有著非常漂亮的語法。
優(yōu)點在于其簡潔的接口和可用性,易于設(shè)置和使用,可以寫出結(jié)構(gòu)性強易讀測試,非常適合新手開發(fā)者。
Kiwi 也是使用 Objective-C 語言編寫,易于 iOS 開發(fā)人員上手。
具體資料獲取路徑:https://github.com/kiwi-bdd/Kiwi8. Appium
Appium 是一個開源的、跨平臺的自動化測試工具,支持 iOS、Android 和 FirefoxOS 平臺。
通過 Appium,開發(fā)者無需重新編譯 app 或者做任何調(diào)整,就可以測試移動應(yīng)用,可以使測試代碼訪問后端 API 和數(shù)據(jù)庫。
它是通過驅(qū)動蘋果的 UIAutomation 框架來實現(xiàn)的 iOS 平臺支持。
開發(fā)者可以使用 WebDriver 兼容的任何語言編寫測試腳本,如 Ruby,C#,Java, JS,OC, PHP,Python,Perl 和 Clojure 語言。
具體資料獲取路徑:http://appium.io/
內(nèi)測發(fā)布工具
1. fir.im
為開發(fā)者提供測試應(yīng)用極速發(fā)布,應(yīng)用崩潰實時分析、用戶反饋收集等一系列開發(fā)測試效率工具服務(wù),幫助開發(fā)者將更多精力放在產(chǎn)品的開發(fā)與應(yīng)用的優(yōu)化上。
2. 蒲公英
『蒲公英』是專為 iOS、Android 開發(fā)者提供的免費用應(yīng)用內(nèi)測、托管的平臺,旨在解決開發(fā)者將應(yīng)用分發(fā)給內(nèi)測用戶時的繁雜、低效的問題。
3. TestFlight
TestFlight 是蘋果提供的應(yīng)用測試工具,允許開發(fā)者邀請用戶對應(yīng)用的預(yù)發(fā)布版本進(jìn)行測試,從而在應(yīng)用正式發(fā)布至 App Store 前收集用戶反饋。
以上常用框架介紹完了,本篇幅主要以appium進(jìn)行實踐講解
Appium驅(qū)動IOS測試原理
XCUITest是蘋果開發(fā)的一個做IOS自動化測試的框架,需要了解些Swift等iOS編程知識WebDriverAgent是Facebook開發(fā)的一個iOS自動化測試工具,先來看下面的這張原理圖:
WDA在Client創(chuàng)建了一個Server,在手機端安裝了一個叫作WebDriverAgentRunner 的一個應(yīng)用;這個應(yīng)用會接收來自 Server 的指令,并連接底層的 XCTest.framwork,讓 XCTest.framwork 調(diào)用蘋果API來操作手機進(jìn)行自動化
而appium是把WebDriverAgentRunner 給集成進(jìn)去了,因此實現(xiàn)了appium的跨平臺能力
通過上圖我們了解到 Appium 很粗暴的把整個 WebDriverAgent 直接集成到自己的項目里,然后通信機制就走 WebDriverAgent,Appium 其實就提供了一個 Client 端的作用。所以 iOS 9.3 系統(tǒng)之后自動化測試核心是 WebDriverAgent,Appium 就提供了一個 Client 端來寫腳本和發(fā)送指令。
Appium 自動化架構(gòu)模式可以用一個抽象的架構(gòu)表示,就是下面這樣的:
從圖中可以看出:
Client 端是 Appium 之前本身提供的;
Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整個集成進(jìn)來,Instruments 是為了支持 iOS 9.3 之前的系統(tǒng))
最右邊是一個手機
之前 Server 是和 bootstrap.jar 通信,這里 WebDriverAgent 提供了 WebDriverAgentRunner (類似 bootstrap.jar 的功能),WebDriverAgent與之通信;
WebDriverAgentRunner 是一個應(yīng)用,Client 和 server 運行了之后,WebDriverAgentRunner 會被裝到手機上,這個應(yīng)用會接收來自 Server 的指令,并連接底層的 XCTest.framwork,并告訴 XCTest.framwork 操作手機進(jìn)行自動化。
關(guān)于 WebDriverAgent
FaceBook 出品:
實現(xiàn)了一個 server,通過 server 可以遠(yuǎn)程控制 iOS 設(shè)備:啟動應(yīng)用、關(guān)閉應(yīng)用、點擊、滾動等操作;
通過連接 XCTest.framework 調(diào)用蘋果的 API 執(zhí)行動作;
支持多個設(shè)備同時進(jìn)行自動化;
Appium、Macaca 已經(jīng)集成。
但是 WebDriverAgent 僅僅只提供了一個 server(和 inspect 進(jìn)行元素定位),并沒有像 Appium 一樣提供 java 或 python 的 Client 端去寫腳本,腳本執(zhí)行的時候發(fā)送指令給 server,然后去運行。WebDriverAgent 要求你自己去實現(xiàn) Client 端,即拿 Java/ Python 的 WebDriver 庫進(jìn)行封裝,然后發(fā)送指令。所以 WebDriverAgent 其實就類似于 Appium server,就只是一個 server。
基礎(chǔ)環(huán)境搭建
基礎(chǔ)環(huán)境:一臺蘋果筆記本、一個iphone手機
基礎(chǔ)環(huán)境
MacBook Pro: 10.15.7
Macbook Pro(做 iOS 測試,Mac 是繞不開的,我們依賴的軟件環(huán)境需要運行在 Mac 上,必須要有一臺 Mac 本(很貴),得攢銀子咬牙買一臺 ~,我用的公司分配的測試本)。
iphone真機:iPhone 8 Plus 14.4
iPhone、iPad:既然測試 iOS 軟件,那 iPhone 和 iPad 也自然不用多說了,雖然 Xcode 里有虛擬機,但是實際測試還是以真機為準(zhǔn)。本文也主要以真機為準(zhǔn)
appium:1.20.2
appium原理
Appium是一個開源、跨平臺的測試框架,可以用來測試原生及混合的移動端應(yīng)用。Appium支持IOS、Android及FirefoxOS平臺。Appium使用WebDriver的json wire協(xié)議,來驅(qū)動Apple系統(tǒng)的UIAutomation庫、Android系統(tǒng)的UIAutomator框架。Appium對IOS系統(tǒng)的支持得益于Dan Cuellar’s對于IOS自動化的研究。Appium也集成了Selendroid,來支持老android版本。
Appium支持Selenium WebDriver支持的所有語言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl語言,更可以使用Selenium WebDriver的Api。Appium支持任何一種測試框架。如果只使用Apple的UIAutomation,我們只能用javascript來編寫測試用例,而且只能用Instruction來運行測試用例。同樣,如果只使用Google的UIAutomation,我們就只能用java來編寫測試用例。Appium實現(xiàn)了真正的跨平臺自動化測試。
appium選擇了client-server的設(shè)計模式。只要client能夠發(fā)送http請求給server,那么的話client用什么語言來實現(xiàn)都是可以的,這就是appium及webdriver如何做到支持多語言的;
Appium優(yōu)點
開源
跨架構(gòu):Native App、Hybird App、Web App
跨設(shè)備:Android、iOS、Firefox OS
不依賴源碼
使用任何 WebDriver 兼容的語言來編寫測試用例。比如 Java, Objective-C, JavaScript with Node.js (in both callback and yield-based flavours), PHP, Python, Ruby, C#, Clojure, 或者 Perl.
不需要重新編譯APP
支持IOS手機錄制視頻
Appium理念
你無需為了自動化,而重新編譯或者修改你的應(yīng)用。
你不必局限于某種語言或者框架來寫和運行測試腳本。
一個移動自動化的框架不應(yīng)該在接口上重復(fù)造輪子。(移動自動化的接口應(yīng)該統(tǒng)一)
無論是精神上,還是名義上,都必須開源。
Appium 在 iOS 下工具的變革:
iOS 9 之前一直以 instruments 下的 UIAutomation為驅(qū)動底層技術(shù)(弊端由于 instruments 的限制,單臺 mac 只能對應(yīng)單臺設(shè)備);
iOS 9.3 時代推出 XCUITest 工具,用以替代 UIAutomation;
iOS 10 時代蘋果直接廢棄了 UIAutomation、Facebook 推出 WebDriverAgent(實現(xiàn)的 server 能夠支持單臺 mac 對應(yīng)多個設(shè)備);
Appium 在iOS 9.3 后全面采用 WebDriverAgent 的方案。
xcode: 12.4
MacBook appstore應(yīng)用商店搜索下載即可
安裝內(nèi)容
前提環(huán)境:
python , selenium , setuptools、pip
通用環(huán)境:
Homebrew ,Node & NPM ,Carthage ,Appium ,python-client ,Appium-Doctor , ios-deploy , ideviceinstaller & libimobiledevice , ios_webkit_debug_proxy , authroize-ios
IOS環(huán)境:
xCode , Command Line Tools
前提環(huán)境
python
此處使用python3 , 官網(wǎng)下載https://www.python.org/ 一步下一步安裝即可
selenium
終端輸入: pip install Selenium 安裝最新版本的selenium。pip install Selenium 如需安裝指定的版本,則pip install Selenium==版本號。
setuptools、pip
下載setuptools
https://pypi.python.org/pypi/setuptools 、https://pypi.python.org/pypi/pip
打開cmd 進(jìn)入setuptools解壓目錄,輸入:python setup.py install
進(jìn)入pip解壓目錄,輸入:python setup.py install
安裝好后,打開終端,輸入pip,如提示不是內(nèi)部命令,則將python安裝目錄下Scripts目錄添加到環(huán)境變量Path中。
通用環(huán)境
Homebrew
Homebrew是一個包管理軟件,它可以使我們更容易地安裝其他一些軟件
/usr/bin/ruby-e"$(curl–fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"
覆蓋安裝:
/usr/bin/ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"brew-v//檢查homebrew是否安裝 brewlist//查看已安裝列表 brewupdate//更新Homebrew
如果安裝失?。?/p>
可以打開網(wǎng)址:http://vip.ytesting.com/q.do?a&id=ff80808172521d8201726a74986f0880 將其內(nèi)容保存為homebrew.txt,
然后終端輸入:
/usr/bin/rubyhomebrew.txt
注意:此步驟還順帶安裝了Xcode命令行工具(xcode-commaindline-tools)。
檢查homebrew是否安裝
終端輸入安裝:
Node & NPM
Node是一個javascript運行時環(huán)境,npm是節(jié)點包管理器。我們需要這些,因為Appium是一個節(jié)點應(yīng)用程序。
node-v重新安裝:brewreinstallnodenpmconfigsetregistryhttps://registry.npm.taobao.org/
默認(rèn)的npm源再國內(nèi)都很慢,安裝好node之后需要重新配置一個國內(nèi)源 (非必須)
在終端中,輸入以下命令(此命令也將安裝npm):
brewinstallnode
查看node版本
Carthage
Carthage項目依賴管理, 類似于 java 的 maven;主要是 WebDriverAgent 使用,WebDriverAgent 是用它做項目依賴的
brewinstallcarthage
更新carthage : rew upgrade carthage
重新安裝 : brew reinstall carthage2. 安裝完成后檢查一下是否安裝成功
carthageversion//打印出版本號即表示安裝成功
終端輸入:
Appium
Appium是一個用于本地、混合和移動web應(yīng)用程序的開源測試自動化框架。它使用WebDriver協(xié)議驅(qū)動iOS、Android和Windows mobile應(yīng)用程序。
安裝 Appium(二選1) ;
兩者基本沒什么區(qū)別:非要說區(qū)別的話 ,方式1 安裝版本較穩(wěn)定 方式2則版本最新。
方式1:安裝桌面版 appium-server(推薦)桌面版包含了appium-server,同時也包含一個元素定位器,建議安裝桌面版。
方式2:安裝 appium-server 版
npminstall-gappium
默認(rèn)安裝最新的版本,如果想安裝指定的版本:
npminstall-gappium@1.7.2
卸載 Appium:
npmuninstall-gappium npmcacheclean--forceappium-v
啟動appium服務(wù)
appium& [1]965$[Appium]WelcometoAppiumv1.9.1 [Appium]AppiumRESThttpinterfacelistenerstartedon0.0.0.0:4723
安裝完成之后輸入appium -v,顯示版本號表示appium server安裝成功
終端安裝server版輸入
python-client
下載python-client
gitclonegit@github.com:appium/python-client.git
安裝python-client
cdpython-client#進(jìn)入python-client目錄 pythonsetup.pyinstall#安裝python-client
Appium-Doctor
檢查appium安裝是否成功的工具集指令
npminstallappium-doctor-gappium-doctor--ios
備注:necessary dependcies 必須全部是對勾狀態(tài) ,可選部分依賴可以不用全部安裝
檢查 iOS環(huán)境是否安裝成功
安裝 appium-doctor
ios-deploy
ios-deploy 一個不需要用Xcode安裝和調(diào)試應(yīng)用的命令行工具。需要一個有效的開發(fā)者證書,需要 Xcode 7以上的版本。終端輸入命令進(jìn)行安裝:
brewinstallios-deploy#安裝命令 brewreinstallios-deploy#重新安裝 brewupgradeios-deploy#更新命令
常用命令如下:
ios-deploy-c#查看當(dāng)前鏈接的設(shè)備 ios-deploy--[xxx.app]#安裝APP ios-deploy--id[udid]--uninstall_only--bundle_id[bundleId]#卸載應(yīng)用 ios-deploy--id[udid]--list_bundle_id#查看所有應(yīng)用 ios-deploy--id[udid]--exists--bundle_id#查看應(yīng)用是否安裝
ideviceinstaller & libimobiledevice
ios-deploy、ideviceinstaller 類似 android 的 adb;是 Appium 底層用到的工具之一,用于獲取 iOS 設(shè)備信息。
brewinstallideviceinstaller#用于查看bundleid brewreinstallideviceinstaller#重新安裝brewinstalllibimobiledevice--HEAD#安裝最新的更新 brewreinstalllibimobiledevice#重新安裝
其常用命令如下:
idevice_id-l#顯示當(dāng)前所連接設(shè)備的udid instruments-sdevices#列出所有設(shè)備,包括真機、模擬器、macideviceinstaller-u[udid]-i[xxx.ipa]#xxx.ipa為應(yīng)用在本地的路徑ideviceinstaller-u[udid]-U[bundleId]ideviceinstaller-u[udid]-l#查看設(shè)備安裝的第三方應(yīng)用 ideviceinstaller-u[udid]-l-olist_user#同上,查看設(shè)備安裝的第三方應(yīng)用 ideviceinstaller-u[udid]-l-olist_system#查看設(shè)備安裝的系統(tǒng)應(yīng)用 ideviceinstaller-u[udid]-l-olist_all#查看設(shè)備安裝的所有應(yīng)用ideviceinfo-u[udid]#獲取設(shè)備信息 ideviceinfo-u[udid]-kDeviceName#獲取設(shè)備名稱同命令 idevicenameidevicename#同上 ideviceinfo-u[udid]-kProductVersion#獲取設(shè)備版本10.3.3 ideviceinfo-u[udid]-kProductType#獲取設(shè)備類型iPhone8,1 ideviceinfo-u[udid]-kProductName#獲取設(shè)備系統(tǒng)名稱idevicesyslog#屏幕上即可看見手機上所有的日志 idevicesyslog>>iphone.log重定向日志到文件中idevicecrashreport#參數(shù)可設(shè)置具體文件存放位置idevicescreenshot#獲取當(dāng)前截屏,效率比appium截屏高10倍ideviceinfo#獲取設(shè)備所有信息 idevicesyslog#獲取設(shè)備日志 idevicecrashreport-etest#獲取設(shè)備 crashlog,test是文件夾需新建 idevicediagnostics#管理設(shè)備狀態(tài)-重啟、關(guān)機、睡眠等idevicediagnosticsrestart
重啟
其他系統(tǒng)文件信息
截屏
獲取手機端崩潰報告
查看手機實時日志
獲取設(shè)備信息
查看設(shè)備已安裝的應(yīng)用
卸載應(yīng)用
安裝應(yīng)用
查看當(dāng)前所連接的設(shè)備
ideviceinstaller 是一個與iOS設(shè)備的installation_proxy交互的工具,允許安裝、升級、卸載、存檔、還原和列舉已安裝或存檔的app。此工具用于在真機上運行測試,默認(rèn)是都安裝的。
libimobiledevice 是一個跨平臺的軟件庫 ;不依賴任何已有的私有庫,不需要越獄。應(yīng)用軟件可以通過這個開發(fā)包輕松訪問設(shè)備的文件系統(tǒng)、獲取設(shè)備信息,備份和恢復(fù)設(shè)備,管理 SpringBoard 圖標(biāo),管理已安裝應(yīng)用,獲取通訊錄、日程、備注和書簽等信息
ios_webkit_debug_proxy
Appium使用ios_webkit_debug_proxy這個工具在真機上訪問web view。即混合應(yīng)用的測試 ;在終端中,運行以下命令:
brewinstallios-webkit-debug-proxy#安裝命令 brewreinstallios-webkit-debug-proxy#重新安裝
附:
iOS WebKit Debug Proxy的原理是在本地起了一個代理做WebInspector到WebKit遠(yuǎn)程調(diào)試的協(xié)議轉(zhuǎn)發(fā)。
authroize-ios
iOS 授權(quán)工具,主要用于模擬器中一些權(quán)限的授權(quán);
npminstall-gauthroze-iossudoauthroze-ios sudoauthroze-ios
iOS 環(huán)境
Xcode
安裝Xcode和模擬器 :
啟動Mac應(yīng)用程序商店并下載/安裝Xcode(Version 13.1)。安裝之后,啟動Xcode并選擇 Xcode > Preferences > Components 來安裝可能想要測試的模擬器。
安裝Command Line Tools
默認(rèn)是不會安裝Command Line Tools的,Command Line Tools是在Xcode中的一款工具,可以在命令行中運行C程序。為了配置appium環(huán)境,我們需要安裝Xcode Command Line Tools。
官網(wǎng)下載
方法一:
xcode-select--install#查看是否安裝 xcode-select:error:commandlinetoolsarealreadyinstalled,use"SoftwareUpdate"to install updates(錯誤:命令行工具已經(jīng)安裝,請使用“軟件更新”安裝更新)
方法二:
打開Xcode,創(chuàng)建一個新的項目,在OSX下面選擇Application,如果右側(cè)出現(xiàn)Command line tool圖 標(biāo),表示已經(jīng)安裝成功。
方法三:
打開XCode 新建工程,如果安裝了,在新建窗口可以看到
xcodebuild-version
如果已經(jīng)安裝過xcode,appium-doctor提示未安裝,則運行命令即可:
sudoxcode-select-r
附錄:
xcrunsimctllist|grep'(Booted)'#查看已啟動的模擬器udid instruments-sdevices#列出所有設(shè)備,包括真機、模擬器、mac #錄像功能 xrecord--quicktime--list xrecord--quicktime--name="iPhone"--out="/Users/yong/video/iphone.mp4"--force
安裝完成后,在終端中輸入以下命令來查看安裝版本:
下載完成后,雙擊已下載的 .dmg 進(jìn)行安裝
檢驗 Command Line Tools 是否安裝成功
至此iOS環(huán)境搭建完畢?。?!只適用于模擬器,真機的話還需要配置。
iOS 真機調(diào)試環(huán)境配置
前面我們知道WebDriverAgent是集成Appium測試ios應(yīng)用的橋梁 (表現(xiàn)形式上:是安裝在ios設(shè)備上的一個應(yīng)用),WebDriverAgent 先前是一個獨立的項目需要自己從github下載進(jìn)行編譯執(zhí)行 ,在后來appium已經(jīng)強行將其綁定在其組件中也就是說當(dāng)你安裝好appium時,WebDriverAgent也自動幫忙將其安裝好,只需要手動修改部分內(nèi)容,重新編譯打包即可運行。
方式一:WebDriverAgent通過下載源碼進(jìn)行安裝
不推薦通過此種方式安裝,該方式先前是為老版本ios 9.4 之前的版本沿用 ,且 github上的源碼已經(jīng)距離現(xiàn)在兩年多沒有更新了,為避免不必要的問題。盡可能不要使用此種方式
安裝webdriverAgent
(1) 在github上下載最新webdriverAgent代碼
gitclonehttps://github.com/facebook/WebDriverAgent
(2)下載依賴
cd/Users/yourname/WebDriverAgent mkdir-pResources/WebDriverAgent.bundle sh./Scripts/bootstrap.sh
該腳本會使用Carthage下載所有的依賴,使用npm打包響應(yīng)的js文件。執(zhí)行完成后,直接雙擊打開WebDriverAgent.xcodeproj這個文件。
配置webdriverAgent
配置WebDriverAgentLib,選擇開發(fā)者賬號
配置WebDriverAgentRunner,選擇開發(fā)者賬號
連接并選擇自己的ios設(shè)備,運行
運行成功后,iphone手機上會新建一個無圖標(biāo)的WebDriverAgent的應(yīng)用,自動打開后馬上又返回桌面
而在xcode控制臺會打印如下日志:
里面有IP地址與端口號
在網(wǎng)址上輸入http://(ip地址):(端口號)/status,如果網(wǎng)頁上返回一些json格式的數(shù)據(jù),說明運行成功http://10.0.223.58:8100/status,有些iphone手機通過手機的IP和端口號還不能訪問,此時需要將手機的端口轉(zhuǎn)發(fā)到mac上
iproxy 8100 8100 # iproxy 8300 8100
執(zhí)行命令后,通過訪問 http://localhost:8100/ status來驗證, 如果網(wǎng)頁上返回一些json格式的數(shù)據(jù),說明運行成功
而如果是想查看UI的圖層,則可訪問http://localhost:8100/inspector,方便書寫測試用例
備注:
通常來說為了持續(xù)集成,自動化會比較好一些,我們不必每次都通過這種方式來啟動xcode、WebDriverAgent,這種方式只在第1次搭建環(huán)境時運行即可,我們可以在自動化腳本中加入如下代碼,這樣只要在以后啟動appium后,運行自動化腳本,就會直接啟動WebDriverAgent
desiredCapabilities.setCapability("useNewWDA", true);
如果xcode在先啟動wda,而代碼中又用此行代碼,運行時xcode中會顯示執(zhí)行失敗,報出沖突的錯誤哦,所以后期只在代碼中啟動WebDriverAgent即可,不再需要用xcode啟動
精簡過程如下:
方式二:WebDriverAgent通過集成appium進(jìn)行安裝
命令行安裝:命令行安裝的appium一般安裝在/usr/local/bin/appium下,
WebDriverAgent將會在路徑:/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/ 下
桌面版安裝:WebDriverAgent的路徑是:ls /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent
以上兩種方式都可以在對應(yīng)目錄看到 WebDriverAgent.xcodeproj 工程,右鍵選擇用xcode打開 ;在 “Signing&Capabilities” 下將 WebDriverAgentLib 和 WebDriverAgentRunner設(shè)置成 “Automatically manage signing” 并在 “Team” 中選擇你的開發(fā)團(tuán)隊
新用戶第一次需要創(chuàng)建Team團(tuán)隊
剩下操作步驟和方式一種第3步一樣, 不在此列出 ;
IOS自動化-WebDriverAgent-APPIUM框架原理
WebDriverAgent是Facebook開發(fā)的基于XCTest.framework的開源項目,實現(xiàn)了在iOS上支持WebDriver協(xié)議的服務(wù),可以用來啟動/終止APP,點擊/滑動頁面。
webdriver協(xié)議是一套基于HTTP協(xié)議的JSON格式規(guī)范,協(xié)議規(guī)定了不同操作對應(yīng)的格式。之所以需要這層協(xié)議,是因為iOS、Android、瀏覽器等都有自己的UI交互方式,通過這層”驅(qū)動層“屏蔽各平臺的差異,就可以通過相同的方式進(jìn)行自動化的UI操作,做網(wǎng)絡(luò)爬蟲常用的selenium是瀏覽器上實現(xiàn)webdriver的驅(qū)動,而WebDriverAgent則是iOS上實現(xiàn)webdriver的驅(qū)動。
Appium客戶端
在iOS上的客戶端實際上就是使用了WebDriverAgent,作為實現(xiàn)webdriver協(xié)議的驅(qū)動層。
Appium服務(wù)端
Appium的服務(wù)端是一個桌面應(yīng)用,用于和客戶端通信,啟動Appium的服務(wù)端之后,會在電腦上啟動一個默認(rèn)端口號是4723的HTTP服務(wù)。當(dāng)我們編寫完腳本執(zhí)行時,腳本代碼會被轉(zhuǎn)換為webdriver協(xié)議的JSON數(shù)據(jù),通過HTTP請求發(fā)送到電腦的4723端口。Appium服務(wù)端將腳本的執(zhí)行請求下發(fā)給客戶端(請求客戶端的6100端口),客戶端同樣使用webdriver協(xié)議響應(yīng)
利用Appium-Python-Client進(jìn)行iOS的自動化測試
配置 appium 工具
運行 Appium-Desktop
開啟start server
點擊start new session并且在Desired Capabilities 中輸入相關(guān)的參數(shù)后點擊Start Session
運行成功后,會彈出一個控制界面,在該界面中可以控制手機上正在運行的程序
開始自動化測試
打開下載后的appiumSimpleDemo文件,打開appiumSimpleDemo.xcodepro程序,配置下TARGET的簽名
在appiumSimpleDemo的根目錄執(zhí)行編譯指令,編譯出一個app文件xcodebuild -sdk iphoneos -target appiumSimpleDemo -configuration Release,編譯成功后app文件的地址會打印在命令行中 ;此處直接使用 xcode進(jìn)行編譯也可以 ,怎么方便怎么來
執(zhí)行appiumSimpleDemo.py 文件路徑如下:/Users/jx/PycharmProjects/53ui_ios/venv/bin/python /Users/jx/appiumSimpleDemo/appiumSimpleDemo.py
源碼如下:
importunittest importos fromappiumimportwebdriver fromtimeimportsleep classappiumSimpleTezt(unittest.TestCase): defsetUp(self): app_path='/Users/jx/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app' app=os.path.abspath(app_path) self.driver=webdriver.Remote( command_executor='http://127.0.0.1:4723/wd/hub', desired_capabilities={ 'app':app, 'platformName':'iOS', 'platformVersion':'14.4', 'deviceName':'iPhone8plus', 'bundleId':'com.yongapps.app', 'udid':'4c7a46cee7f512ff1463eb3b09dc5329e779355c' } ) deftest_push_view(self): next_view_button=self.driver.find_element_by_accessibility_id("entrynextview") next_view_button.click() sleep(2) back_view_button=self.driver.find_element_by_accessibility_id("Back") back_view_button.click() deftearDown(self): sleep(1) #self.driver.quit() if__name__=='__main__': suite=unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt) unittest.TextTestRunner(verbosity=2).run(suite)
踩坑筆記
問題1:如果安裝 carthage出現(xiàn)以下錯誤:
Error:Anunexpectederroroccurredduringthebrewlinkstep Theformulabuilt,butisnotsymlinkedinto/usr/local Permissiondenied@dir_s_mkdir-/usr/local/Frameworks Error:Permissiondenied@dir_s_mkdir-/usr/local/Frameworks
原因是carthage已經(jīng)安裝,但是沒有 link 到 brew,還有就是文件夾權(quán)限問題,在終端輸入:
MacBook-pro~%sudomkdir/usr/local/Frameworks MacBook-pro~%sudochown$(whoami):admin/usr/local/Frameworks MacBook-pro~%brrewlinkcarthage
問題2:安裝 libimobiledevice & ideviceinstaller 遇到:“invalid active developer path”
運行:
MacBook-pro~%xcode-select--install MacBook-pro~%sudoxcode-select-r
可能出現(xiàn)的問題
dyld:Librarynotloaded:/usr/local/opt/openssl/lib/libssl.1.0.0.dylibReferencedfrom: /usr/local/opt/libimobiledevice/lib/libimobiledevice.6.dylibReason:imagenotfound
如果遇到如上錯誤,則先卸載ideviceinstaller 和 libimobiledevice
MacBook-pro~%brewuninstallideviceinstaller MacBook-pro~%brewuninstalllibimobiledevice
然后再重安裝即可
問題3:ios-webkit-debug-proxy 安裝遇到 The following directories are not writable by your user:
詳細(xì)錯誤提示:
Thefollowingdirectoriesarenotwritablebyyouruser: /usr/local/share/man/man5 /usr/local/share/man/man7
解決方法:因為是該目錄無權(quán)限無法寫入的問題,所以直接sudo給上權(quán)限就可以了,然后再使用安裝命令就可以了,示例如下圖:
問題4:xcode-select --install命令行安裝提示 Xcode alone is not sufficient on Sierra.
Error:XcodealoneisnotsufficientonSierra. InstalltheCommandLineTools: xcode-select--install
解決方案:Mac最新場景下安裝Xcode時已經(jīng)沒有Command Line了,需要單獨安裝。根據(jù)提示在使用命令xcode-select --install` 安裝時最后結(jié)果是不能安裝該軟件。需要安裝如上所示
問題5:方式一 安裝WebDriverAgent 執(zhí)行 ./Scripts/bootsrap.sh 出錯如下
安裝最后我們可以看到部分依賴安裝需要安裝 Carthage 這個東西,如果沒注意的話就會造成 RoutingHTTPServer 部分文件缺失,后面 build 就會報錯 。
通過命令 brew install carthage 安裝后再執(zhí)行 ./Scripts/bootstrap.sh 即可。
根據(jù) WebDriverAgent 官網(wǎng)提供的步驟,將參數(shù)替換為我們真機的參數(shù)后在真機上嘗試build 。
執(zhí)行完命令后可能會出現(xiàn)如下報錯
從報錯信息來看,缺少 development team,那么我們回到 Xcode,將 Automatically manage signing 進(jìn)行勾選后選擇一個 Team,注意要進(jìn)入 WebDriverAgentRunner 中進(jìn)行設(shè)置 。設(shè)置好之后又會出現(xiàn)報錯
這個報錯信息就和我們之前提到的一樣,bundle indentifler 不唯一,保險起見,這里將項目中所有的 Targets 都進(jìn)行了修改
修改好之后我們再次 build,之前的問題解決了,不幸的是 build 又 fail 了,又出現(xiàn)了新的報錯:
解決辦法:
沒錯,我們在報錯出雙擊,進(jìn)入到報錯代碼處,將 assign 改為 strong 后再次 build :
Build succeeded ?。?!老淚縱橫…
最終,再執(zhí)行
最后踩坑:build成功后,ios真機上沒有安裝WDA這個問題困擾了我一個星期,然后最后我把ios設(shè)備名改成英文后安裝成功了。。。
終于在 iOS 真機上看到了 WDA 的身影
問題6:執(zhí)行 ./Scripts/bootstrap.sh ERROR in ./js/app.js 報錯 出錯如下
問題7: 執(zhí)行時候報 xcodebuild failed with code 65 錯誤
問題8: 個人證書調(diào)試失敗
Failed to register bundle identifier.The app identifier "com.facebook.WebDriverAgentRunner" cannot be registered to your development team because it is not available. Change your bundle identifier to a unique string to try again.
需要手動更改目標(biāo)的bundle id,方法是進(jìn)入“Build Settings”選項,更改“Product bundle Identifier”的值使Xcode將接受,默認(rèn)為com.facebook.WebDriverAgentRunner,你需要改成不一樣的,如:io.automation.WebDriverAgentRunner (此處必須修改為和你在蘋果開發(fā)者后臺申請的bundle Id 一樣 )
返回 “Signing&Capabilities” 選項,看到對于文件WebDriverAgentRunner的配置文件已經(jīng)創(chuàng)建成功了
問題9: 解決警告問題
解決方案如下:
問題10: 將WDA安裝到被測手機上,安裝失敗 ,提示如下
報錯: error:Noprofilesfor'io.uitest.WebDriverAgentRunner.xctrunner'werefound:Xcodecouldn'tfindanyiOSAppDevelopmentprovisioningprofilesmatching'io.uitest.WebDriverAgentRunner.xctrunner'.Automaticsigningisdisabledandunabletogenerateaprofile.Toenableautomaticsigning,pass-allowProvisioningUpdatestoxcodebuild.(intarget'WebDriverAgentRunner'fromproject'WebDriverAgent')
報這個錯是因為沒有接入相關(guān)的設(shè)備到MAC上,只要設(shè)備接入,并通過XCode菜單:Product->Destnation->"Select Devices"選中要連接的設(shè)備就行。
解決方案:
XCode:Product->Destination->"Select your iphone"
Product->Scheme->"Select WebDriverAgentRunner"
Product -> Test
注意:運行Test之前,手機先解鎖再通過USB線連接到電腦。
問題10: 解決Product -> Test報錯問題,如下所示
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeprojUser-suppliedCFBundleIdentifiervalue'com.facebook.wda.lib'intheInfo.plistmustbethesameasthePRODUCT_BUNDLE_IDENTIFIERbuildsettingvalue'com.facebook.WebDriverAgentLib'.
解決方案:
運行報錯:
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h9:'CocoaAsyncSocket/GCDAsyncSocket.h'filenotfound
解決:進(jìn)入appium-webdriveragent目錄,重新執(zhí)行:
MacBook-pro%cd/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent MacBook-proappium-webdriveragent%sh./Scripts/bootstrap.sh
再次執(zhí)行Product -> Test,彈出密鑰授權(quán)彈窗,輸入密鑰(多次輸入密鑰,直到彈窗消失)
最后報錯:Command CodeSign failed with a nonzero exit code解決方案---通過終端命令:
MacBook-proappium-webdriveragent%xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination'id=000-000080E'test
執(zhí)行中會彈出密鑰彈窗,多次輸入密鑰,直到彈窗消失
最后機上可以看到一個沒有圖標(biāo)的 WebDriverAgentRunner.app 應(yīng)用,進(jìn)入設(shè)置 -》通用 -》設(shè)備管理 -》點擊 開發(fā)者app下面的證書 -》點擊“第一個藍(lán)色字體信任按鈕” -》點擊信任,再重新執(zhí)行項目即可正常連接xcode點擊直接運行:
再次報錯:
/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeprojUser-suppliedCFBundleIdentifiervalue'com.facebook.wda.runner'intheInfo.plistmustbethesameasthePRODUCT_BUNDLE_IDENTIFIERbuildsettingvalue'io.uitest.WebDriverAgentRunner'.
解決方案:
最終看到這樣輸出就是成功了:
TestSuite‘Alltests’startedat2017-01-231512.585 TestSuite‘WebDriverAgentRunner.xctest’startedat2017-01-231512.586 TestSuite‘UITestingUITests’startedat2017-01-231512.587 TestCase‘-[UITestingUITeststestRunner]’started. t=0.00sStartTestat2017-01-231512.588 t=0.00sSetUp
備注:
xxx.app為 Xcode 編譯后的應(yīng)用安裝包路徑
xxx.ipa為應(yīng)用在本地的路徑
問題11: wda安裝成功了,但是 驗證時訪問無結(jié)果
解決方案:
有些國產(chǎn)的iPhone機器通過手機的IP和端口還不能訪問,此時需要將手機的端口轉(zhuǎn)發(fā)到Mac上。
使用--HEAD安裝最新版本
$brewinstalllibimobiledevice--HEAD$iproxy81008100
這時通過訪問http://localhost:8100/status確認(rèn)WDA是否運行成功。
此時你應(yīng)該可以看到有返回信息,只不過返回的sessionID 為空 ,此處如果有問題見問題12
問題12: Appium 重簽名后的 wda 正常啟動了,但是沒有返回 sessionID
wda 的日志如下:
TestSuite'WebDriverAgentRunner.xctest'startedat2020-06-121528.188 TestSuite'UITestingUITests'startedat2020-06-121528.188 2020-06-121528.215329+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardAutocorrection )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.221426+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardPrediction )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.222215+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( KeyboardShowPredictionBar )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess 2020-06-121528.224043+0800WebDriverAgentRunner-Runner[616:123635][UserDefaults]Couldn'twritevaluesforkeys( DidShowGestureKeyboardIntroduction )inCFPrefsPlistSource<0x282b9ed00>(Domain:com.apple.Preferences,User:kCFPreferencesCurrentUser,ByHost:No,Container:(null),ContentsNeedRefresh:No):settingpreferencesoutsideanapplication'scontainerrequiresuser-preference-writeorfile-write-datasandboxaccess TestCase'-[UITestingUITeststestRunner]'started. t=0.00sStartTestat2020-06-121528.224 t=0.00sSetUp 2020-06-121528.230656+0800WebDriverAgentRunner-Runner[616:123635]BuiltatJun1220201529 2020-06-121528.238785+0800WebDriverAgentRunner-Runner[616:123635]ServerURLHere->http://172.18.62.8:8100<-ServerURLHere 2020-06-12?1528.239467+0800?WebDriverAgentRunner-Runner[616:123836]?Using?singleton?test?manager
使用 postman 發(fā)送請求,返回的 sessionID 為 null,但是 xcode 的控制臺沒有報任何錯誤
啟動應(yīng)用程序直接返回 400
此問題坑爹至極 ,網(wǎng)上搜索了眾多內(nèi)容都沒有此問題的答案 ;但是有人在testhome上已經(jīng)提出了這個問題但是至今沒有人回復(fù)答案 ;
解決方案:
安裝usbmuxd
brewinstallusbmuxd
iproxy該工具會將設(shè)備上的端口號映射到電腦上的某一個端口
最后使用iproxy 進(jìn)行端口轉(zhuǎn)發(fā)的時候, 一定跟上指定的設(shè)備id
即: iproxy local_port device_port -u udid
問題13:解決 XCUITest iproxy exited with code 208
命令行執(zhí)行
ps-ax|grep-**i**"iproxy"|grep-vgrep|awk'{print"kill-9"$1}'|sh
問題14:每次測試應(yīng)用都需要啟動 WebDriverAgent , 修改使用腳本方式自動運行
#解鎖keychain,以便可以正常的簽名應(yīng)用, PASSWORD="YourPassword" securityunlock-keychain-p$PASSWORD~/Library/Keychains/login.keychain #獲取設(shè)備的UDID,用到了之前的libimobiledevice UDID=$(idevice_id-l|head-n1) #真機運行測試 xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination"id=$UDID"test #模擬器運行測試 #xcodebuild-projectWebDriverAgent.xcodeproj-schemeWebDriverAgentRunner-destination"platform=iOSSimulator,name=iPhoneX"test
腳本運行完成后,同樣手機/模擬器上會出現(xiàn)一個無圖標(biāo)的 WebDriverAgent 應(yīng)用,啟動之后,馬上又返回到桌面。此時終端會輸出 IP 地址和端口。
附錄
1. 關(guān)于Certificate、Provisioning Profile、App ID的介紹及其之間的關(guān)系
考慮到想要將待測試應(yīng)用安裝到真機 ,首先繞不過去的必須得申請證書,申請證書之前又必須得要開發(fā)者賬號,以上都具備了開始按步驟申請Certificate、Provisioning Profile、App ID ;可是即使你申請成功,難免對以上三者之間關(guān)系感到懵逼,以下對三者之間關(guān)系進(jìn)行簡介說明,幫助理清之間的脈絡(luò)關(guān)系
開發(fā)者賬號類型
概念介紹
如果你擁有一個開發(fā)者賬戶的話,在iOS Dev Center打開Certificates, Indentifiers & Profiles,你就可以看到如下的列表:
Profile Portal改版有一段時間了,改版之后的結(jié)構(gòu)比以前更清晰明了,易于理解和管理。
上面的列表就包含了開發(fā)、調(diào)試和發(fā)布iOS應(yīng)用程序所需的所有內(nèi)容:Certificates、Identifiers、Devices、Provisioning Profiles。下面將一一解釋這幾個東東。
Certificate
證書是用來給應(yīng)用程序簽名的,只有經(jīng)過簽名的應(yīng)用程序才能保證他的來源是可信任的,并且代碼是完整的, 未經(jīng)修改的。在Xcode Build Setting的Code Signing Identity中,你可以設(shè)置用于為代碼簽名的證書。
眾所周知,我們申請一個Certificate之前,需要先申請一個Certificate Signing Request (CSR) 文件,而這個過程中實際上是生成了一對公鑰和私鑰,保存在你Mac的Keychain中。代碼簽名正是使用這種基于非對稱秘鑰的加密方式,用私鑰進(jìn)行簽名,用公鑰進(jìn)行驗證。如下圖所示,在你Mac的keychain的login中存儲著相關(guān)的公鑰和私鑰,而證書中包含了公鑰。你只能用私鑰來進(jìn)行簽名,所以如果沒有了私鑰,就意味著你不能進(jìn)行簽名了,所以就無法使用這個證書了,此時你只能revoke之前的證書再申請一個。因此在申請完證書時,最好導(dǎo)出并保存好你的私鑰。當(dāng)你想與其他人或其他設(shè)備共享證書時,把私鑰傳給它就可以了。私鑰保存在你的Mac中,而蘋果生成的Certificate中包含了公鑰。當(dāng)你用自己的私鑰對代碼簽名后,蘋果就可以用證書中的公鑰來進(jìn)行驗證,確保是你對代碼進(jìn)行了簽名,而不是別人冒充你,同時也確保代碼的完整性等。
證書主要分為兩類:Development和Production,Development證書用來開發(fā)和調(diào)試應(yīng)用程序,Production主要用來分發(fā)應(yīng)用程序(根據(jù)證書種類有不同作用),下面是證書的分類信息:(括號內(nèi)為證書有效期)
(注:不同類型的開發(fā)者賬戶所能創(chuàng)建的證書種類不同,關(guān)于開發(fā)者賬戶的對比和InHouse證書相關(guān)的內(nèi)容,請見我的另一篇文章)
有一些類型的證書我沒有使用過,所以也不了解具體的作用。
App ID
App ID用于標(biāo)識一個或者一組App,App ID應(yīng)該是和Xcode中的Bundle ID是一致的或者匹配的。App ID主要有以下兩種:
每創(chuàng)建一個App ID,我們都可以設(shè)置該App ID所使用的APP Services,也就是其所使用的額外服務(wù)。每種額外服務(wù)都有著不同的要求,例如,如果要使用Apple Push Notification Services,則必須是一個explicit App ID,以便能唯一標(biāo)識一個應(yīng)用程序。下面是目前所有可選的服務(wù)和相應(yīng)的配置要求。
如果你的App使用上述的任何一種service,就要按照要求去配置。
Device
Device最簡單了,就是iOS設(shè)備。Devices中包含了該賬戶中所有可用于開發(fā)和測試的設(shè)備。每臺設(shè)備使用UDID來唯一標(biāo)識。
每個賬戶中的設(shè)備數(shù)量限制是100個。Disable 一臺設(shè)備也不會增加名額,只能在membership year 開始的時候才能通過刪除設(shè)備來增加名額。
Provisioning Profile
一個Provisioning Profile文件包含了上述的所有內(nèi)容:證書、App ID、設(shè)備。
試想一下,如果我們要打包或者在真機上運行一個應(yīng)用程序,我們首先需要證書來進(jìn)行簽名,用來標(biāo)識這個應(yīng)用程序是合法的、安全的、完整的等等;然后需要指明它的App ID,并且驗證Bundle ID是否與其一致;再次,如果是真機調(diào)試,需要確認(rèn)這臺設(shè)備能否用來運行程序。而Provisioning Profile就把這些信息全部打包在一起,方便我們在調(diào)試和發(fā)布程序打包時使用,這樣我們只要在不同的情況下選擇不同的profile文件就可以了。而且這個Provisioning Profile文件會在打包時嵌入.ipa的包里。
例如,如下圖所示,一個用于Development的Provisioning Profile中包含了該Provisioning Profile對應(yīng)的App ID,可使用的證書和設(shè)備。這意味著使用這個Provisioning Profile打包程序必須擁有相應(yīng)的證書,并且是將App ID對應(yīng)的程序運行到Devices中包含的設(shè)備上去。
Explicit App ID:唯一的App ID,這種App ID用于唯一標(biāo)識一個應(yīng)用程序,例如com.ABC.demo1,標(biāo)識Bundle ID為com.ABC.demo1的程序。
Wildcard App ID:通配符App ID,用于標(biāo)識一組應(yīng)用程序。例如*可以表示所有應(yīng)用程序,而com.ABC.*可以表示以com.ABC開頭的所有應(yīng)用程序。
In-House and Ad Hoc (3年):用來發(fā)布In-House和AdHoc的應(yīng)用程序。
MDM CSR
Push Production (1年):用來在發(fā)布版本中使用Apple Push Notification。
Pass Type ID Certificate
Website Push ID Certificate
App Development (1年):用來開發(fā)和真機調(diào)試應(yīng)用程序。
Push Development (1年):用來調(diào)試Apple Push Notification
Development
Production
App Store :用來發(fā)布提交App Store的應(yīng)用程序。
如上所述,在一臺設(shè)備上運行應(yīng)用程序的過程如下:
與證書一樣,Provisioning Profile也分為Development和Distribution兩種:
(注:前面提到不同賬戶類型所能創(chuàng)建的證書種類不同,顯然Profile文件的種類是和你所能創(chuàng)建的證書種類相關(guān)的)
Development (1年)
Distribution (1年)
In House
Ad Hoc
App Store
In House 與Ad Hoc的不同之處在于:In House沒有設(shè)備數(shù)量限制,而Ad Hoc是用來測試用的,Ad Hoc的包只能運行在該賬戶內(nèi)已登記的可用設(shè)備上,顯然是有最多100個設(shè)備的數(shù)量限制。所以這兩種Provisioning Profile文件的區(qū)別就在于其中的設(shè)備限制不一樣而已,而他們所使用的Certificate是相同的。
開發(fā)/發(fā)布流程
了解了上面的概念,再來看開發(fā)及發(fā)布流程就非常簡單了,而且相信你不用看教程也能一步步完成所有的操作了。
開發(fā)/真機調(diào)試流程
根據(jù)上面的介紹,可以知道進(jìn)行Development主要有以下幾個步驟:
申請證書
加入設(shè)備
生成Provisioning Profile
設(shè)置Xcode Code Sign Identifer
事實上第三步通常是不需要的,因為我們通常都是用Xcode生成和管理的iOS Team Provisioning Profile來進(jìn)行開發(fā),因為它非常方便,所以不需要自己手動生成Provisioning Profile。
iOS Team Provisioning Profile是第一次使用Xcode添加設(shè)備時,Xcode自動生成的,它包含了Xcode生成的一個Wildcard App ID(*,匹配所有應(yīng)用程序),賬戶里面所有的Devices和所有Development Certificates,如下圖所示。因此,team中的所有成員都可以使用這個iOS Team Provisioning Profile在team中的所有設(shè)備上調(diào)試所有的應(yīng)用程序。并且當(dāng)有新設(shè)備添加進(jìn)來時,Xcode會更新這個文件。
發(fā)布流程
網(wǎng)上有很多關(guān)于發(fā)布App Store的流程,我就不綴述了,不過根據(jù)上面的概念介紹,不管是App Store、In-House還是Ad-Hoc,打包流程都是差不多的,都包括了以下幾個關(guān)鍵步驟:
創(chuàng)建發(fā)布證書
創(chuàng)建App ID
創(chuàng)建對應(yīng)的Provisioning Profile文件
設(shè)備Bundle ID和App ID一致
設(shè)置Xcode Code Sign Identifer,選擇合適的Profile和證書進(jìn)行簽名,打包
2. WebDriverAgent 整體框架設(shè)計
GitHub的描述:
WebDriverAgentisaWebDriverserverimplementationforiOSthatcanbeusedtoremotecontroliOSdevices.Itallowsyoutolaunch&killapplications,tap&scrollviewsorconfirmviewpresenceonascreen.Thismakesitaperfecttoolforapplicationend-to-endtestingorgeneralpurposedeviceautomation.ItworksbylinkingXCTest.frameworkandcallingApple'sAPItoexecutecommandsdirectlyonadevice.WebDriverAgentisdevelopedandusedatFacebookforend-to-endtestingandissuccessfullyadoptedbyAppium.
WebDriverAgent在iOS端實現(xiàn)了一個WebDriverServer,可用于遠(yuǎn)程控制iOS設(shè)備。它允許您啟動和終止應(yīng)用程序,點擊和滾動視圖或確認(rèn)屏幕上的視圖狀態(tài)。這使其成為應(yīng)用端到端測試或通用設(shè)備自動化的完美工具。它通過鏈接XCTest.framework和調(diào)用Apple的API來直接在設(shè)備上執(zhí)行命令。WebDriverAgent在Facebook上開發(fā)并用于端到端測試,并被Appium成功采用。特性:
適用于設(shè)備和模擬器
實現(xiàn)大部分WebDriver規(guī)范
實現(xiàn)Mobile JSON Wire Protocol Spec的一部分
USB支持設(shè)備
具有友好用戶界面的Inspector 端點,用于檢查當(dāng)前設(shè)備狀態(tài)
易于開發(fā),因為它可以通過Xcode直接啟動和調(diào)試
尚不支持,但與tvOS和OSX一起使用
WDA Client
WDA Client是基于WebDriverAgent實現(xiàn)的WDA的客戶端。
我們在 iOS 設(shè)備上啟動了 WDA 的服務(wù)端。為了運行 Mac OS 上的腳本,我們需要在 Mac OS 上安裝 WDA 客戶端。
facebook-wda 就是 WDA 的 Python 客戶端庫,通過直接構(gòu)造HTTP請求直接跟WebDriverAgent通信。
#安裝WDApython客戶端 pip3install--prefacebook-wda
-
自動化測試
+關(guān)注
關(guān)注
0文章
208瀏覽量
26905 -
iOS
+關(guān)注
關(guān)注
8文章
3395瀏覽量
150554
原文標(biāo)題:Appium +iOS 自動化測試全網(wǎng)最全教程(實踐、總結(jié) 、踩坑)
文章出處:【微信號:TestinChina,微信公眾號:Testin云測】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論