• iOS 单元测试


    作用一名合格的程序员,得能文能武。写的了代码,也要写的了单元测试。

    单元测试步骤
    1.File -> New -> Target, 选择单元测试Target,创建成功
    如果项目是老项目,那需要手动创建一下UnitTest Target,如果项目里已经有了就忽略。
    2.创建一个swift工具的测试类CalculatorTests
    然后就可以在里面写单元测试用例了。

     

    单元测试常用知识点
    环境变量的管理
    setUp()测试开始前,初始化要使用的环境变量
    tearDown()测试结束后,清理使用的环境变量
    控制测试用例的执行顺序
    1.可以通过test+101这种形式,顺序会根据test后面的数字,先小,后大的顺序进行执行
    2.使用测试用例组的形式,执行顺序会按照组中的顺序,由上到下进行执行
    静态变量allTests中放置排序后的测试用例
    1
    2
    3
    4
    static var allTests = [
        testCase(CalculatorTests.testAddition),
        testCase(CalculatorTests.testSubtraction)
    ]

    测试异步方法

    使用XCTestExpectation测试异步方法
    1
    2
    3
    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 方法会启动一个计时器,在代码块执行完成后停止计时器并记录测量的指标值。可以在测试报告中看到测量结果。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    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和不符合预期功能的方法,并调整不规范的代码设计。所以有条件的话还是要写一下单元测试。
    而且后续也可以在单元测试用例量达到一定程度后,可以搭建自动化测试后台,进行定时执行单元测试,发放测试报告。
     
     
  • 相关阅读:
    转载 | 自动驾驶数据服务市场占有率居首,这家公司是如何做到的?
    centos使用root用户登录
    设备自动化技术商务咨询
    大数据运维实战第二十四课 Yarn 资源调度 Fair Schedule 与 Capacity Scheduler 配置选型
    万界星空科技MES与WMS如何集成的?
    SystemVerilog Assertions应用指南 第一章(1.25章节 “throughout”运算符)
    [SCTF 2021]rceme
    Docker查看容器的初始启动命令参数的常见几种方式
    基于nodejs+vue 衣服穿搭推荐系统
    2022年全国大学生数学建模竞赛C题思路
  • 原文地址:https://www.cnblogs.com/zhou--fei/p/17386296.html