国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

iOS9 UI Tests探索筆記

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

UI Tests是什么?

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

UI Tests有什么用?

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

UI Tests的重要性

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

使用方法

***步:添加UI Tests

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

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

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

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

第二步:創建測試代碼

手動創建測試代碼

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

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

自動生成測試步驟

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

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

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

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

開始測試

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

 

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

XCUIApplication:

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

launch():

啟動程序

terminate():

終止程序

XCUIElement:

繼承NSObject,實現協議XCUIElementAttributes, XCUIElementTypeQueryProvider

可以表示系統的各種UI元素

exist:

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

descendantsMatchingType(type:XCUIElementType)->XCUIElementQuery:

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

childrenMatchingType(type:XCUIElementType)->XCUIElementQuery:

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

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

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

tap(): 點擊

doubleTap(): 雙擊

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

swipeUp(): 這個響應不了pan手勢,暫時沒發現能用在什么地方,也可能是beta版的bug,先不解釋

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

XCUIElementAttributes協議

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

如下圖

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

XCUIElementTypeQueryProvider協議

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

部分屬性截圖如下

創建Demo

首先創建一個登錄頁面

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

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

個人信息頁面如下

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

***是消息界面

登錄頁面的測試

輸入一個錯誤的賬號

驗證結果

關閉警告窗

清除輸入記錄

輸入一個正確的賬號

驗證結果

進入個人信息頁面

測試代碼如下:

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

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

1. 當你的元素不存在時,它仍然可能返回一個元素對象,但這時候不能對其進行操作

2. 當你要點擊的元素被鍵盤或者UIAlertView遮擋時,執行tap方法會拋異常

詳細實現可參照demo: https://github.com/sunGd/demo/tree/master/iOS9/UITestDemo

個人信息頁測試

修改性別

修改年齡

修改心情

保存修改

測試代碼如下:

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

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

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

2. tap事件的觸發位置是view的中心,所以當view的中心被遮擋時,要考慮使用其他view來代替

個人消息界面測試

單元格的點擊

測試代碼如下:

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

這里需要注意一點:

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

總結

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

責任編輯:chenqingxiang 來源: CocoaChina
相關推薦

2015-07-16 12:59:19

IOS9UIDynamics

2015-10-16 14:27:29

iOS9collectionV特性

2015-11-04 09:54:34

ios9人機界面ui

2015-09-16 09:55:12

ios9學習UIKit Dynam

2015-07-21 16:43:13

IOSUI

2015-08-24 09:24:21

ios學習contacts fr

2015-09-25 09:44:24

ios9MapkitTrans

2015-08-20 09:00:23

ios9api

2016-03-18 11:19:57

ios9replaykit入門

2015-09-09 15:51:54

2015-11-11 10:17:15

ios9聯系人框架干貨

2015-09-10 09:31:43

IOS9IOS9.1

2015-08-24 09:19:05

ios9split scree

2015-09-16 09:02:10

IOS9新功能搜索業務

2015-07-27 09:04:33

ios9

2015-05-19 09:51:57

WWDCiOS9

2015-10-20 09:36:52

蘋果iOS 9字體

2015-08-03 10:03:09

iosuistack vie

2015-05-28 23:29:01

xy

2015-10-29 11:13:23

iOS9使用框
點贊
收藏

51CTO技術棧公眾號

