自動化功能測試-Athrun—IOS學習之旅文檔

1,Java基礎知識,知道類、構造方法、繼承這樣的基礎概念

2,對IOS系統有一定的瞭解;瞭解xcode工具

3,會使用Maven進行編譯

簡介

Athrun以Mobile自動化測試框架爲基礎,以PC2Mobile爲切入點,是淘寶 Mobile測試日常工作必備的平臺

目前Athrun支持:

Ø Android上的自動化測試,包括自動化測試框架,持續集成體系。

Ø IOS上的自動化測試,包括:

1.       注入式自動化框架AppFramework;

2.       基於錄製的非注入式自動化框架 Athrun_IOS;

3.       InstrumentDriver,還有持續集成體系。

 AppFramework已經支持socket通信方式。

IOS框架發展歷程

圖例 1 IOS框架發展歷程

1. 

注入式框架從無到有,首開先河,通過直接修改開發代碼,讓測試運行起來,升級日誌系統,方便查看運行結果。

•   思路

– 利用didFinishLaunchingWithOptions

– 構造控件樹

– 模擬touch事件

•   優點

– IOS各版本適用

– Objective-C貼近開發

•   困難

– 需要修改開發代碼

– 運行下個用例前,需要主動返回首頁

– Objective-C對測試的學習成本

注:didFinishLaunchingWithOptions

顧名思義。在app開始運行時會調用裏面的方法。官方文檔的定義是"Tellsthe delegate when the application has launched and may have additional launch options to handle." 


基於錄製的非注入式自動化框架 Athrun_IOS採用instrument js 工具包,增加穩定性,增加校驗功能。增加批量執行。效率提升,從需要注入改代碼,到可以直接運行app。運行穩定性提升,增加易用性。

•   UIAutomation的調研

– 優點:錄製、非注入

– 缺點:IOS 4.0以上支持,操作不穩定

•   我們對UIAutomation的擴展

– 操作擴展

– 校驗擴展

– Log轉Hudson

•   UIAutomation方案的困擾

– 錄製難維護

– 低級錯誤,排錯成本高

– 無法單步調試

– 服務端數據準備


純Java環境編寫用例,更好的接入現有測試系統。語法出錯排查時間從原來的平均30分鐘,減爲0。智能感應讓編寫用例時間縮短30%,學習成本大幅降低。調試功能讓出錯排查時間縮短50%,從而在很大程度提升效率。

•   特點

– 使用java編寫用例

– junit方式運行用例

•   優勢

– 自動的語法檢查,智能感知

– 支持斷點單步調試、變量查看

–  更方便的持續集成和數據準備

InstrumentDriver 簡介

 Instrument Driver 是 Mobile自動化小組最近實現的基於 instrument,針對 IOS 的自動化測試框架,目前支持 java 語言編寫測試用例。

    研究過IOS自動化測試的同學肯定對 instrumentUI Automation 有所耳聞,或者已經使用它進行自動化測試實踐。IOS4.0 開始,蘋果官方提供了 UI Automation 以支持應用的UI自動化測試。不過4.0版本並不支持錄製功能,只能根據提供的API文檔編寫 JavaScript 測試腳本,instrument 驅動腳本在應用上模擬用戶行爲。

讓人興奮的是,5.0開始,UI Automation 支持錄製和回放了。用戶在應用上的操作過程被記錄下來並生成對應的腳本可以進行回放。雖然錄製的腳本回放很不穩定,健壯性不強,錄製後需要進行一些簡單調整然後加入自己的校驗邏輯,但已經很大程度上方便了用例的編寫。

自動化測試不是簡單的錄製回放,腳本運行通過就可以了,而是一整套的流程。instrument 支持批量運行 trace 文件中導入的JavaScript腳本,也支持命令行運行單個腳本,但是這並不能建立一個比較完善的迴歸體系,從數據準備,到用例編寫、調試、維護,迴歸,運行結果的收集,到測試報表的生成,結果的分析等。

爲了從根本上避免上述使用過程中遇到的問題,我們開始想辦法脫離 js 編寫腳本的方式,通過編寫java測試用例,來避免腳本無法單步調試、查看變量值,無自動語法檢查、代碼智能感知等極大影響自動化測試體驗的弊端。java強大的文件讀寫,數據庫操作也讓數據驅動和數據準備的實現成爲可能。加上java能與豐富的外部工具進行方便的集成,這更堅定了我們採用java實現的決心。

 由於IOS系統本身的封閉性,給自動化測試帶來了諸多挑戰,要麼在應用中注入測試代碼進行自動化測試,要麼使用官方的 instrument。兩種方式各有利弊,怎樣在這之中尋求一種更好的方式呢?通過調研發現 instrument 提供的一個在腳本中能夠調用外部shell的“漏洞”,讓我們想法的實現成爲可能。基於此,有了 Instrument Driver 的實現。

InstrumentDriver

