作為一個有質量保障的應用程序,當然少不了單元測試;Swift開發的App也亦如此,此文將以一個簡單的實例來介紹Swift中的單元測試。
這里我們使用XCode模版自帶的XCTest框架,此框架包含了一個名為XCTestCase的類,所有的測試類都應該繼承自它;按照約定俗成所有的測試方法名都應以test開頭,並不能包含任何參數,只有這樣,這些測試方法才能在運行測試時被自動執行;在每個測試方法里面,我們可以通過調用XCTAssert*函數去斷言一個操作成功與否,如判等函數XCTAssertEqual、大於函數XCTAssertGreaterThan等;
話不多說,請先使用XCode創建一個iOS的Single View Application項目,並選擇Swift作為開發語言。
大家可以看到創建完成后的目錄結構應該是如此(這里我的項目名為TestDemo):
默認的模版會創建兩個文件夾,一個和項目名同名(這里是TestDemo),用於放置App的主程序;另外一個則是“項目名+Tests”(這里是TestDemoTests),用於放置測試代碼;
這里要注意的是,你要測試的類需要在Test中使用到,所以你在創建類文件時需要在Targets中同時選擇TestDemo和TestDemoTests;
如我在主應用程序中添加一個名為Url的類:
創建完成后,錄入代碼:
1 class Url { 2 let baseUrl: String 3 4 init(baseUrl: String) { 5 self.baseUrl = baseUrl 6 } 7 8 func getActualPathFrom(resourcePath: String, segments: [String:String]) -> String { 9 var actualPath = resourcePath 10 for (key,value) in segments { 11 var segmentPlaceHolder = "{\(key)}" 12 actualPath = actualPath.stringByReplacingOccurrencesOfString(segmentPlaceHolder, withString: value, options: .LiteralSearch, range: nil) 13 } 14 return baseUrl + actualPath 15 } 16 }
然后在TestDemoTests文件夾下創建UrlTests文件,此時由於該類只需要在測試中才能用到,所以只需要在Targets選擇TestDemoTests就可以了:
創建完成后,導入XCTest框架,並使該類繼承自XCTestCase,然后錄入測試代碼:
import XCTest class UrlTests: XCTestCase { var urlInstance = Url(baseUrl: "http://localhost:8080/api/") func testShouldGetCorrectPathWhenNoSegmentProvided() { let resourcePath = "customers" let result = urlInstance.getActualPathFrom(resourcePath, segments: [String:String]()) XCTAssertEqual(result, "http://localhost:8080/api/customers", "Can not get corrent path when no segments provided") } func testGetCorrectPathGivenOneSegment() { let resourcePath = "customer/{id}" let result = urlInstance.getActualPathFrom(resourcePath, segments: ["id": "10"]); XCTAssertEqual(result, "http://localhost:8080/api/customer/10", "Can not get corrent path when only one segment provided") } }
最后Command+U執行測試