[iOS-test]關於Xcode測試

關於Xcode測試 

Xcode爲你提供了豐富的軟件測試功能。測試可增強工程的穩定性,減少bug,從而加快產品的分發和銷售。一個測試良好的應用可提升用戶的滿意度。測試也可以幫你加快應用的開發,進一步說可讓你少浪費精力和時間,並且可幫助協調多人開發。
 
概覽
在本文檔中,你將會學習如何使用Xcode 5的測試功能。XCTest替代OCUnit成爲Xcode 5中新的測試框架。XCTest兼容iOS 7、OS X v10.8以及v10.9。
1.快速開始:Xcode 5使用測試導航面板(test navigator)來簡化測試設置和運行,從而改進和自動化測試項目配置。
2.Xcode Server和Continuous Integration:Xcode測試可以使用bots進行配置,從而使設備自動連接到運行OS X Server的Mac上。
3.現代化:Xcode 5包含現代化的輔助工具可方便地把使用OCUnit測試的項目轉爲使用XCTest測試。
 
前提
你應該熟悉應用設計和編程概念。
 
推薦閱讀
你可以查看“Testing Apps and Frameworks”示例代碼熟悉各種各樣的方法案例和使用異常,以鑑定並報告錯誤的API用法。
還可以查看WWDC 2013上的Xcode測試性能:Testing in Xcode 5 (409)
 

快速開始
本章由CocoaChina翻譯小組成員 dada(github地址)翻譯   
 
本文的目的在於讓測試成爲你軟件開發的重要組成部分,並使測試更方便並易於使用。
 
Test Navigator 測試導航欄
測試時我們會頻繁使用Xcode5的測試導航欄。
 
測試導航是Xcode工作區的一部分,被設計用來方便的創建、管理、運行和審覈測試功能。點擊導航的選擇欄,在問題導航和調試導航欄的中間那個就是測試導航。當你的工程定義了一組測試功能,你會在導航欄看到如下圖所示:
上面的測試導航展示了一個樣板工程中的測試包、類和方法的分級表。這個工程是一個計算器應用。計算器引擎實現爲一個框架包。你可以 SampleCalcTests 測試包的分級的頂部看到應用中的測試代碼。
 
注意: Xcode的目標生成產品。Xcode的測試目標生成測試包並展示在測試導航欄中。
 
如果你的測試使用存儲數據文件、圖片,和其他的類型,則可以把它們添加到測試包中,並使用 NSBundle 的API在運行時訪問。和測試類一同使用 +[NSBundle bundleForClass:] 來保證測試類從包中取得正確的數據。更多的信息可見NSBundle Class Reference.
 
Xcode schemes 控制那些編譯的內容。Schemes也可以控制可用的測試方法來執行測試操作。你可以在測試導航面板列表中通過Control+單擊項目來啓動或關閉測試包、類和方法,或者從快捷菜單中啓用或者關閉測試,也可以在scheme中啓用或者關閉測試。
此視圖中的激活的測試包是 SampleCalcTests 。 SampleCalcTests 包括了一個測試類,總共有9個測試方法。 當你按住表中任何一個項目的箭頭,運行按鈕會展示右邊的項目名。這是比較快捷的方式運行包裏所有的測試或者任何獨立的測試。測試返回通過或失敗結果給Xcode。當測試被執行,標識會更新從而向你展示結果,綠色的對勾標記是通過,紅色的X爲失敗。在下面的測試導航面板中,兩個測試被判定爲失敗。
點擊列表中的任意測試類或測試方法都會在源碼編輯器中打開測試類。測試類和方法標記在源碼編輯器的側欄中,和標記放在一起,和在測試導航面板中的工作方式相同。測試失敗在源碼編輯器中相關的斷言處展示結果字符串。
 
測試導航面板底部是添加按鈕 (+) ,還有一個過濾控制器。你可以縮小範圍,比如只在活躍的scheme中測試或者只測試失敗的測試,也可以通過名稱篩選測試。
 
更多測試導航詳細信息可見Test Navigator Help
 
給你的應用添加測試
在Xcode5中創建新的應用和框架/庫類會預配置一個測試目標。當你打開新工程,在測試導航面板上可以看到一個測試包、一個測試類和一個測試方法的模板。但是如果打開一個比較老的版本的Xcode的工程就不會有測試目標了。下面的工作流程展示了一個假定沒有集成測試目標的工程。
 
創建測試目標 
打開測試目標,點擊左下角的(+)按鈕,從菜單中選擇New Test Target。 
根據你的設置偏好和需求,在新目標助手中編輯Product Name和其他參數。
點擊完成按鈕來添加目標,測試導航面板中包含了模板測試類和一個測試方法。 
運行測試並查看結果
現在你已經把測試加到了工程中,你會想要運行這些測試來做一些有用的事。但首先要在測試導航面板中把鼠標懸停在 SampleCalcTests 測試類上並點擊運行按鈕來運行所有的測試方法,在測試導航面板中拋出了一個錯誤來。點擊testExample 方法可以看到下面圖中的測試結果、源代碼和高亮的錯誤情況:
測試失敗的原因是測試的模板類包含了一個默認的測試方法 XCTFail() ,一個強制判爲失敗的斷言。
 