整體框架圖


說明

框架分爲Server端和Client端,雙方進行socket通信傳遞消息:

l Client端(Mobile)負責請求測試步驟運行,並返回運行結果;

l Server端(Java用例)負責響應Client請求並接受測試步驟的運行結果。

1.5  InstrumentDriver功能特點

1、 C/S 模式運行。

     框架分爲Server端和Client端,雙方進行socket通信傳遞消息:Client端(Mobile)負責請求測試步驟運行,並返回運行結果;Server端(Java用例)負責響應Client請求並接受測試步驟的運行結果。C/S模式的實現,甚至可以脫離Mac在PC上編寫、調試測試用例(運行肯定離不開Mac系統),在熟悉的window環境下,讓用例編寫更加得心應手。

2、      純Java語言編寫測試用例,很好的兼容了instrument js格式的API。

      InstrumentDriver用Java實現了各元素類型的之間的繼承關係以及各元素類型所提供的操作方法,還擴展了一些更易於使用的操作,如滑動操作等。熟悉instrument js語法格式的測試人員可以很快用java語言實現測試用例。

3、      提供了清晰的控件樹狀結構打印及便利的元素查找方法。

     可以樹狀結構打印出當前窗口的所有元素或某一元素下的所有子元素。輸出屬性中不僅包括各元素的基本屬性(name,value,label,rect等),更包括代表該元素的guid,用例中使用該guid屬性即可代表該元素進行相應操作。findElemenByText及相關重載方法可以很方便的根據元素的顯示文本,類型,索引組合查找該元素,極大提升了用例的自描述性和可維護性,也更好的簡化了用例的編寫。

4、      Debug模式和非Debug模式運行

     用例可以debug模式和非debug模式兩種方式運行。debug模式通信時傳遞json對象或數組,返回後實例化爲具體對象。可以調試腳本,查看相關對象的屬性值。非debug模式僅在需要操作UI元素或獲取UI元素屬性的時候才通信,較大的提升了運行速度(debug模式的2倍左右)。可以這麼認爲:用例debug模式通過後,非debug模式也能運行通過。

5、      TestNG方式運行測試用例

      InstrumentDriver以大家熟悉的TestNG方式驅動測試用例,具備了TestNG單元測試的所有優點。可以更好結合其它工具進行持續集成和數據準備。如結合svn,maven,Jenkins進行持續集成,通過Excel進行數據準備等。

常用API介紹

•  API介紹:

-     面向UI對象

-     支持數組

-     與UI Automation兼容

-     錄製的腳本可以運行

•  根節點:

-     UIATarget

-      static localTarget()

-      printElementTree

-      scrollUp/Down/Left/Right

-      frontMostApp

•    UIAApplication

-  alert

-  keyboard

-  UIANavigationBar

-  mainWindow

win=UIATarget.localTarget().frontMostApp().mainWindow()

- UIAWindow(win)

-  繼承自UIAElement

- UIAElement

-  elements

-  T findElementByText(String text, Class<T> elmentType)

-  tap

-  touchAndHold

 

Ø 一旦繼承了InstrumentDriverTestCase這個類,那麼,變量target,app,win就可以直接使用了,分別代表target對象,當前應用,與當前窗口。

Ø UIAElement#findElementByText(Stringtext, Class<T>  elementType ),"#"表示是實例方法,該方法返回一個包含text文本的T類型的元素,比如

win.findElementByText("消息",UIAButton.class).tap(),返回一個文本爲“消息”的按鈕,tap()是單擊這個按鈕的意思,類似於iPhone上的“摸一下”;還可以在找到的元素的基礎上再找另外的元素,相當於在一個子集下尋找一個元素,比如win.navigationBar().findElementByText("取消",UIAButton.class);這行代碼將會在當前窗口的頂部導航欄中查找一個按鈕。

Ø UIAElement#printElementTree(),比如win.printElementTree(),會打印出當前窗口的所有元素的樹結構,這對於確認和定位元素很有幫助。

Ø  延時處理。頁面上需要停留時可以使用target.delay(int sec),這個對於等待後端響應有幫助。

Ø 彈窗的捕獲與處理,有兩種彈出,一是alert彈窗,一是actionsheet。

                  i.          捕獲alert彈窗,可以使用app.alert()捕獲,相應的,如果寫成

app.alert().printElementTree(),就可以打印出該彈窗的內部元素結構,從而便於進一步的處理。

                ii.          捕獲actionsheet彈窗,actionsheet是由窗口底部彈起的,可以使用app.actionSheet()捕獲,其餘的處理同於alert彈窗

Ø 滾動。代碼target.scrollUp(),可以向下滾動半屏高度。

Ø 校驗。雖然框架的查找方法在找不到控件時會自動讓測試失敗,但如果你想強制測試失敗,或者是其他的校驗,可以使用TestNG的Assert類的相關方法來達到目的,比如

l Assert.fail(),強制測試失敗。

