作用一名合格的程式設計師,得能文能武。寫的了程式碼,也要寫的了單元測試。
單元測試步驟
1.File -> New -> Target, 選擇單元測試Target,建立成功
如果專案是老專案,那需要手動建立一下UnitTest Target,如果專案裡已經有了就忽略。
2.建立一個swift工具的測試類CalculatorTests
然後就可以在裡面寫單元測試用例了。
單元測試常用知識點
環境變數的管理
setUp()測試開始前,初始化要使用的環境變數
tearDown()測試結束後,清理使用的環境變數
控制測試用例的執行順序
1.可以透過test+101這種形式,順序會根據test後面的數字,先小,後大的順序進行執行
2.使用測試用例組的形式,執行順序會按照組中的順序,由上到下進行執行
靜態變數allTests中放置排序後的測試用例
static var allTests = [ testCase(CalculatorTests.testAddition), testCase(CalculatorTests.testSubtraction) ]
測試非同步方法
使用XCTestExpectation測試非同步方法
let expectation = XCTestExpectation(description: "HTTP request") expectation.fulfill() wait(for: [expectation], timeout: 5.0)
方法的效能測試
使用tmeasure(metrics: [XCTMetric], block: () -> Void)做效能測試
func measure(metrics: [XCTMetric], block: () -> Void)是 XCTest 中的一個方法,用於執行一段程式碼塊並測量其執行時間。
引數 metrics 是一個 XCTMetric 型別的陣列,用於指定要測量的指標。當前支援的指標包括:
wallClockTime:程式碼塊執行的實際時間;
userTime:程式碼塊執行期間 CPU 時間花費的量;
runTime:程式碼塊執行期間系統執行時間的量。
執行 measure 方法會啟動一個計時器,在程式碼塊執行完成後停止計時器並記錄測量的指標值。可以在測試報告中看到測量結果。
import XCTest @testable import ARDemo //建立CalculatorTests類,繼承自XCTestCase class CalculatorTests: XCTestCase { var calculator: Calculator! //測試開始前,初始化要使用的環境變數 override func setUp() { super.setUp() calculator = Calculator() } //測試結束後,清理使用的環境變數 override func tearDown() { super.tearDown() calculator = nil } //要控制測試用例的執行順序 //1.可以透過test+101這種形式,順序會根據test後面的數字,先小,後大的順序進行執行 func test101Addition() { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "Addition of 2 and 3 should be 5") } func test102Addition() { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "Addition of 2 and 3 should be 5") } func test103Addition() { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "Addition of 2 and 3 should be 5") } //2.使用測試用例組的形式,執行順序會按照組中的順序,由上到下進行執行 func testAddition() { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "Addition result is incorrect") } func testSubtraction() { let result = calculator.subtract(5, 2) XCTAssertEqual(result, 3, "Subtraction result is incorrect") } //靜態變數allTests中放置排序後的測試用例 static var allTests = [ testCase(CalculatorTests.testAddition), testCase(CalculatorTests.testSubtraction) ] //測試非同步方法 func testAsyncHTTPRequest() { let expectation = XCTestExpectation(description: "HTTP request") // 呼叫非同步HTTP請求方法 asyncHTTPRequest { response in // 處理回撥結果 XCTAssertTrue(response.success) expectation.fulfill() } // 等待非同步操作完成 wait(for: [expectation], timeout: 5.0) } //測試功能的執行效能 func testPerformance() { measure([.wallClockTime, .userTime]) { // 執行需要測試效能的程式碼塊 } } } class Calculator { func add(_ a: Int, _ b: Int) -> Int { return a + b } func subtract(_ a: Int, _ b: Int) -> Int { return a - b } }
1.對自己的程式碼充滿信心
2.直面測試的勇氣
3.節省迴歸測試的時間
另外,在寫單元測試用例的過程中,也會自己發現某些隱藏的Bug和不符合預期功能的方法,並調整不規範的程式碼設計。所以有條件的話還是要寫一下單元測試。
而且後續也可以在單元測試用例量達到一定程度後,可以搭建自動化測試後臺,進行定時執行單元測試,發放測試報告。