日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Xcode7 UI自动化测试详解 带demo UITests

發(fā)布時間:2024/9/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Xcode7 UI自动化测试详解 带demo UITests 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文轉(zhuǎn)載自:http://www.cocoachina.com/ios/20150925/13566.html

UI Tests是什么?

UI Tests是一個自動測試UI與交互的Testing組件

UI Tests有什么用?

它可以通過編寫代碼、或者是記錄開發(fā)者的操作過程并代碼化,來實現(xiàn)自動點擊某個按鈕、視圖,或者自動輸入文字等功能。

UI Tests的重要性

在實際的開發(fā)過程中,隨著項目越做越大,功能越來越多,僅僅靠人工操作的方式來覆蓋所有測試用例是非常困難的,尤其是加入新功能以后,舊的功能也要重新測試一遍,這導(dǎo)致了測試需要花非常多的時間來進行回歸測試,這里產(chǎn)生了大量重復(fù)的工作,而這些重復(fù)的工作有些是可以自動完成的,這時候UI Tests就可以幫助解決這個問題了

使用方法

第一步:添加UI Tests

如果是新項目,則創(chuàng)建工程的時候可以直接勾選選項,如下圖

如果是已有的項目,可以通過添加target的方式添加一個UI Tests,點擊xcode的菜單,找到target欄

在Test選項中選擇Cocoa Touch UI Testing Bundle

這時候test組件添加成功,它在項目中的位置如下圖所示

第二步:創(chuàng)建測試代碼

手動創(chuàng)建測試代碼

打開測試文件,在testExample()方法中添加測試代碼

如果不知道如何寫測試代碼,則可以參考自動生成的代碼樣式

自動生成測試步驟

選擇測試文件后,點擊錄制按鈕

這時候開始進行操作,它會記錄你的操作步驟,并生成測試代碼

下圖就是在一些操作后自動生成的測試代碼

這時候可以分析測試代碼的語法,以便你自己手動修改或者手寫測試代碼

開始測試

點擊testExample方法旁邊的播放按鈕,它就開始進行自動測試了,這時候你會看到app在自動操作

下面介紹一下測試元素的語法

XCUIApplication:

繼承XCUIElement,這個類掌管應(yīng)用程序的生命周期,里面包含兩個主要方法

launch():

啟動程序

terminate():

終止程序

XCUIElement:?

繼承NSObject,實現(xiàn)協(xié)議XCUIElementAttributes, XCUIElementTypeQueryProvider

可以表示系統(tǒng)的各種UI元素

exist:

可以讓你判斷當(dāng)前的UI元素是否存在,如果對一個不存在的元素進行操作,會導(dǎo)致測試組件拋出異常并中斷測試

descendantsMatchingType(type:XCUIElementType)->XCUIElementQuery:

取某種類型的元素以及它的子類集合

childrenMatchingType(type:XCUIElementType)->XCUIElementQuery:

取某種類型的元素集合,不包含它的子類

這兩個方法的區(qū)別在于,你僅使用系統(tǒng)的UIButton時,用childrenMatchingType就可以了,如果你還希望查詢自己定義的子Button,就要用descendantsMatchingType

另外UI元素還有一些交互方法

tap():

點擊

doubleTap():

雙擊

pressForDuration(duration: NSTimeInterval):

長按一段時間,在你需要進行延時操作時,這個就派上用場了

swipeUp():

這個響應(yīng)不了pan手勢,暫時沒發(fā)現(xiàn)能用在什么地方,也可能是beta版的bug,先不解釋

typeText(text: String):

用于textField和textView輸入文本時使用,使用前要確保文本框獲得輸入焦點,可以使用tap()函數(shù)使其獲得焦點

XCUIElementAttributes協(xié)議

里面包含了UIAccessibility中的部分屬性

如下圖

可以方便你查看當(dāng)前元素的特征,其中identifier屬性可用于直接讀取元素,不過該屬性在UITextField中有bug,暫時不清楚原因

XCUIElementTypeQueryProvider協(xié)議

里面包含了系統(tǒng)中大部分UI控件的類型,可通過讀屬性的方式取得某種類型的UI集合

部分屬性截圖如下

創(chuàng)建Demo

首先創(chuàng)建一個登錄頁面

點擊login按鈕進行登錄驗證,點擊clear按鈕會清除文本

登錄成功后可以去到個人信息頁面

個人信息頁面如下

點擊modify按鈕可以修改個人信息,點擊Message按鈕可以查看個人消息

最后是消息界面