l Assert.assertEqual(Stringmsg,String expected,String actual),可以用來校驗字符串相等,詳情請參考Assert類。

Ø 碰到無法偵查的元素怎麼辦?

用profile命令啓動instruments,然後嘗試錄製一下相關的操作,在生成的js代碼中查找線索。

另外,有時間的話請多讀讀框架的源碼

 

本套框架很容易入門,但隨後可能就會發現有些問題比較棘手,比如:

1.頭疼的socket超時問題

2.暫未提供某些比較重要的iPhone的界面操作接口,比如,開關,Wi-Fi,滑動刪除等等,但這些並不影響我們對常規功能實現自動化。

Instrument Driver 測試環境的搭建

1)      你已經具備了一臺mac或者mac mini,並已經安裝了mac os 10.7.5或者更高的版本,或者你已經在pc上安裝了同樣的虛擬機。

因爲Maven項目用到的一些文件會放在隱藏文件中,需要設置Mac機顯示隱藏文件夾才能查看相關文件。設置方法如下:

打開Mac終端,輸入顯示隱藏文件夾命令:

defaults write com.apple.finder AppleShowAllFiles-bool true

設置後註銷重啓Finder。

若要隱藏文件,操作命令如下:

defaults writecom.apple.finder AppleShowAllFiles -bool false

Xcode

直接安裝最新的xcode即可,本框架已能兼容iOS6.0。如果已經安裝xcode,你可以跳過該部分。

xcode裏編譯版本有很多中命令,分別適用於不同的目的。本segment只講一個命令,profile。

1)      編譯前的設置。假設已在xcode中打開最新分支,你需要設置三項:

a)      設置target,應設置爲“當前工程名>iPhone 5.X simulator”;

b)      b.設置打包的網絡環境是內網,還是外網,這個不同項目設置不同,這裏不予多說,建議到時直接問開發同學;

c)       設置包的簽名,這個也因項目而異,這裏只給出掌上旺信的設置方法,參見截圖,其餘項目比如湖畔可以詢問開發同學;

注意:b,c的設置都是在“build settings”  tab下里設置的。

2)      execute profile

a)      一切設置ok後,頂部菜單欄,選擇product->profile;

b)        B.如果編譯無錯,有錯請開發同學排錯,就可以啓動instruments了;

c)          C.點擊profile後,開始啓動instruments 及模擬器;

d)        D.這裏可以開啓iPhone自動錄放功能的嘗試,但這不是重點,有興趣可以看一下這一步;

e)      錄製後的腳本可以在代碼區域右鍵導出,以便日後回放。

f)       如果你打算使用java版的自動化框架,上一步可以幫助你探測元素,但一般情況下我們不需要直接使用instruments,所以現在請退出instruments跟模擬器。到此爲止,profile一個版本算是成功了。

3)      查看並拷貝build成功後的包。

a)      找包。第一次build成功後,你未必能找到最終的包,我不保證所有版本的xcode生成的包都跟我說的是一個位置,如果按照下面截圖找不到包,建議去詢問開發同學。

XCODE

直接安裝最新的xcode即可,本框架已能兼容iOS6.0。如果已經安裝xcode,你可以跳過該部分。

xcode裏編譯版本有很多中命令,分別適用於不同的目的。常用一個命令,profile。

通過這個按鈕,點擊 UIAutomator 錄製。

下圖是Automation錄製的腳本截圖:


可以看到,腳本非常冗長,只能通過元素的子元素一級級往下查找,很多索引方式生成的腳本自描述性不高,頁面稍有變化,不能很快找到對應的腳本進行更改,這樣維護成本是很高的。

對比InstrumentDriver 的 java用例,同樣功能的用例實現截圖如下:

win.findButton("Button").touchAndHold(1); // 點擊更多

win.findElementByText("關於我們").tap();

可以看出使用InstrumentDriver框架,你可以通過錄制來確定對象的結構,然後通過提供的findElementByText方法可以根據label,name,text來查找對象。也可以通過框架提供的printElementTree方法打印出當前window所有元素, findElementByText 方法能很精確的查找到相應元素。這樣根據腳本就知道這一步驟的具體行爲,自描述性大大提升,可維護性更好。

    這裏我們可以根據輸出方便的找到需要操作的元素,並且可以直接使用該元素的 guid屬性代表該元素,插入用例進行相應的操作。更推薦的做法是使用findElementByText進行定位,假如text(name, value ,label屬性)都爲空,可以查看父級元素或者更上級元素是否有text屬性,然後使用elements() 索引定位,可以最大化縮小範圍,使腳本更健壯,可讀性更高。


更多內容參見官網:

http://code.taobao.org/p/athrun/src/trunk/


目的:希望給廣大讀者獲取幫助,相互學習一起進步。

說明:本文章禁止用於商業用途,轉載時註明出處,解釋權歸本人所有。

發佈了50 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章