成人免费av资源| 午夜精品久久久久久久久久久 | 亚洲乱码中文字幕| 福利一区福利二区| xxx.xxx欧美| 国产精品电影网站| 精品久久久久久久| 狠狠色综合色区| 伦一区二区三区中文字幕v亚洲| 亚洲成人动漫在线观看| 日韩电影中文字幕在线观看| 高清毛片在线看| 亚洲成人激情视频| eeuss影院在线播放| 国产一区二区三区免费看 | 国产精品影院在线| 中文字幕巨乱亚洲| 亚洲精品一卡二卡三卡四卡| 国产91在线|亚洲| 蜜桃网站在线观看| 七七婷婷婷婷精品国产| 欧美一区二区在线| 精品美女久久| 国产成人精品久久亚洲高清不卡| 亚洲成人影院麻豆| 黑人精品欧美一区二区蜜桃| 欧美一区二区综合| 国产成人自拍网| 爱情岛论坛成人| 中文一区二区完整视频在线观看| 成人自拍视频网站| 国产亚洲美州欧州综合国| 欧美日韩高清免费| 亚洲激情在线播放| 国产免费不卡| 91牛牛免费视频| 欧美色女视频| 美脚丝袜一区二区三区在线观看| 亚洲欧美日韩国产综合精品二区 | 美女诱惑一区二区| 4k岛国日韩精品**专区| 韩剧1988在线观看免费完整版| 成人激情电影在线看| 国产精品亚洲а∨天堂免在线| 51视频国产精品一区二区| 你懂的在线观看一区二区| 欧美日韩亚洲第一| 一区二区三区四区激情| 天天操夜夜干| 亚洲另类一区二区| 神马影院一区二区| 日韩影院免费视频| 久操网在线观看| 日韩中文视频免费在线观看| 99热99re6国产在线播放| 国产亚洲精品成人av久久ww| 国产成年精品| 欧美一级日本a级v片| 色老头久久综合| 91麻豆精品国产综合久久久| 国产精品69久久久久| 一区二区三区加勒比av| 九九色在线视频| 欧美成人dvd在线视频| 中文字幕在线观看不卡| 制服丝袜中文字幕在线| 一本大道亚洲视频| 三级影片在线观看欧美日韩一区二区| 日韩福利影院| 欧美日韩国产a| 亚洲电影有码| 免费黄色一级网站| 欧美日韩中文另类| 欧美xo影院| 97色在线观看免费视频| 第一区第二区在线| 97超碰人人在线| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 久久精品亚洲国产奇米99| 欧美日韩视频在线第一区| 国产三线在线| 久久久国产精品一区| 欧美精品国产一区| 性欧美videossex精品| 色拍拍在线精品视频8848| 日韩电影免费观| 国产高清一区视频| 亚洲欧美区自拍先锋| 亚洲高清黄色| 国产精品久久激情| 一区二区三区日韩在线观看| 狠狠入ady亚洲精品| 天堂电影一区| 一区二区不卡视频| 高清视频一区| 久久精品男人天堂| 蜜臀精品久久久久久蜜臀| 久久99性xxx老妇胖精品| 国产美女在线播放| 91免费版黄色| 国产日韩在线视频| 欧美一三区三区四区免费在线看 | 国产无遮挡裸体视频在线观看| 91精品国产综合久久香蕉| 亚洲男人电影天堂| 国产一区免费电影| 久久精品国产99久久6| 亚洲精品播放| aaa日本高清在线播放免费观看| 国产精品无码免费专区午夜| 亚洲一区二区三区四区视频| 91丨porny丨蝌蚪视频| 午夜av一区| 精品日产免费二区日产免费二区| av免费不卡国产观看| 亚洲第一区第二区| 日韩欧美伦理| 人人妻人人添人人爽欧美一区| 午夜电影一区二区| 亚洲精品午夜| 欧美一区日本一区韩国一区| 亚洲天天做日日做天天谢日日欢 | 久久99热99| 成人福利在线观看视频| bestiality新另类大全| 欧洲中文字幕国产精品| av在线天堂播放| 成人漫画网站免费| 国产精品久久久久久久av电影| 久久午夜影院| 欧美高清中文字幕| 日韩一区二区在线免费观看| 大胆日韩av| jizz欧美大全| 欧美成aaa人片在线观看蜜臀| 久久精品国产精品亚洲红杏 | 欧美视频在线观看网站| 欧美一区二区视频在线观看2020| 波多野结衣在线观看一区二区 | 日韩精品免费一区| 欧美日韩国产另类一区| 久久精品国产大片免费观看| 丰满少妇在线观看| 中文字幕av一区二区三区谷原希美| 日本视频中文字幕一区二区三区| 精品亚洲综合| 91性高湖久久久久久久久_久久99| 亚洲色图视频免费播放| 精品三级在线观看视频| 国产精品久久久久久久乖乖| 欧美一区二区中文字幕| 亚洲欧美丝袜| 久久精品国产综合精品| 91精品久久久久久久久| 成人高清视频观看www| 国产一区二区三区视频在线观看| 一区二区三区美女| 粉嫩蜜臀av国产精品网站| 日韩精品色哟哟| 蜜桃视频在线观看一区| 一区二区亚洲精品| 全国精品久久少妇| 国产成人精品免费看| 日本vs亚洲vs韩国一区三区二区 | 国产经典自拍视频在线观看| 成人在线观看av| 97avcom| 亚洲精品电影网站| 日韩欧美高清视频| 亚洲福利视频在线| 日韩理论电影| 欧美日韩在线精品一区二区三区激情综| 51精品国产黑色丝袜高跟鞋| 日韩一区在线看| 第一sis亚洲原创| 一级香蕉视频在线观看| 成人伊人精品色xxxx视频| 欧美在线一区二区三区| 国产亚洲精品久久久久婷婷瑜伽| 国产在线高潮| 国产日产欧美一区二区| 久久久91精品国产| 国产精品久久久久久久久免费相片| 亚洲图区在线| porn亚洲| 99精品一区二区三区的区别| 久久久精品久久| 亚洲人成7777| 欧美影视一区| 国产丝袜在线观看视频| jizzjizz国产精品喷水| 日产日韩在线亚洲欧美 | 99国产视频| 日韩视频中午一区| 99热精品国产| 国产一区二区三区日韩精品| 香蕉视频国产在线观看| 香港三级日本三级a视频| 国产精品va在线播放| 欧美成人综合网站|