編輯測試代碼然後繼續運行
因爲這是一個計算器應用的樣板工程,你可能要在最開始的時候檢查它是否能正確執行加法。因爲測試編譯到app項目裏面,不管多複雜,你都可以按照你的需求添加所有的上下文和其他所需信息來執行測試。
 
插入下方的#import和實例變量聲明到 SampleCalcTests.m 文件中 
  1. #import  
  2. // 
  3. // Import the application specific header files 
  4. #import "CalcViewController.h" 
  5. #import "CalcAppDelegate.h" 
  6.  
  7. @interface CalcTests : XCTestCase { 
  8. // add instance variables to the CalcTests class 
  9. @private 
  10.     NSApplication       *app; 
  11.     CalcAppDelegate     *appDelegate; 
  12.     CalcViewController  *calcViewController; 
  13.     NSView              *calcView; 
  14. @end 
 
給測試方法一個描述性名稱,比如 testAddition ,然後添加到implementation資源中。
  1. - (void) testAddition 
  2.    // obtain the app variables for test access 
  3.    app                  = [NSApplication sharedApplication]; 
  4.    calcViewController   = (CalcViewController*)[[NSApplication sharedApplication] delegate]; 
  5.    calcView             = calcViewController.view; 
  6.  
  7.    // perform two addition tests 
  8.    [calcViewController press:[calcView viewWithTag: 6]];  // 6 
  9.    [calcViewController press:[calcView viewWithTag:13]];  // + 
  10.    [calcViewController press:[calcView viewWithTag: 2]];  // 2 
  11.    [calcViewController press:[calcView viewWithTag:12]];  // = 
  12.     XCTAssertEqualObjects([calcViewController.displayField stringValue], @"8", @"Part 1 failed."); 
  13.  
  14.    [calcViewController press:[calcView viewWithTag:13]];  // + 
  15.    [calcViewController press:[calcView viewWithTag: 2]];  // 2 
  16.    [calcViewController press:[calcView viewWithTag:12]];  // = 
  17.     XCTAssertEqualObjects([calcViewController.displayField stringValue], @"10", @"Part 2 failed."); 
現在,點擊運行按鈕運行 testAddition 方法。
注意:測試導航的列表的改變,反應了 testExample 已經被替換爲 testAddition 。
 
這裏仍有錯誤,看下面的代碼,第一部分成功,第二部分有問題。仔細觀察,錯誤很明顯:字符引用"11"多了1。改爲“10”就能測試成功了。
相同的通用代碼使用 setUp() 和 tearDown()方法
Xcode運行測試方法一次測試所有測試包中的測試類。在這個小例子裏只有一個測試方法被實現了,這裏需要訪問三個計算器應用對象變量的功能。如果在該類中寫了4個或5個測試方法,你會發現你在每一次測試方法獲得應用的對象狀態中,重複了相同的代碼。XCTest框架爲測試類提供了實例方法 setUp  和  tearDown ,你可以用它在每個測試方法運行之前或者之後運行通用代碼的調用。
 
setUp和tearDown很簡單。在 testAddition 資源裏 Mac_Calc_Tests.m ,在第四行用// obtain the app variable for test access 開頭,並將它們粘貼到模板提供的默認的 setUp 實例方法中。
  1. - (void)setUp 
  2.     [super setUp]; 
  3.     // Put setup code here. This method is called before the invocation of each test method in the class. 
  4.  
  5.    // obtain the app variables for test access 
  6.    app                  = [NSApplication sharedApplication]; 
  7.    calcViewController   = (CalcViewController*)[[NSApplication sharedApplication] delegate]; 
  8.    calcView             = calcViewController.view; 
現在使用少的重複代碼添加第二個測試方法: testMultiplication 以及其他。
 
總結
當你看完這篇簡短的快速開始,會發現向工程添加測試很簡單。這裏有幾個要注意的地方:
1.Xcode配置好了大部分基本的測試設置。當你添加一個測試目標,Xcode會爲項目創建測試包文件,添加測試包到測試導航面板,爲工程添加XCTest框架,並且爲測試類和方法提供模板。
2.測試導航面板可以很方便的定位和編輯測試方法。你可以使用導航面板裏的指示按鈕快速運行測試,或在測試類實現打開時直接在資源編輯器中運行。當測試失敗,測試導航面板中的標識跟源碼編輯器中錯誤的地方相對應。
3.單個測試方法可以包括多個斷言,導致單個通過或失敗結果。這個方法可讓你根據項目需要創建簡單或者非常複雜的測試。
4. setUp  和  tearDown 實例方法爲你提供了一種途徑來把相同的代碼用在很多個測試方法中,從而獲得更高的一致性,並簡化調試。
發佈了28 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章