1. 程式人生 > >基於instruments-Automation的iOS應用UI自動化測試圖文攻略

基於instruments-Automation的iOS應用UI自動化測試圖文攻略

iOS的自動化測試框架可分為兩種:注入式和非注入式。注入式的框架通常會提供一些Lib或者是Framework,要求測試人員在待測應用的程式碼工程中匯入這些內容,框架可以通過他們完成對app的驅動,典型的比如monkeytalk。非注入式的框架則是通過蘋果提供的instruments工具,呼叫官方的介面函式,實現對app的相關操作,典型的就是uiautomation,appium

  區別:

  注入式:可獲取app內的資料;可操作空間大,不受官方限制;可在windows平臺進行測試;但是需要在待測專案中增加第三方的部分,使得測試的內容和實際釋出的內容並不一致

  非注入式:待測內容和最終的上線內容保持一致;測試無需原始碼;但是受官方限制,一些功能無法實現,而且環境要求必須使用os x平臺的Xcode。

  採用instruments的原因:

  1. 測試工具和測試文件均由蘋果官方維護

  2. 無需額外前置工作,可以直接對提測的app進行測試

  3. 支援錄製

1. 環境

  mac:

    OS X

   Xcode-instruments

    其中,Xcode通過mac上的App store即可直接安裝使用,instruments為Xcode自帶的工具集,無需單獨下載

  iPhone/iPad:

    待測app

    其中,待測app如果是執行在真機上,則一定需要用開發者證書籤名,採用釋出證書或者是企業證書打包的應用無法用以真機測試。

2. 準備工作 for 真機

1)手動安裝應用到iPhone上,並連線iPhone到mac。

PS:如果該裝置是第一次連線這臺mac,需要等待organizer完成識別和同步工作才能使用。

PPS:如果organizer沒有自動啟動,可以通過Xcode->window->organizer,手動啟動該程式。


2)啟動instruments工具集,並選擇Automation,進入測試工具的主介面

啟動方式:開啟Xcode,選擇Xcode->Open DeveloperTool->Instruments


PS:啟動instruments之後,可以在下方Doce選單中,選中instruments的圖示,右鍵選擇在Dock中保留,便於下次快捷啟動該工具,不用每次都去啟動Xcode。

3. 準備工作 for 模擬器

方式一:從原始碼直接啟動instruments,適用於有原始碼工程的情況。

1) 雙擊*.xcodeproj 檔案開啟工程

2) 在Xcode中,選則Produce->Profile,該命令會首先build整個工程,在成功之後,自動啟動instruments工具集,然後手動選擇Automation工具即可。


   方式二:使用已經編譯完成的並且可用於模擬器執行的*.app檔案,有無原始碼均可

1) 手動啟動instruments工具集並進入Automation,選擇待測的*.app檔案即可

PS:運行於模擬器和真機的程式需要採用不同的方式進行編譯,不能通用的。平時的提測包都是用於真機執行的,無法在模擬器執行。

2) 如果有原始碼,可以在選擇模擬器和對應的iOS版本之後,直接Run到模擬器中,然後在需要測試時,通過Automation選擇到模擬器目錄下的該app檔案也可以。

模擬器中的應用可以在這個路徑下面找到:

/Users/使用者名稱/Library/Application Support/iPhone Simulator/iOS版本/Applications/

該路徑下載就是模擬器中的已安裝的所有應用程式,找到待測試的*.app即可。

   目前我測試的是一塊視訊應用,播放器底層的一些庫執行在模擬器上會有問題,所以我的後面的所有內容都以運行於真機的環境為準。

4. 從錄製開始

1) 選擇待測試的應用。

在左上方的choose target上點選,選擇當前連線的裝置,以及該裝置上已安裝的待測試app

2) 聚焦到script區域,點選該區域下方的紅色按鈕


