Swift - XCTest 定位问题

2024-05-18  本文已影响0人  nicaho

XCTAssertEqual 判等

我们知道,在单元测试里,可以通过 XCTAssertEqual 判断 expression1expression2 是否相等。如下

实现方法

func test_sum() {
    let a = 1 + 2
        
    XCTAssertEqual(4, a)
}

报错信息

报错信息1.jpg

很显然,结果是显示错误信息 XCTAssertEqual failed: ("4") is not equal to ("3") 并指向 XCTAssertEqual 的位置

思考

如果,我们把 XCTAssertEqual 放到帮助方法里,还会显示错误信息吗?

XCTAssertEqual 放到帮助方法里

实现方法

func test_sum() {
    let a = 1 + 2
    let b = 1 + 3
    
    checkSum4(a)
    checkSum4(b)
}
    
func checkSum4(_ value: Int) {
    XCTAssertEqual(4, value)
}

报错信息

报错信息2.jpg

我们只能在帮助方法里,看到报错,实际上不知道具体哪一行代码报错

思考

我们可以看一下 XCTAssertEqual 的定义

public func XCTAssertEqual<T>(_ expression1: @autoclosure () throws -> T, _ expression2: @autoclosure () throws -> T, _ message: @autoclosure () -> String = "", file: StaticString = #filePath, line: UInt = #line) where T : Equatable
XCTAssertEqual 传了一个默认的 file 以及 line 这2个参数,这个能解释为什么在
XCTAssertEqual 判等(①方法) 的 报错信息 是在 test_sum
XCTAssertEqual 放到帮助方法里(②方法) 的 报错信息 是在 checkSum4

接下来,我们如何解决这个问题

XCTAssertEqual 帮助方法里 增加默认的参数 file 和 line

实现方法

func test_sum() {
    let a = 1 + 2
    let b = 1 + 3
    
    checkSum4(a)
    checkSum4(b)
}
    
func checkSum4(_ value: Int, file: StaticString = #filePath, line: UInt = #line) {
    XCTAssertEqual(4, value, file: file, line: line)
}

报错信息

报错信息3.jpg

此时,可以看到,报错信息在 test_sum()

类似于 XCTAssertXCTAssertEqualXCTAssertNil 等等,都默认传了 file 和 line 两个参数。如果想在实现方法里,看到具体报错信息,需要在帮助方法里定义默认参数file 和 line,并把他们传到 XCxxxx 里,协助定位问题

总结

当在测试方法外部(例如,在辅助方法中)调用 XCTAssert... 函数时,将 file 和 line 传递给 XCTAssert... 函数非常重要。 这样,Xcode 可以准确地突出显示哪个测试失败以及失败的位置。

上一篇下一篇

猜你喜欢

热点阅读