iOS 單元測試

2023-05-10 06:01:05
作用一名合格的程式設計師,得能文能武。寫的了程式碼,也要寫的了單元測試。

單元測試步驟
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和不符合預期功能的方法,並調整不規範的程式碼設計。所以有條件的話還是要寫一下單元測試。
而且後續也可以在單元測試用例量達到一定程度後,可以搭建自動化測試後臺,進行定時執行單元測試,發放測試報告。