如果上一步選擇的裝置和app正確的話,就可以看到iPhone或者iPad上的應用被啟動起來了(如果之前就已經啟動了,Automation工具會先結束掉裝置上的程序並重新啟動)

   應用啟動完成之後,就正式開始錄製模式了,此時在真機上對應用進行的任何操作,都會被錄製成指令碼的形式顯示在script區域。由於使用者操作和指令碼錄製同時在進行,所以此時的操作通常都會呈現出響應慢或者卡頓頻繁的情況。

   下面這段是登入帳號a然後登出帳號的一系列操作的錄製結果


點選停止按鈕,終止錄製過程,然後點選回放按鈕,開始回放已經錄製好的指令碼,我們可以看到應用重啟並執行之前的一系列操作。

到目前為止,對操作的錄製就算基本完成了,在script區域右鍵export即可以到處錄製的js指令碼。需要的時候,在指令碼管理區域scripts通過點選add->Import的方式,匯入js指令碼並執行即可。


但是上面的指令碼存在很多問題。

1) 指令碼中有一行綠色的提示資訊://Alert detected……

2) 實際執行會發現最後一行程式碼會出錯。

3) 如果wifi的網路狀況不是很穩定,這段指令碼基本都會以失敗告終。

4) 每行程式碼都很長,並且不利於閱讀

5) 沒有檢查點的測試指令碼都是在耍流氓

    這些問題,我們在接下來一一解決。

5. 自己動手,豐衣足食

錄製的程式碼可維護性和健壯性都很差,並且缺少必要的檢查點,所以實際效果非常差。這時就需要自己編寫測試程式碼,採用按需定製的方式來實現自動化。

首先一定要記住這個地址:

https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/_index.html

這是蘋果官方的參考文件,列舉出了UI Automation JavaScript library的所有類,對app的各個操作最終都是通過這些api來實現的。

自動化的常見步驟通常是三步:定位,操作,檢查

1) 定位元素

UIAutomation通過層級訪問的方式,定位到某一個具體元素。蘋果提供了一個logElementTree()的方法,列印控制元件樹。在新建的測試指令碼中,加入下面這行程式碼:

 Target.logElementTree();

執行這段程式碼(點選左上角的紅色按鈕),我們可以看到輸入了下面的東西

【截圖】

上圖就是整個app的UI層級結構,當你需要定位到某個元素的時候,可以按照這個層級一層一層的往下訪問,直到目標元素。比如需要定位到播放記錄。

var target= UIATarget.localTarget();

var app =target.frontMostApp();

var window= app.mainWindow();

//進入登陸介面

varloginButton = window.scrollViews()[0].buttons()["請點選登入"];

其中:

UIATarget 物件代表待測應用所在環境的最高層級UI,在這裡localTarget()表示執行app的這臺iPhone裝置

UIAApplication物件代表app層級的UI,這裡通過frontMostApp()方法得到的物件,就是指正在執行的影音iPhone app。

UIAWindow物件代表app中window層級的UI,這裡通過mainWindow()方法得到的物件,指當前app中的主窗體,一個app的當前介面通常只會有一個主窗體。

實際專案中,不同元素的差異都是從window層級開始的,在window層級往上,都是一樣的。

2) 操作元素

上面一部完成就已經可以做到元素的定位,現在需要對這個元素進行操作,最常見的就是tap

loginButton.tap();

對於不同的元素,提供的具體操作方法會存在差異,詳情需參考官方文件。進入登入介面後,需要出入帳號密碼,也是同樣的步驟:

//定位輸入框

varnameField = window.textFields()[0];

varpwField = window.secureTextFields()[0];

//操作

nameField.setValue("[email protected]");

pwField.setValue("ppp111");

//點選執行登陸

window.buttons()["loginlogin button"].tap();

3) 檢查結果

操作完成後,需要檢查結果是否符合預期。

if(window.scrollViews()[0].staticTexts()[0].name() == "請叫我雷鋒"){

      UIALogger.logPass("測試通過");

}else{

      UIALogger.logMessage(window.scrollViews()[0].staticTexts()[0].name());

      UIALogger.logFail("測試失敗");

}

   上述的這幾個步驟,就算完成了UIAutomation的hello world,但是前面丟擲的問題並沒有完全解決。

6. 逐個擊破

1)延遲

