轉:http://www.lxweimin.com/p/1616d9bfbb53
代碼覆蓋
代碼覆蓋率是Xcode7的一項功能,能夠顯示和測量你有多少的代碼執行了測試。隨著你代碼的覆蓋你可以確定你的測試是不是達到了你預期的工作。
查看代碼覆蓋
當你的代碼覆蓋以后,LLVM基于方法和功能的連通的頻率來收集覆蓋數據。代碼覆蓋率不但可以收集數據也可以看測試的正確性和性能測試報告,無論是單元測試還是UI測試。
你可以查看代碼覆蓋通過scheme’s編輯測試行為。
打開scheme編輯菜單。
選擇editor scheme。
啟用代碼覆蓋復選框來收集覆蓋數據。
單擊close。
注意:代碼覆蓋率啟用之后會在性能上有一些損失。無論損失是否顯著,都影響了代碼的執行,但是線性方式使性能測試仍然可以進行比較。試運行的時候啟用它。你應該考慮是否啟用代碼覆蓋率,當你對應用程序進行測試的時候。
如何規范代碼覆蓋
代碼覆蓋率是衡量你的測試的價值的工具。它回答了一些問題:
當你運行的你的測試的時候有多少代碼是被運行的。
多少的測試代碼才滿足測試。換句話說就是,你有足夠的測試框架,確保你所有的代碼被檢查(正確性和性能)。
哪部分代碼沒有被測試到。
測試運行以后Xcode取得LLVM得到的覆蓋數據,并使用這些數據來穿件一個報表導航覆蓋報告,在覆蓋窗格中可以看到。它顯示了測試運行的概要信息,在文件中列出了源文件和函數的列表以及,每一個的覆蓋率。
源代碼的右側顯示了每一行代碼的未執行技術。它強調了需要覆蓋在沒有覆蓋的代碼的區域。
覆蓋的注解繪制在右側,顯示了代碼的特定部分進行了多少次的測試在測試期間的計數。
有一些方法沒有在測試中調用,這些方法會明顯的顯示在源代碼編輯器中。
自動化測試流程
在開發過程中除了以交互方式運行測試外,還可以充分采取使用Xcode Server進行自動化測試。
基于Server的持續集成測試
Xcode測試具有交互性,他能確保你的代碼在其指定的需求下不偏離正確的軌道,并且可以簡單的找到并修復BUG。一系列快速運行的功能測試不僅可以校正你的工作,還可以讓你高效率的自信的構建一個健壯的程序。
這就是說,成功的開發項目往往超出單個開發人員實現和維護的能力范圍。像源碼管理,服務器上的自動化測試可讓你順利搞笑的根據團隊的需求進行開發工作。通過Xcode Server,Xcode支持基于服務器的持續集成工作流。Xcode Server適用于OS X Server,可以自動化應用程序的構建、分析、測試以及歸檔的一體化過程。
下面是基于Server測試的一些優點:
使用服務器可以進行脫機構建和測試,以緩解開發系統做實施和調試的壓力,特別是在全方位測試時可能需要很長的時間來執行。
開發團隊的所有成員使用相同的scheme可在服務器上運行相同的測試,從而提高測試的一致性,整個團隊也可以構建產品,就像構建測試報告。
你可以靈活調整項目需求和團隊的需求。比如,當項目中任意一個成員向源代碼管理系統提交新工作或者在設定的時間定期提交時測試運行就可以了。測試運行也可以按照需要手動啟動。
服務器以同樣的方式反復運行測試。隨著時間的推移,服務器的報告可以讓你和你的團隊對構建過程中的問題、警告以及測試解決方案有個整體的輪廓。
你的項目可以有更多的目的進行測試,更具自動性,而且比收訂運行測試系統更加經濟。例如你可以有任意數量的iOS設備連接到服務器,使用單一的配置,該系統可以構建和測試庫、應用程序、所有測試以及iOS模擬器的多個版本。
注意:當你的項目工作橫跨iOS和Mac iOS X時,應用就會有兩個約束:
OS X項目構建和測試時服務器必須處于運行中。
iOS和OS X的項目需要各自不同的scheme和bot。
命令行測試
使用Xcode的命令行測試,可以編寫自動化腳本來構建和測試你的項目。通過使用此功能,你可以充分利用現有的構建自動化系統的優勢。
使用XcodeBuild運行測試
XcodeBuild命令行工具像Xcode IDE和OS X Server中的Xcode服務一樣驅動測試。使用BuildAction運行XcodeBuild測試。用-destination參數指定不同的測試目的。例如要在本地OS X“my Mac 64 Bit”測試MyApp,
使用如下命令來指定目標和框架:
?? ? xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=OS X,arch=x86_64'
如果你有development-enabled設備插入,你可以按照名稱或者id調用它們。例如,如果你有一個名為“Development iPod touch”的iPod設備連接了測試代碼,可以使用下面的命令來測試代碼:
?? ? xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=iOS,name=Development iPod touch'
測試也可以在iOS模擬器上運行。使用模擬器可以應對對不同的機型因素和操作系統版本。
?? ? xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=Simulator,name=iPhone,OS=8.1'
-destination參數可以被連接在一起,這樣你只需要一個命令,就可以跨目標進行指定集成共享方案。例如下邊的例子就是將上面的三個例子合在了一個命令當中:
?? ? > xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp
-destination 'platform=OS X,arch=x86_64'
-destination 'platform=iOS,name=Development iPod touch'
-destination 'platform=Simulator,name=iPhone,OS=9.0'
如果測試失敗,XcodeBuild將返回一個非零的退出代碼。
這些都是你所需要了解的命令行運行測試的要領。有關XcodeBuild更詳細的信息,請在終端的應用程序窗口中使用命令進行查找。
?? ? man xcodebuild
在XcodeBuild中使用ssh
調用XcodeBuild從ssh遠程登陸(或者demon發射)失敗,除非你在主機建立一個正確的會話環境。
當你作為一個用戶以交互方式登陸到你的OS X系統時需要創建一個“Aqua session”環境。Aqua session初始化基礎框架在OS X交互環境下,為了能夠運行OS X App這個是必須的。更多的特性,代碼使用UI frameworks(AppKit or UIKit)也需要在“Aqua session”運行。因為這個有必要的,OS X的測試(模擬器的測試,OS X的app)都要求“Aqua session”。
默認的情況下,創建一個命令行使用ssh登陸到OS X系統是不能運行會話的。當你使用ssh登陸的時候你必須確?!癆qua session”被創建,你必須有一個用戶登陸到了一個遠端的OS X主機系統。一個用戶存在運行在一個遠端系統在“Aqua session”通過ssh登陸。
用戶第一次運行在這個主機系統,運行XcodeBuild通過ssh登陸的方式進行測試。下邊是通過遠端的主機運行一個測試app“MyApp”通過ssh:
?> ssh localhost
?> cd ~/Development/MyAppProject_Folder
?> xcodebuild test -project MyApp.xcodeproj -scheme MyApp -destination 'platform=Simulator,name=iPhone 6'
參考:technical notes a target="_self" Daemons and Agents/a and a target="_self" Daemons and Services Programming Guide。
使用 Xcode Server 和 Continuous Integration
使用Xcode
Server和持續集成的工作流可以設計無縫和透明的交互式開發。在使用基于服務器的持續集成過程中,很多工作都花在服務器和項目的安裝配置上,在這里我們簡要描述一下。在開始使用
Xcode Server
和持續集成系統時,僅需三個高級任務。此后,該任務要做的顯示正在進行的監測結果和進行不定期的維護。這個概述簡要地總結了這些任務,更詳細的信息可在
“Xcode Continuous Integration Guide” 中查看。
用戶界面測試
UI測試可以讓你驗證UI元素的屬性和狀態,也可以讓界面間進行交互。
UI測試包括UI記錄,UI測試讓你有能力讓你在你的App中通過一些方式進行演習,你也可以通過UI測試工具來擴展。
這個記錄讓UI測試得到了更多的詳細信息,包含測試不通過的時候的屏幕的快照。
UI測試包括兩個核心技術:XCTest framework and Accessibility。
XCTest提供框架具有UI測試的功能,和Xcode兼容。創建和使用UI測試擴展根據你會XCTest和單元測試的程度。你可以在你的工程里創建一個UI測試target、UI測試類、UI測試方法。你使用XCTest斷言驗證你的預期是否正確。你也可以集成一個Xcode
Server和XcodeBuild。XCTest充分的兼容Object-C和Swift。
Accessibility是技術的核心,可以讓殘疾用戶得到和一般用戶一樣的體驗。它包含很多語義的數據用戶可以通過指引使用你的App。Accessibility是UIKit和APPKit的綜合有很多API允許你調整一些行為讓一些功能暴露在表面進行使用。UI測試使用這些數據實現這些功能。
在源代碼里創建一個UI測試類似與單元測試。你創建一個UI測試target在你的app中;Xcode默認創建一個UI測試組和實現文件,在實現文件里寫了測試方法的模版。當你創建一個UI測試target,你可以指定你要測試的app。
UI測試的工作遠離是找到一個應用程序的用戶界面與查詢對象、綜合時間并派發它們到這些對象。提供了很多的API使你能夠檢查用戶界面對象的屬性和狀態對他們進行比較確定是不是你期望的狀態。
要求
UI測試不僅依賴第三方工具的服務和API也需要OS平臺。你需要Xcode7,OS X 10.11 EL Capitan和iOS9。UI測試保護隱私:
iOS設備需要能夠開發、連接到信任的主機。
OS X需要允許授權對與一些特殊的App在Xcode中。在界面測試第一次運行的時候會自動提示你。
概念和API
界面測試和單元測試的基本原理不同。單元測試可以讓你在程序的范圍能夠完全的訪問內部的方法、變量、狀態進行一些測試。界面測試可以讓你通過相同的方式使用app內部的方法、功能和變量。這使你的測試通過相同的方式揭露UI和用戶遇到的問題。你的測試代碼、綜合時間、用戶界面作為一個單獨的用用程序運行。
APIs
XCUIApplication。
XCUIElement。
XCUIElementQuery。
開始使用UI記錄
開始使用UI記錄。他產生的源代碼轉換成可以被編輯來構建測試或回放一個也定場景的測試的實現文件。UI記錄也是非常有用的對于探索新的用戶界面或學習如何編寫UI測試。操作的基本順序如下:
使用測試導航面板,創建UI測試target。
在所創建的文件中,將光標移動到測試功能。
啟動UI記錄。
該程序啟動和運行。行使程序做UI操作的序列。Xcode捕捉函數體的行動納入數據。
當你要測試的動作完成以后,停止錄制UI。
添加XCTest斷言數據。
編寫UI測試
API測試可以同時進行功能測試和性能測試,所以可以進行UI測試。UI測試在應用程序的界面進行操作,很多簡單的功能都集成到界面測試里測試是不是預期的表現和反應。
UI測試從事件的響應級別進行操作:
查找到一個元素。
知道一個元素的預期行為。
點擊或點擊該元素引起反應。
衡量是不是響應了預期的行為。
創建一個UI測試通過XCTest創建和單元測試一樣的編程模型。類似的操作和編程方法的整體使用,給出UI測試的API基本概念,以及它們如何運作。
在測試類結構提供setup方法,和單元測試類不相同。
- (void)setUp {? ? [supersetUp];// Put setup code here. This method iscalled before the invocation of each test method in the class.self.continueAfterFailure =NO;? ? [[[XCUIApplicationalloc] init] launch];}
Self.continueAfterFailure值默認值設置為NO。一個正確的UI測試依賴于前一個測試的成功。如果一個測試失敗,下邊的所有測試失敗就因為最前邊的測試失敗。
另外setup方法包括創建實例XCUIApplication并啟動它。UI測試必須啟動它來進行測試,并缺都在setup方法的測試方法之前運行,這確保了應用啟用下邊的測試。
編寫UI測試方法的時候你應該使用UI錄制功能創建一個測試的步驟。你的目的就是編輯這個基本的序列,使用XCTest斷言確定是不是一個成功或者失敗的單元測試。UI測試可以同時測試功能和性能就像單元測試一樣。
保證一個正確的UI測試一般模式如下:
使用XCUIElementQuery找到下一個XCUIElement。
合成一個事件并將其發送到XCUIElement。
使用斷言的XCUIElement的狀態比較預期的參考狀態。
附錄A:編寫可測試的代碼
Xcode集成了對測試的支持,使您能夠構建測試包,以支持各種不同方式的開發工作。使用測試,可以發現代碼中潛在的回歸,并測試預期的成功與否,并驗證應用程序的行為。通過確保對象能以預期的方式運行,測試能提高代碼的穩定性。
當然,通過測試讓程序達到穩定的水平也取決于你寫的測試的質量。同樣,編寫良好測試的難易度也取決于你的編碼方式。專為測試設計的代碼編寫有助于編寫良好的測試。閱讀下面的指南,以確保你的代碼是可測試的,以有效減小編寫良好測試的難度。
指南
定義API的需求。
為添加到項目中的每個方法或者函數定義,需求和結構都非常重要。對于需求,包括輸入和輸出范圍,exception拋出異常、條件限制以及返回值的類型(尤其如果值是實例的時候)。定義要求并確保滿足代碼中的需求可以幫助你編寫出健壯的安全的代碼。
邊寫邊側
每當你設計和編寫出一個方法或函數時,就應該編寫一個或多個測試用例來確保API的需求得到滿足。記住,為現有代碼編寫測試要比你為正在編寫的代碼難得多。
檢查邊界條件
如果對一個方法的參數值必須在特定的范圍內,你的測試應包括該范圍的最低和最高值。例如如果一個程序有一個整數參數,那么該參數值的范圍要在0和100之間(包括首尾值),該方法的測試代碼應該為參數傳遞0,50和100這些值。
使用negative測試
negative測試可以確保你的代碼能夠適當地響應出錯的條件。當收到無效的或意外的輸入值時,它可以驗證代碼的行為。同樣的,還可以驗證它返回錯誤代碼或者引發異常的行為。例如,如果一個證書參數范圍必須為1?100(包含首尾值),創建測試用例并傳值-1和101,以確保該程序能夠引發出一個異常或者返回一個錯誤代碼。
編寫全面的測試用例。
全面的測試通過結合不同的代碼模塊來實現API的一些更復雜的行為。雖然簡單,隔離測試提供值,堆疊測試表現復雜行為,這樣能捕獲更多的問題。這些類型的測試在更現實的條件下模擬你的代碼的行為。例如除了將對象添加到數組,你還可以創建數組為之添加幾個對象,使用不同的方法刪除若干對象,然后確保集合以及其余對象的數量是正確的。
使用測試用例覆蓋BUG修復
每當你修復完一個BUG,都要編寫一個或者多個測試用例,來驗證此次修復的有效性。
附錄B:從OCUnit過度到XCTest
XCTest是Xcode5中新引入的一個測試框架。XCTest是上一代測試框架OCUnit的更現代化的實現。XCTest提供了與Xcode更好的集成并且奠定了未來改進Xcode測試能力的基礎。XCTest的許多功能都類似與之前的OCUnit。
OCUnit和XCTest兼容性
自從Xcode2.1以來,OCUnit都是Xcode測試的基礎,所以很多現有的項目都是基于OCUnit測試。它們可以繼續使用,因為Xcode5為基于OCUnit和XCTest的兩種項目提供了等同的功能。
將基于 OCUnit 測試的現有項目從 Xcode 5 之前的版本添加進 Xcode 5中時,項目會兼容當前 iOS 和 OS X 版本,同樣的,iOS 7之前的版本以及 OS X v10.8 之前的版本也是如此。
基于 OCUnit 的測試可以在 iOS 6 和 iOS 7 上運行,所以針對iOS 和 OS X 舊版本的項目仍然能有效地選擇使用 OCUnit。當你需要把項目從 Xcode 5 回歸至早期版本的Xcode,并對應用程序進行維護時,這也不失為一個很好的選擇。
如果你的項目開發工作主要集中于 iOS 7 或更高版本,或在 OS X v10.8 或更高版本,或兩者兼而有之,把項目轉為使用 XCTest 將是一個正確的選擇。
注意:OCUnit在Xcode5.1中被標記為已過時。
從OCUnit過渡至XCTest
從 OCUnit 到 XCTest 的轉換是一個復雜的操作,包括更新源文件,其中包括測試類和修改項目配置設置。Xcode5 中有一個轉換工作流程的助手可幫你實現這些轉換,選擇 Edit > Refactor > Convert OCUnit? to XCTest。使用該工具來成功地將項目遷移使用 XCTest。
OCUnit 到 XCTest 轉換工具是基于target-by-target的。該工具會檢查你選擇的目標,并且在執行自動轉換后讓你知道它們是否可以用XCTest運行。
注意:建議你進行OCUnit到XCTest遷移時,將所有的target放到一個項目中。
把項目從OCUnit更新到XCTest:
工具tabbar上選擇編輯菜單。
在出現的菜單中選擇一個方案。
選擇Edit > Convert > To XCTest。
點擊下一步,進入到下一個工作表。
在出現的工作表中選擇測試target
一個特定的目標將建立XCTest轉換后,單擊其名稱。
單擊下一步按鈕。彈出一個FileMerge界面,你可以通過文件對比評估源碼的更改。
左邊是更新后的源文件,右邊是原始文件。你可以瀏覽所有可能的變化,并丟棄那些你覺得有問題的代碼。
如果你對所有的更改都滿意,就可以單擊保存按鈕。Xcode會把更改寫入文件。
手動的從OCUnit轉換到XCTest
如果一些項目中OCUnit不能自動的轉換到XCTest,你就需要手動的去轉換,步驟如下:
添加一個新的XCTest測試target在這個項目中。
在你的測試文件中增加測試類和測試方法。
編輯你的測試類引入#import XCTest/XCTest.h在你的方法里使用斷言。
使用這種方法可以確保項目設置是正確配置XCTest target。