文章引用自:swifter.tips
在軟件開發(fā)中恼琼,測(cè)試的重要性不言而喻叉讥。Xcode 中集成了 XCTest 作為測(cè)試框架甲棍,Swift 代碼的測(cè)試默認(rèn)也使用這個(gè)框架進(jìn)行任斋。
關(guān)于 XCTest 的使用方法行嗤,比如像setUp镜豹,tearDown以及testxxx等在 Swift 下和以前也并沒有什么不同侵蒙,作為一本介紹 tip 的書籍赦肋,我不打算在此重復(fù)這些纯赎。如果對(duì)測(cè)試的理論基礎(chǔ)和實(shí)踐方法感興趣的話谦疾,不妨看看 Objective-C 中國上相關(guān)的話題文章。
XCTest 中測(cè)試和待測(cè)試的 app 是分別獨(dú)立存在于兩個(gè)不同的 target 里的犬金。這在 Swift 2.0 之前使測(cè)試 Swift 代碼時(shí)面臨了由訪問權(quán)限帶來的巨大困境念恍。在 Objective-C 時(shí)代,測(cè)試的 target 通過依賴應(yīng)用 target 并導(dǎo)入頭文件來獲取 app 的 API 并對(duì)其進(jìn)行測(cè)試晚顷。而在 Swift 中因?yàn)?module 模塊的管理方法和訪問控制權(quán)限的設(shè)計(jì)峰伙,使得這個(gè)過程出現(xiàn)了問題:一般對(duì)于 app,我們都不會(huì)將方法標(biāo)記為public该默,而會(huì)遵循訪問權(quán)限最小的原則瞳氓,使用默認(rèn)的internal或者是private。對(duì)于有些internal的方法权均,其實(shí)我們是需要去進(jìn)行測(cè)試的顿膨。但是由于測(cè)試的 target 和 app 的 target 是不同的,因此在測(cè)試中導(dǎo)入 app 的 module 后我們是訪問不到那些默認(rèn)internal的待測(cè)試方法的叽赊,這就使得測(cè)試變得不可能了恋沃。
如果我們正在開發(fā)的是一個(gè)類庫的話,為了別人能導(dǎo)入和使用我們的庫必指,我們需要把對(duì)外的方法和成員都標(biāo)記成public囊咏,這樣我們就能直接在測(cè)試 target 中導(dǎo)入類庫 target 并訪問到待測(cè)試 API 了:
// 位于框架 target 的業(yè)務(wù)代碼publicfuncmethodToTest(){}// 測(cè)試importMyFramework//...functestMethodToTest(){// 配置測(cè)試someObj.methodToTest()// 斷言結(jié)果}
對(duì)于類庫來說,這種做法是沒什么問題的 -- 那些被標(biāo)記為public的東西恰好就是需要被測(cè)試的代碼接口塔橡。但是對(duì)于 app 開發(fā)時(shí)的測(cè)試來說梅割,我們需要盡可能地控制訪問權(quán)限:我們沒有理由為一些理論上不存在外部調(diào)用可能的代碼賦予public這樣高級(jí)的權(quán)限,這違背了最小權(quán)限的設(shè)計(jì)原則葛家。對(duì) app 的測(cè)試在 Swift 1.x 的時(shí)代中一直是一個(gè)很麻煩的問題户辞。而在 Swift 2.0 中, Apple 為 app 的測(cè)試開了“后門”●耍現(xiàn)在我們可以通過在測(cè)試代碼中導(dǎo)入 app 的 target 時(shí)底燎,在之前追加@testable刃榨,就可以訪問到 app target 中internal的內(nèi)容了。
// 位于 app target 的業(yè)務(wù)代碼funcmethodToTest(){}// 測(cè)試@testableimportMyApp//...functestMethodToTest(){// 配置測(cè)試someObj.methodToTest()// 斷言結(jié)果}