本文章轉載于搜狗測試
說完了UITest和Appium我們這次來介紹一下,被廣泛認可的一個三方的UI測試框架KIF。
KIF是一個開源的專為iOS設計的移動應用測試框架,使用Objective-C語言開發,能和應用的代碼工程完美結合。
它是使用私有API對UI界面進行操作的自動化測試框架,這種類型的測試框架已大行其道,非常受歡迎,KIF就是其中出色的一個,同時,KIF還繼承了XCTest,很多大的軟件公司比如Google都在用這個測試框架。可見,KIF的認可度還是蠻高的。
下面小編帶著大家來簡述一下KIF在使用過程中的優缺點,進而大概的了解一下這個框架的工作方式和功能特點
優點:
(1) 繼承XCTest,UI測試可以和白盒測試相結合 (這點跟UITest比較像)
(2) 適合做持續集成 (持續集成一直被測試的發展之路,所以一個能做可持續集成的框架,生命力將會很頑強)
(3) 開源 (這是我最喜歡它的一個重要因素,對于一個開發者來說,一個開源的項目是一個非常幸福的事情)
(4) 單用例調試,編碼調試輕松愉快 (因為集成自XCTest,所以在xcode中調試,能輕松實現單個用例調試)
當然 KIF的有點很明確,缺點也是相當明確。
缺點:
(1) 需要被測試工程源碼 (這對于外包公司的人來說,或者說對于一個代碼要求嚴格的公司來說,這無疑是一個沉重的打擊)
(2) 對自定義的控件支持不好 (這個應該不用做太多解釋)
(3) 不支持UIWebView (其實這個缺點應該影響不大,大多數框架對UIWebView的支持都不太好)
(4) 測試框架和被測試app在同一進程,測試框架的問題可能會影響被測試app (這個缺點有可能被開發質疑,有的時候出現問題,開發會認為是你的測試代碼有問題,所以做好心理準備,和要對自己的代碼有自信)
適用場景:
(1) 較為復雜的UI測試或者是UI測試和白盒測試相結盒的測試
測試代碼:
配置
(1) 下載好KIF框架工程文件后,把KIF.xcodeproj文件拉進被測試工程里
(2) 新建一個測試target,點“Add Target”,選擇iOS -> Test -> iOS Unit Testing Bundle。
(3) 對于這個target,把KIF里的靜態庫libKIF.a和系統的IOKit.framework和它關聯
(4) 對于這個target,在Build Settings中的Other Linker Flags選項加一個值-ObjC
(5) 可以編寫測試用例了,有兩個重要的KIF測試類KIFTestCase(XCTestCase的子類)以及KIFUITestActor,看名字就知道哪個是做什么事的了。
執行操作
首先說明一下,KIF的UI控件操作和獲取都是封裝在一起的,每個接口里都包含了以什么屬性獲取控件,以及對這個控件執行什么操作兩個部分。所以就沒有獲取控件這個部分的說明了。也因為這個原因,KIF的操作接口會非常的多,這里列舉幾個常用的。
(1)點擊某個位置
tapScreenAtPoint:(CGPoint)screenPoint
(2) 點擊以label命名的控件
tapViewWithAccessibilityLabel:(NSString )label
(3) 長按以label命名的控件,時間長為duration
longPressViewWithAccessibilityLabel:(NSString)label duration:(NSTimeInterval)duration;
(4) 在一個控件里輸入一段字符
enterText:(NSString)text intoViewWithAccessibilityLabel:(NSString *)label
(5) 滑動某個控件
swipeViewWithAccessibilityLabel:(NSString)label inDirection:(KIFSwipeDirection)direction
驗證機制
(1) UI層面
if(tryFindingViewWithAccessibilityLabel:”label” error:error)
{ //test pass}
else { //test fail}
(2) 非UI層面
由于是繼承XCTest的,所以XCTest所具有的那些斷言在KIF里都是可以通用的。共有18個。
XCTFail(format…) 生成一個失敗的測試;
XCTAssertNil(a1, format…)為空判斷,a1為空時通過,反之不通過;
XCTAssertNotNil(a1, format…)不為空判斷,a1不為空時通過,反之不通過;
XCTAssert(expression, format…)當expression求值為TRUE時通過;
XCTAssertTrue(expression, format…)當expression求值為TRUE時通過;
XCTAssertFalse(expression, format…)當expression求值為False時通過;
XCTAssertEqualObjects(a1, a2, format…)判斷相等,[a1 isEqual:a2]值為TRUE時通過,其中一個不為空時,不通過;
XCTAssertNotEqualObjects(a1, a2, format…)判斷不等,[a1 isEqual:a2]值為False時通過;
XCTAssertEqual(a1, a2, format…)判斷相等(當a1和a2是 C語言標量、結構體或聯合體時使用,實際測試發現NSString也可以);
XCTAssertNotEqual(a1, a2, format…)判斷不等(當a1和a2是 C語言標量、結構體或聯合體時使用);
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format…)判斷相等,(double或float類型)提供一個誤差范圍,當在誤差范圍(+/-accuracy)以內相等時通過測試;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format…) 判斷不等,(double或float類型)提供一個誤差范圍,當在誤差范圍以內不等時通過測試
XCTAssertThrows(expression,format…)異常測試,當expression發生異常時通過;反之不通過;(很變態
XCTAssertThrowsSpecific(expression, specificException, format…) 異常測試,當expression發生specificException異常時通過;反之發生其他異常或不發生異常均不通過;
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format…)異常測試,當expression發生具體異常、具體異常名稱的異常時通過測試,反之不通過;
XCTAssertNoThrow(expression, format…)異常測試,當expression沒有發生異常時通過測試;
XCTAssertNoThrowSpecific(expression, specificException, format…)異常測試,當expression沒有發生具體異常、具體異常名稱的異常時通過測試,反之不通過;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format…)異常測試,當expression沒有發生具體異常、具體異常名稱的異常時通過測試,反之不通過
KIF就介紹到這里,不知道大家的感悟怎么樣,是不是有了一種別樣的體會呢?