IOS單元測試(1)

2021-07-07 03:19:22 字數 3000 閱讀 6197

本文不討論單元測試是什麼,或者它之於乙個工程的利弊,我認為單元測試是乙個開發者保證產出**質量的有效工具。本文從使用者的角度對比當下比較流行的兩款單元測試框架,給大家提供「」

閱讀器ios開發

作者高嘉峻

(微博:@gaosboy

),segmentfault.com聯合創始人,杭州ios開發者沙龍發起人,資深ios開發者。

ios開發中的單元測試(一)

test-driven development

和 unit testing

本文對比兩個ios開發中常見的單元測試框架:ocunit,被官方整合進xcode 4.x版本中;ghunit,被推薦最多的測試框架,帶gui介面。初窺兩款測試框架非常相似,而上手使用就會發現其中的區別。細節上的區別使兩款框架在不同角度各有優劣。

ocunit

• 新增單元測試

ocunit是xcode整合的,所以其與工程的結合理應是最好的,新增到工程中的成本也理應最低。使用xcode建立新工程的流程中就有乙個「include unit tests」的選項(如圖1),新的工程就會自動生成乙個logic tests。

如圖1

向已存在的工程中新增ocunit logic tests也不複雜,只需要新增乙個型別為:「cocoa touch unit testing bundle」的target即可(如圖2)。

圖2 向已存在的工程中新增ocunit測試

向已有工程中新增乙個測試target時,xcode會自動生成乙個scheme,執行單元測試用例和build原工程需要切換不同的scheme。如果認為切換scheme非常麻煩,也可以在新增target之前,在「manage scheme」選單中取消「autocreate schemes」(如圖3)。

圖3 新增target不建立scheme

2. 再搜尋「test host」,設定為:$(bundle_loader)

3. 在build phases-target dependencies中新增依賴,選擇主程式target

• 建立測試用例

ocunit的測試用例最常用的方法有三個

1. - (void)setup:每個test方法執行前呼叫

2. - (void)teardown:每個test方法執行後呼叫

3. - (void)test***:命名為***的測試方法

新增target之時xcode已經自動建立了乙個測試用例類:unittestdemotests,其中unittestdemo是工程的名字,該類中已經包含了setup,teardown和testexample三個方法。

通過command+n,選擇「objective-c test case class」建立乙個新的測試用例類(如圖5)。通過xcode建立的測試用例類是乙個繼承自sentestcase(ocunit由sen:te公司開發,因此基類命名為sentestcase)的空類,需要模仿unittestdemotests編寫測試方法。

圖5 建立乙個測試用例類

開發者可以自己實現無返回值,且命名規則為test***的例項方法,並使用框架提供的大量斷言方法。

值得注意的是,ocunit的test bundle是侵入主應用的,因此在使用過程中要十分注意,不要讓單元測試的資源覆蓋主應用資源,造成詭異的bug。

• 執行測試

由於ocunit是整合在xcode中的框架,因此在xcode中執行也比較方便。切換到單元測試的scheme(如果與工程共用scheme則無需切換),product->test(或直接使用快捷鍵command+u),框架會自動查詢所有工程中sentestcase的子類,執行其中全部命名類似test***的無返回值方法。

• 測試反饋

ocunit的失敗方法會通過console和xcode issues兩個位置反饋,通過xcode issues可以直接定位到出現錯誤的單元測試**行。issue的提示資訊就是在單元測試斷言方法中定義的description。

ghunit

• 新增單元測試

ghunit的框架包

,當前的for ios的最新版本是0.5.6,解壓後是乙個ghunitios.framework的資料夾。

圖6 在新target中新增ghunitios.framework

在build phases中新增非官方框架並不會把框架檔案拷貝到工程目錄,而是只做乙個鏈結,所以建議在新增之前先把框架拷貝到工程目錄下。

圖7 選擇ghunitios.framework

接下來用相同的方法新增框架依賴的其他庫:「quartzcore.framework」。

在build settings中搜尋「linker flags」,設定other linker flags - debug - 新增乙個支援全架構和全版本sdk的標示「-objc -all_load」(如圖8)。

圖8 設定linker flags

圖9 修改main函式

• 建立測試用例

建立ghunit測試用例與建立ocunit測試用例相似。

新建乙個objective-c class檔案,繼承自ghtestcase,在xcode生成的.h檔案中不會匯入ghunit.h檔案,需要開發者自行匯入「#import 」。

ghunit框架提供斷言方法比ocunit更加豐富,開發用例也就可以做的更加細緻,更有利查詢/定位錯誤。

• 執行測試

• 測試反饋

圖12 未通過測試的方法,console中的內容

總結

本文簡單介紹了兩款框架的安裝與入門,可以初步了解其各自特點,在接下來的文章中將會更加詳細的介紹如何使用框架進行單元測試,以及框架中的一些高階功能。此外,後續還將向大家介紹另外的與這兩款框架區別更加明顯的單元測試框架。

iOS 單元測試

進入測試tab,可以執行工程自帶的測試用例。我們新增乙個自己的測試用例samplecalctests 在生成的samplecalctest.m中新增標頭檔案引用和成員變數 import ios calcviewcontroller.h inte ce samplecalctests xctestca...

iOS 單元測試

新增測試用例步驟及示例 xctest,它是xcode7中內建的測試框架,使用起來非常簡單 1.新建工程的時候新增測試單元 2.單元測試示例 咱們在這假設乙個使用者向主播送禮物場景,根據使用者送的禮物不同消耗的代金幣不同 user 使用者 present 禮物 anchor 主播 present類 p...

iOS 單元測試

import uikit 工具類 classlftools nsobjectelse import xctest testable import learnt 自己新建的測試類需要testable 引入否則無法訪問 class lftoolstest xctestcase 單元測試結束後呼叫 可以進...