作用一名合格的程序员,得能文能武。写的了代码,也要写的了单元测试。
单元测试步骤
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和不符合预期功能的方法,并调整不规范的代码设计。所以有条件的话还是要写一下单元测试。
而且后续也可以在单元测试用例量达到一定程度后,可以搭建自动化测试后台,进行定时执行单元测试,发放测试报告。