登錄頁面的測試

  • 輸入一個錯誤的賬號

  • 驗證結(jié)果

  • 關(guān)閉警告窗

  • 清除輸入記錄

  • 輸入一個正確的賬號

  • 驗證結(jié)果

  • 進入個人信息頁面

  • 測試代碼如下:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 ????func?testLoginView()?{ ????????let?app?=?XCUIApplication() ????????//?由于UITextField的id有問題,所以只能通過label的方式遍歷元素來讀取 ????????let?nameField?=?self.getFieldWithLbl("nameField") ????????if?self.canOperateElement(nameField)?{ ????????????nameField!.tap() ????????????nameField!.typeText("xiaoming") ????????} ????????let?psdField?=?self.getFieldWithLbl("psdField") ????????if?self.canOperateElement(psdField)?{ ????????????psdField!.tap() ????????????psdField!.typeText("1234321") ????????} ????????//?通過UIButton的預(yù)設(shè)id來讀取對應(yīng)的按鈕 ????????let?loginBtn?=?app.buttons["Login"] ????????if?self.canOperateElement(loginBtn)?{ ????????????loginBtn.tap() ????????} ????????//?開始一段延時,由于真實的登錄是聯(lián)網(wǎng)請求,所以不能直接獲得結(jié)果,demo通過延時的方式來模擬聯(lián)網(wǎng)請求 ????????let?window?=?app.windows.elementAtIndex(0) ????????if?self.canOperateElement(window)?{ ????????????//?延時3秒,?3秒后如果登錄成功,則自動進入信息頁面,如果登錄失敗,則彈出警告窗 ????????????window.pressForDuration(3) ????????} ????????//?alert的id和labe都用不了,估計還是bug,所以只能通過數(shù)量判斷 ????????if?app.alerts.count?>?0?{ ????????????//?登錄失敗 ????????????app.alerts.collectionViews.buttons["確定"].tap() ????????????let?clear?=?app.buttons["Clear"] ????????????if?self.canOperateElement(clear)?{ ????????????????clear.tap() ????????????????if?self.canOperateElement(nameField)?{ ????????????????????nameField!.tap() ????????????????????nameField!.typeText("sun") ????????????????} ????????????????if?self.canOperateElement(psdField)?{ ????????????????????psdField!.tap() ????????????????????psdField!.typeText("111111") ????????????????} ????????????????if?self.canOperateElement(loginBtn)?{ ????????????????????loginBtn.tap() ????????????????} ????????????????if?self.canOperateElement(window)?{ ????????????????????//?延時3秒,?3秒后如果登錄成功,則自動進入信息頁面,如果登錄失敗,則彈出警告窗 ????????????????????window.pressForDuration(3) ????????????????} ????????????????self.loginSuccess() ????????????} ????????}?else?{ ????????????//?登錄成功 ????????????self.loginSuccess() ????????} ????}

    這里有幾個需要特別注意的點:

  • 當(dāng)你的元素不存在時,它仍然可能返回一個元素對象,但這時候不能對其進行操作

  • 當(dāng)你要點擊的元素被鍵盤或者UIAlertView遮擋時,執(zhí)行tap方法會拋異常

  • 詳細實現(xiàn)可參照demo:

    https://github.com/sunljz/demo/tree/master/iOS9/UITestDemo

    個人信息頁測試

  • 修改性別

  • 修改年齡

  • 修改心情

  • 保存修改

  • 測試代碼如下:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ????func?testInfo()?{ ????????let?app?=?XCUIApplication() ????????let?window?=?app.windows.elementAtIndex(0) ????????if?self.canOperateElement(window)?{ ????????????//?延時2秒,?加載數(shù)據(jù)需要時間 ????????????window.pressForDuration(2) ????????} ????????let?modifyBtn?=?app.buttons["modify"]; ????????modifyBtn.tap() ????????let?sexSwitch?=?app.switches["sex"] ????????sexSwitch.tap() ????????let?incrementButton?=?app.buttons["Increment"] ????????incrementButton.tap() ????????incrementButton.tap() ????????incrementButton.tap() ????????app.buttons["Decrement"].tap() ????????let?textView?=?app.textViews["feeling"] ????????textView.tap() ????????app.keys["Delete"].tap() ????????app.keys["Delete"].tap() ????????textView.typeText("?abc?") ????????//?點擊空白區(qū)域 ????????let?clearBtn?=?app.buttons["clearBtn"] ????????clearBtn.tap() ????????//?保存數(shù)據(jù) ????????modifyBtn.tap() ????????window.pressForDuration(2) ????????let?messageBtn?=?app.buttons["message"] ????????messageBtn.tap(); ????????//?延時1秒,?push?view需要時間 ????????window.pressForDuration(1) ????????self.testMessage() ????}

    這里需要特別注意以下兩點:

    textview獲取焦點時無法選擇焦點的位置

    tap事件的觸發(fā)位置是view的中心,所以當(dāng)view的中心被遮擋時,要考慮使用其他view來代替

    個人消息界面測試

    單元格的點擊

    測試代碼如下:

    1 2 3 4 5 6 7 8 9 10 11 ????func?testMessage()?{ ????????let?app?=?XCUIApplication() ????????let?window?=?app.windows.elementAtIndex(0) ????????if?self.canOperateElement(window)?{ ????????????//?延時2秒,?加載數(shù)據(jù)需要時間 ????????????window.pressForDuration(2) ????????} ????????let?table?=?app.tables ????????table.childrenMatchingType(.Cell).elementAtIndex(8).tap() ????????table.childrenMatchingType(.Cell).elementAtIndex(1).tap() ????}

    這里需要注意一點:

  • 暫時無法獲取到tableView的元素指針

  • 總結(jié)

    總的來說,UI Tests只能用于一些基礎(chǔ)功能的測試,驗證app的功能是否可以正常使用,是否存在崩潰問題。但它也有很多不足之處,編寫測試用例的過程非常繁瑣,自動生成的代碼幾乎無法運行,功能單一,很多用例無法覆蓋,而且bug很多,大大地限制了UI Tests在實際開發(fā)中的應(yīng)用。希望正式版出來的時候能夠修復(fù)這些問題,并開放更多的功能。

    demo地址:

    https://github.com/sunljz/demo/tree/master/iOS9/UITestDemo

    歡迎各位提出改進建議,感謝!

    與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的Xcode7 UI自动化测试详解 带demo UITests的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩欧美一区二区三区四区 | 夜夜爽夜夜叫夜夜高潮漏水 | 免费黄色资源 | 日日干视频 | 欧美日本道 | 老王66福利网 | 日本最新中文字幕 | 亚洲AV无码一区二区三区蜜桃 | 黄色av大全| 国产三区视频 | 天天操导航 | 日韩精品免费 | 交视频在线播放 | 中文有码一区 | 欧美成人一区二区三区高清 | 久久国产精品久久久久久 | 夜夜精品一区二区无码 | 亚洲一区二区三区四 | aaaaa级片 | 妺妺窝人体色777777 | av片在线观看网站 | 日韩在线91 | 精品一区二区免费视频 | 日韩一区二区在线观看视频 | 婷婷六月激情 | 亚洲精品国产欧美 | 极品美女被c| 欧美一区三区三区高中清蜜桃 | 人人妻人人澡人人爽精品日本 | 久久久久久久久久久av | 天堂av中文字幕 | 国产一区二区影院 | 麻豆一区二区99久久久久 | 在线一区二区三区视频 | 狠狠躁日日躁夜夜躁 | 伊人久久av| 少妇人妻偷人精品无码视频 | 亚洲一区二区在线视频 | 成人做受视频试看60秒 | 91精品国产麻豆国产自产在线 | 美女视频黄色免费 | 四虎国产精品免费 | 182tv午夜福利在线观看 | 色中文字幕 | 美乳人妻一区二区三区 | 亚洲av无码国产精品麻豆天美 | 97avcc| 都市激情校园春色亚洲 | 色视频综合 | 中文乱码人妻一区二区三区视频 | 动漫av一区| 久久精品一 | 污片网址| 啪啪在线观看 | 中国在线观看视频高清免费 | 国产麻豆一区 | 亚洲网址在线观看 | 免费av一级 | www.操| 清清草免费视频 | 亚洲精品二区三区 | 华丽的外出在线观看 | 调教丰满的已婚少妇在线观看 | 国产八区 | 中文字幕视频在线观看 | 人妻体内射精一区二区 | japanese在线| 久草视频免费 | 国产免费一区二区三区最新6 | 亚洲天堂中文字幕在线观看 | 葵司一区二区 | a视频在线免费观看 | 亚洲免费激情视频 | 久久久久国产精品一区 | 欧美一级二级片 | 激情小说五月天 | 尤物综合网 | 久久影院午夜 | 日韩女同一区二区三区 | 嫩草研究院在线观看 | 国产亚洲欧美在线精品 | 熟女毛毛多熟妇人妻aⅴ在线毛片 | 天天看片天天操 | 欧美变态另类刺激 | 日韩精品999 | 两性免费视频 | 全黄毛片| 精品无码久久久久久久久成人 | 久久久久亚洲精品系列色欲 | 亚洲自拍偷拍精品视频 | 亚洲涩涩爱 | 91美女片黄在线观看游戏 | 精品一区二区成人免费视频 | www.久久爱 | 无码专区久久综合久中文字幕 | 欧美 日韩 中文字幕 | 又污又黄又爽的网站 | 91最新入口 | 亚洲毛片在线观看 |