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