上面這段程式碼,在實際執行時,基本是會一直測試失敗的,原因是從開始登入,到展示使用者資訊,需要一定的時間,點選登入按鈕操作之後,立刻去判斷使用者資訊也就一定會失敗的。另外,網路波動,或者是app/測試機可能出現的卡頓,是造成測試指令碼的頻繁失敗的原因之一,因此我們需要某些操作之後,人為增加一些必要的延遲,等待操作的完成,從而增強程式碼的穩定性。蘋果在target層提供了一個方法delay(Number timeInterval),該方法用於延遲指令碼的執行,我們可以在必要的地方增加該方法。

target.delay(3);

2)彈框

彈框alert在iOS中比較特殊的型別,它不屬於app層級的,也不能像操作普通元素一樣去操作alert,蘋果提供了一個專門的處理方法,UIATarget.onAlert,當彈框出現時,測試引擎會自動呼叫這個方法來處理彈框。

【待完善】

3)Log

UIALogger主要就用於輸出各種型別的日誌。包括logStart,logPass,logFail,logMessage,logDebug,logWarning ,logError

前三個通常用來區分一個測試用例,logstart表示一個測試的開始,直到logPass或者是logFail為止。後四個用以在測試過程中輸入不同級別的日誌。

7. tuneupjs

tuneupjs是一個用以優化uiautomation的第三方js庫,網站地址: http://www.tuneupjs.org/

1)測試用例

Tuneupjs提供了test方法,用以表示一個測試用例,該方法有兩個引數:測試用例的名稱和一個測試內容的function,在這個方法中,你無須使用logStart,logPass,logFail這一類的方法,Tuneupjs已經在test方法的實現中,做了相應的處理,一個test方法就對應一條測試用例,當這個test方法中的function正常的執行完畢,這個case就會變為pass,如果執行過程中有任何異常丟擲,test就會停止並把這個case置為fail。

test("登入測試",function(target,app){

      app.tabBar().buttons()[2].tap();

      var loginButton =window.scrollViews()[0].buttons()["請點選登入"];

       //如果已登入則先登出賬號

      if (!loginButton.isVisible()) {

            window.scrollViews()[0].buttons()[1].tap();

            window.buttons()["退出登入"].tap();

            target.delay(1);

      }

      //如果未登入則執行登入

      if (loginButton.isVisible()) {

            log("登入帳號*****");

            loginButton.tap();

            var nameField =window.textFields()[0];

            var pwField =window.secureTextFields()[0];

            nameField.setValue("*****"); //帳號

            pwField.setValue("*****");  //密碼

            window.buttons()["login loginbutton"].tap();

            target.delay(3);

      }   

      assertEquals(window.scrollViews()[0].staticTexts()[0].name(),"請叫我雷鋒","登入失敗");

});

採用test方法來組織測試用例有一個很明顯的好處,該方法已經做好了異常的處理,出現的任何異常都會被當前所在的test方法捕獲到,而不會把異常拋給最上層,避免了一旦出現異常就會導致整個測試停止執行的情況。一個test失敗之後,不會影響下一個test的執行。

2)斷言

這是Tuneupjs的又一個優勢,它提供了一系列的斷言方法,可以用以對測試結果進行判斷,並且在斷言失敗時自動截圖儲存,基礎的斷言方法包括assertEqualsassertNotEqualsassertTrueassertFalseassertNullassertNotNull等,在一個test中,一旦出現斷言失敗,這條用例就會變為fail狀態。

3)Retry方法

這是一個重試方法,配合斷言使用效果更佳。retry()的必要引數就是一個function,如果function中出現了斷言失敗,或者是有異常丟擲,該方法會再次嘗試執行這個function,直到function的內容全部通過或者是最終超時。預設的重試次數是3次,每次重試間隔0.5秒,可以為retry()方法設定第二和第三個引數來修改這兩個值。retry()方法比單純的使用官方的delay()方法要更加合理。

retry(function(){

      assertEquals(window.scrollViews()[0].staticTexts()[0].name(),"請叫我雷鋒","登入失敗");

},5,1);

4)Test方法中手動丟擲異常

