測試基礎(chǔ)
測試是你編寫的代碼力穗,用于執(zhí)行你的應(yīng)用程序和代碼庫里面的代碼气嫁,并生成通過或失敗的結(jié)果,根據(jù)一組預(yù)期進行衡量超全。
測試可以在執(zhí)行一些操作之后檢查對象的實例變量的狀態(tài),驗證代碼在遇到邊界條件時拋出特殊異常蛾坯,等等疏遏。對于性能測量測試,參考標準可以是期望一組例程運行到完成的最大時間量倘零。
定義測試范圍
所有軟件使用組合構(gòu)建; 也就是說戳寸,較小的組件被一起布置以形成具有更大功能的更大,更高級別的組件袖瞻,直到滿足項目的目標和要求拆吆。良好的測試實踐是具有涵蓋該組合物的所有水平的功能的測試枣耀。XCTest允許您為任何級別的組件編寫測試。
它是由你來定義什么構(gòu)成一個組件的測試 - 它可以是一個方法在一個類或一組方法捞奕,完成一個基本的目的缝彬。例如哺眯,它可以是一個算術(shù)運算,如在快速入門一章中用作計算器應(yīng)用程序的示例一疯。它可以是處理a的內(nèi)容UITableView和您在代碼的數(shù)據(jù)結(jié)構(gòu)中維護的名稱列表之間的交互的不同方法夺姑。這些方法和操作中的每一個意味著應(yīng)用程序功能的一個組件和一個檢查它的測試。用于測試的組件的行為應(yīng)該是完全確定的; 測試通過或失敗眉睹。
您可以將應(yīng)用程序的行為劃分為組件越多,您可以更有效地測試代碼的行為是否滿足您的項目增長和更改的所有細節(jié)中的參考標準慕蔚。對于具有許多組件的大型項目斋配,您需要運行大量測試來徹底測試項目。測試應(yīng)該設(shè)計為盡可能快地運行坏瞄,但是一些測試必然很大并且執(zhí)行得更慢甩卓。小型逾柿,快速運行的測試可以經(jīng)常運行,并且當有故障時使用鹿寻,以幫助診斷和解決問題容易毡熏。
為項目組件設(shè)計的測試是測試驅(qū)動開發(fā)的基礎(chǔ),這是一種寫代碼的風(fēng)格狱窘,在寫代碼之前編寫測試邏輯财搁。這種開發(fā)方法允許您在實現(xiàn)代碼之前為代碼編寫需求和邊緣情況。在編寫測試后搭儒,您將開發(fā)您的算法提茁,目的是通過測試。在您的代碼通過測試后铃岔,您有一個基礎(chǔ)峭火,您可以對您的代碼進行改進,有信心在下次運行測試時識別對預(yù)期行為的任何更改(這將導(dǎo)致產(chǎn)品中的錯誤)纺且。
即使您不使用測試驅(qū)動開發(fā)隆檀,測試也可以幫助您減少代碼中的錯誤引入,同時修改它以增強功能和功能恐仑。您可以在工作應(yīng)用程式中加入測試裳仆,確保未來的變更不會以您計劃的方式修改應(yīng)用程式現(xiàn)有的行為。當您修復(fù)錯誤時纯丸,您添加測試静袖,確認錯誤是固定的。測試應(yīng)該行使你的代碼坠陈,尋找預(yù)期的成功和預(yù)期的失敗捐康,以涵蓋所有的邊界條件解总。
注意:將測試添加到非設(shè)計時考慮測試的項目可能需要重新設(shè)計或重構(gòu)代碼的一部分,以便于測試刻盐。
附錄A:編寫可測試代碼包含編寫可測試代碼的
簡單指南乌昔,您可能會發(fā)現(xiàn)它們有用。
組件可以包含應(yīng)用程序各個部分之間的互動。由于某些類型的測試需要更長時間才能運行溺蕉,因此您可能只希望定期運行它們或僅在服務(wù)器上運行它們。正如你將在下面的章節(jié)中看到的疯特,你可以組織你的測試漓雅,并以許多不同的方式運行它們來滿足不同的需求。
性能測試
組件的測試本質(zhì)上可以是功能性的或測量性能组题。XCTest提供API來測量基于時間的性能抱冷,使您能夠以類似于功能合規(guī)性和回歸的方式跟蹤性能改進和回歸。
為了在測量性能時提供成功或失敗結(jié)果赵讯,測試必須具有要評估的基線边翼∶簦基線是測試方法的十次運行中的平均時間性能與每次運行的標準偏差的測量的組合。低于時間基線或從運行到運行變化太大的測試報告為故障斤寇。
注意 第一次運行性能測量測試時拥褂,XCTest總是報告失敗,因為基線未知莫秆。一旦您接受某個測量作為基線悔详,XCTest將評估并報告成功或失敗,并為您提供詳細查看測試結(jié)果的方法茄螃。
用戶界面測試
到目前為止討論的功能和性能測試通常被稱為單元測試,其中“單元”是您已經(jīng)根據(jù)粒度和級別決定的功能的組件用狱。單元測試主要涉及形成好的組件夏伊,其行為與預(yù)期的一樣,并且如預(yù)期地與其他組件交互咏连。從設(shè)計的角度來看鲁森,單元測試從內(nèi)部接近您的開發(fā)項目刀森,檢查組件是否滿足您的意圖。
用戶通過用戶界面與這些內(nèi)部代碼交互埠偿。用戶界面交互通常是粗糙的榜晦,更高級別的行為,采取外部活動和集成幾個組件(子系統(tǒng))的操作來調(diào)用您的應(yīng)用程序的功能抖剿。很難編寫單元測試來實現(xiàn)用戶通過用戶界面體驗到的交互识窿,而沒有設(shè)計用于從應(yīng)用程序上下文外部操作UI的特殊設(shè)施喻频。用這些特殊設(shè)施寫的測試稱為“UI測試”。
UI測試方法從外部表面測試應(yīng)用程序锻煌,用戶體驗它姻蚓。它們使您能夠編寫測試狰挡,將模擬事件發(fā)送到系統(tǒng)提供的和自定義UI對象释涛,捕獲這些對象的響應(yīng)跺讯,然后測試該響應(yīng)的正確性或性能刀脏,就像使用內(nèi)部導(dǎo)向的單元測試一樣超凳。
應(yīng)用和庫測試
Xcode提供兩種類型的單元測試上下文:應(yīng)用測試和庫測試轮傍。
應(yīng)用測試。應(yīng)用程序測試檢查應(yīng)用程序中代碼的正確行為杭跪,例如計算器應(yīng)用程序的算術(shù)運算示例驰吓。
庫測試。庫測試檢查動態(tài)庫和框架中的代碼的正確行為姑廉,而與在應(yīng)用程序的運行時中的使用無關(guān)翁涤。使用庫測試葵礼,您構(gòu)建單元測試,運用庫的組件扔涧。
使用這些測試上下文來測試項目有助于在代碼隨著時間演變時保持預(yù)期和預(yù)期的行為赁严。
XCTest - Xcode測試框架
XCTest是為您提供的測試框架疼约,從Xcode 5開始。
關(guān)于版本和兼容性:
在Xcode 5中劝枣,XCTest與在OS X v10.8和OS X v10.9上運行以及與iOS 7和更高版本兼容汤踏。
在Xcode 6中,XCTest與在OS X v10.9和OS X v10.10上運行舔腾,以及與iOS 6和更高版本兼容溪胶。
在Xcode 7中,XCTest與在OS X v10.10和OS X v10.11上運行以及與iOS 6和更高版本兼容稳诚。
支持在OS X v10.11和iOS 9上運行UI測試哗脖,無論是在Simulator和設(shè)備上。
有關(guān)更多詳細的版本兼容性信息扳还,請參閱Xcode發(fā)行說明才避。
Xcode XCTest.framework融入您的項目。此框架提供了API氨距,讓您設(shè)計測試并在代碼上運行它們桑逝。有關(guān)XCTest框架的詳細信息俏让,請參閱XCTest框架參考楞遏。
注意: 有關(guān)將OCUnit遷移到XCTest的信息,請參閱附錄B:從OCUnit轉(zhuǎn)換到XCTest首昔。
測試時從哪里開始
當您開始創(chuàng)建測試時寡喝,請記住以下想法:
當創(chuàng)建單元測試時,專注于測試代碼的最基本的基礎(chǔ)沙廉,Model類和方法拘荡,它們與Controller交互。
您的應(yīng)用程序的高級框圖很可能有Model撬陵,View和Controller類 - 這是一個熟悉的設(shè)計模式珊皿,任何人誰一直在使用Cocoa和Cocoa Touch。當你編寫測試來覆蓋所有的Model類時巨税,你將有確定的知道你的應(yīng)用程序的基礎(chǔ)是經(jīng)過良好的測試蟋定,然后你的方式來編寫Controller類的測試 - 開始接觸其他更復(fù)雜部分應(yīng)用程序,例如草添,連接到網(wǎng)絡(luò)與連接在Web服務(wù)后面的數(shù)據(jù)庫驶兜。
作為一個替代的起點,如果你正在創(chuàng)作一個框架或庫远寸,你可能想從你的API的表面開始抄淑。從那里,你可以工作你的方式在內(nèi)部類驰后。
在創(chuàng)建UI測試時肆资,首先考慮最常見的工作流程。想想當用戶開始使用應(yīng)用程序和在該過程中立即執(zhí)行什么UI時灶芝,用戶做什么郑原。使用UI記錄特征是將用戶動作序列捕獲到UI測試方法中的好方法唉韭,該UI測試方法可以被擴展以實現(xiàn)正確性和/或性能的測試。
這種類型的UI測試傾向于以相對粗粒度的焦點開始犯犁,并且可能跨越幾個子系統(tǒng); 它們可以返回很多可能很難分析的信息属愤。當您使用UI測試套件時,您可以細化測試粒度和聚焦UI測試酸役,以更清晰地反映特定子系統(tǒng)的行為住诸。