Swift - XCTest 定位问题
XCTAssertEqual 判等
我们知道,在单元测试里,可以通过 XCTAssertEqual
判断 expression1
和 expression2
是否相等。如下
实现方法
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()
里
类似于 XCTAssert
, XCTAssertEqual
,XCTAssertNil
等等,都默认传了 file 和 line 两个参数。如果想在实现方法里,看到具体报错信息,需要在帮助方法里定义默认参数file 和 line,并把他们传到 XCxxxx
里,协助定位问题
总结
当在测试方法外部(例如,在辅助方法中)调用 XCTAssert... 函数时,将 file 和 line 传递给 XCTAssert... 函数非常重要。 这样,Xcode 可以准确地突出显示哪个测试失败以及失败的位置。