有時候出於需要,我們需要在某個測試用例中手動丟擲異常,讓用例失敗,可以使用tuneup提供的fail(message)方法,也可以自己直接拋異常throw(exception),test方法捕獲異常之後會認為當前的用例失敗,跳出並執行下一條用例。

5)命令列啟動UIAutomation

UIAutomation本身是支援命令列啟動的,也即非gui的模式。但是原生的命令非常的冗長,Tuneupjs對相關的命令做了封裝,採用了自己的runner,並且支援輸出xml格式的測試結果,可以用於jenkins等持續整合工具。

./UI_Test/alexvollmer-tuneup_js-5a4346d/test_runner/runiCloudPlayIPhone  UI_Test/login.js

test-Result/-x –a 5

-x 表示輸出一份xunit格式的xml

-a 5 表示啟動instruments失敗之後,重試啟動的次數

相關推薦

基於instruments-Automation的iOS應用UI自動化測試圖文

iOS的自動化測試框架可分為兩種:注入式和非注入式。注入式的框架通常會提供一些Lib或者是Framework,要求測試人員在待測應用的程式碼工程中匯入這些內容,框架可以通過他們完成對app的驅動,典型的比如monkeytalk。非注入式的框架則是通過蘋果提供的instrum

基於webdriver的web UI自動化測試框架(系統架構+測試指令碼應用架構)

1.首先是自動化測試系統架構如下圖: 2.測試指令碼的應用架構: 3實際應用後的工程結構: 框架的配置檔案(只是簡單的用properties檔案) #------------------# #  測試框架配置 #------------------# #

基於python+appium+yaml安卓UI自動化測試分享

是否 作者 exceptio sts http def pen ogr 技術 結構介紹 之前分享過一篇安卓UI測試,但是沒有實現數據與代碼分離,後期維護成本較高,所以最近抽空優化了一下。不想看文章得可以直接去Github,歡迎拍磚大致結構如下: 結構.png

搭建基於IDEA+Selenium+Java+TestNG+Maven+Jenkins+SVN的Web端UI自動化測試環境

第一步:工具下載安裝配置 第二步:整合各個工具到自動化測試環境 1.IDEA上的各種操作 a.通過在idea工具,新建一個maven專案,在右邊載入框這裡,選擇maven-archetype-quickstart,然後點選next b.輸入Group Id:域.公司簡稱;Artifact Id:專案名稱

基於APPIUM測試微信公眾號的UI自動化測試框架(結合Allure2測試報告框架)

clas ava sed rom pos enabled via 代碼管理 ons 框架初衷 前兩周組內的小夥伴跟我說她現在測試的微信公眾號項目(保險)每次上新產品時測試起來很費時,存在大量的重復操作(點點點),手工測試每個產品可能需要半天到一天的時間,復雜的產品需要兩

推薦五款Android 應用自動化測試工具

height .com 遍歷 瀏覽器 準備 pro 模擬器 ive ron 如今自動化測試已經應用到每天的測試中。這不足為奇,因為自動化測試在測試過程中節約了時間,還能避免包括人為因素造成的測試錯誤和遺漏。 自動化測試工具選擇很多。一些是開源的,一些非常貴。一些自動化工具

Robot Framework使用Phantomjs進行無界面UI自動化測試

com 程序 linux版本 -c 框架 data 我們 img 必須 Robot Framework 是一款關鍵字驅動的驗收自動化測試框架,現在在國內使用的越來越廣泛了。一種通用的Web UI自動化測試解決方案是Robot Framework+Selenium2Lib

轉載:狠狠地聊一下UI自動化測試

target 設計 action com 用例設計 ati web測試 ui自動化 web 狠狠地聊一下UI自動化測試 用例設計 功能測試 性能測試 單元測試 WEB測試 其他相關 轉載:狠狠地聊一下UI自動化測試

ui自動化測試的意義與理解

方法 慢慢 lin 線上 效果 fff 效率 場景 答案 分層測試的思想 分層測試(有的也叫測試金字塔)是最近幾年慢慢流行、火熱起來的,也逐漸得到了大家的認可,大家應該已經比較熟悉分層測試的思想了,不太了解的可以自行找一些相應的渠道去補充一下上下文的知識。 總的來說測試需要

