用Swift語言作App開發之單元測試

做爲一個有質量保障的應用程序,固然少不了單元測試;Swift開發的App也亦如此,此文將以一個簡單的實例來介紹Swift中的單元測試。api

這裏咱們使用XCode模版自帶的XCTest框架,此框架包含了一個名爲XCTestCase的類,全部的測試類都應該繼承自它;按照約定俗成全部的測試方法名都應以test開頭,並不能包含任何參數,只有這樣,這些測試方法才能在運行測試時被自動執行;在每一個測試方法裏面,咱們能夠經過調用XCTAssert*函數去斷言一個操做成功與否,如判等函數XCTAssertEqual、大於函數XCTAssertGreaterThan等;框架

話很少說,請先使用XCode建立一個iOS的Single View Application項目,並選擇Swift做爲開發語言。ide

你們能夠看到建立完成後的目錄結構應該是如此(這裏個人項目名爲TestDemo):函數

默認的模版會建立兩個文件夾,一個和項目名同名(這裏是TestDemo),用於放置App的主程序;另一個則是「項目名+Tests」(這裏是TestDemoTests),用於放置測試代碼;單元測試

這裏要注意的是,你要測試的類須要在Test中使用到,因此你在建立類文件時須要在Targets中同時選擇TestDemo和TestDemoTests;測試

如我在主應用程序中添加一個名爲Url的類:url

建立完成後,錄入代碼:spa

複製代碼
 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就能夠了:code

建立完成後,導入XCTest框架,並使該類繼承自XCTestCase,而後錄入測試代碼:blog

複製代碼
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")
    }
}
複製代碼
相關文章
相關標籤/搜索