基於python的接口自動化測試框架

urn __name__ exce 文件格式 圖片 XML pla main tex 公司內部的軟件采用B/S架構,大部分是數據的增刪改查,由於還在開發階段,所以UI界面的變化非常快,難以針對UI進行自動化測試,那樣會消耗大量的精力與時間維護自動化腳本。針對此種情況,針對接

UI 自動化測試1-環境配置

在哪裏 表示 配置環境 我們 環境變量 sta 正常 通過 mage 一.安裝Eclipse:1. 安裝Eclipse2. 打開Eclipse(這個時候你會發現無法打開會提示….) 原來是我們沒有裝JDK和JRE (肯定有人又疑惑了,jdk和jre是什麽有

UI自動化測試4-公共類和調用

沒有 element 問題 drive bdr 導致 mage man del 1. 作業解答 上節課給大家的作業是find element by.cssSelector. 我簡單舉一個例子 WebElement email = driver.findElement(By

UI自動化測試簡介及Selenium工具的介紹和環境搭建

版本 ebe 需求分析 核心 nis rep color 基於 多語 自動化測試簡介 1.1何為自動化測試?   是把以人為驅動的測試轉化為機器執行的一種過程,它是一種以程序測試程序的過程。換言之,就是以程序實現的方式來代替手工測試。 1.2自動化測試分類   分為功能自動

UI自動化測試(二)瀏覽器操作及對元素的定位方法(xpath定位和css定位詳解)

cli 刷新 ota api enter 版本 ror apache 窗口 Selenium下的Webdriver工具支持FireFox(geckodriver)、 IE(InternetExplorerDriver)、Chrome(ChromeDriver)、 Opera

UI自動化測試(四)AutoIT工具使用和robot對象模擬鍵盤按鍵操作

rop 並保存 cto 右鍵 自動化測試 nqa files 安裝 存在 AutoIT簡介 AutoIt 目前最新是v3版本,這是一個使用類似BASIC腳本語言的免費軟件,它設計用於Windows GUI(圖形用戶界面)中進行自動化操作。它利用模擬鍵盤按鍵,鼠標移動和窗口/

[持續交付實踐] 基於 Junit 的接口自動化測試框架實現

lis ebo 命名 早已 更多 數據集 matcher 似的 相關 前言 這半個月基本都在出差以及各種公司業務上的事情,難得有空閑整理一些測試技術上的事情。周末有些空閑抓緊碼一篇填坑,持續交付/持續集成這一系列文章不僅僅是想在壇子裏和同行者做些分享,對個人的一種自我思考和

Robot Framework進行web ui自動化測試,瀏覽器配置說明

org .html open fire img row sele title cnblogs 轉載請註明出處,謝謝; chrome瀏覽器: 1、從如下地址下載與本地瀏覽器版本號一致的chromedriver.exe驅動文件; http://chromedriver.stor

UI自動化測試之selenium(1)——selenium中的常用api

selenium api 目錄 1 對瀏覽器操作1.1 用webdriver打開一個瀏覽器1.2 最大化瀏覽器&關閉瀏覽器1.3 設置瀏覽器窗口大小1.4 打開測試頁面1.5 處理瀏覽器彈出的新窗口2 頁面元素定位3 如何對頁面元素進行操作3.1 WebElement相關方法3.2 iFram

基於python語言的Selenium自動化測試

log 轉換成 body odi 執行 con 行為 般的 按鈕 一、Selenium簡介 Selenium是一個web自動化應用測試工具,還支持所有的web的管理任務自動化。並且開源免費,也是一個web自動化輕量級框架。它支持多種瀏覽器、跨平臺、跨操作系統、支持多種編

UI自動化測試POM設計之-maven工程

絕對路徑 pro 解決 unit 是否 分享 根據 osi ren 為了更好的管理UI自動化測試項目,介紹一下Maven項目創建以及應用 一. 配置Maven環境 1. 下載並安裝Maven 下載地址:http://maven.apache.org/downlo