Python实战社群
Java实战社群
长按识别下方二维码,按需求添加
扫码关注添加客服
进Python社群▲
扫码关注添加客服
进Java社群▲
作者:NathanSun, iOS开发者,目前就职于字节跳动音乐团队
Sessions: https://developer.apple.com/videos/play/wwdc2020/10687/
当我们遇到测试失败问题时候,需要问自己四个问题,也就是经典的 3W1H 问题 (What, How, Why, Where)。Xcode 12 引入了新的 API 和一些 UI 改进来让我们回答这些问题更加容易。这个 session 主要分为四个部分:
测试中的Swift 错误
更加丰富的失败信息
调用栈
高级工作流
在 Xcode 12 中,如果看到灰色提示,代表错误并不是发生在当前这一行,而是需要继续下钻直到看到红色错误标记。如下图 try runTest(for: view)
是灰色,所以我们知道错误并不在此,需要下钻寻找真正的错误行。
具体怎么下钻呢?我们可以在左侧导航区可以看到详细的调用栈,和代码调试调用栈一样,这个调用顺序是由下往上,一般点击第一行,找到代码被标记为红色的地方,就是真正发生错误的代码行。
是不是很酷!这样可以帮助我们快速定位到具体哪里出错,大大节约了时间。
另一个查看调用栈的地方就是测试报告这里,点击导航区这一排最右边的按钮,可以看到测试报告,在右侧可以看到调用栈。
以前,在方法内抛出异常是没有办法知道是哪一行代码出错的,所以工程师往往会手动捕获异常错误再调用 XCTFail 变通实现。如下面两张图所示。
<<< 左右滑动见更多 >>>
随着 Swift 运行时的改进,在 iOS 和 tvOS 13.4,macOS 10.15.4 里面开始支持抛出异常时就能自动定位到错误发生的文件和代码行。除此之外,还增加了两个新的方法 setupWithError() throw
以及 tearDownWithError()
。setupWithError()
是在 setup()
之前调用,tearDownWithError()
是在 tearDown()
之后调用。可以新旧方法同时使用,但是更建议用这两个新方法直接代替旧方法,保留旧方法最主要的目的是让历史代码能正常运行。
Xcode 12 之前测试失败数据主要包含以下四个部分:
失败信息
文件路径
失败代码的代码行号
"Expected" 标记(指示测试失败否由未处理异常导致)
这些值是通过下面的方法传递给 Xcode。
但是在Xcode 12 新添加了一个新的类 XCTIssue,除了封装了以上数据之外,它还增加了以下数据:
问题类型枚举
详细描述
关联错误
附件(XCTAttachment),可以包含任意数据
相对应的,XCTestCase 也增加了一个新的 API 来记录测试失败错误,也就是record(_ issue: XCTIssue)
, 请使用这个最新的 API 来代替 recordFailure
。所有的 XCTAsserts 语句最后都会调用这个 API,你也可以手动调用甚至重载这个 API。
假如测试代码调用路径比较复杂,如下图所示,testThingA()
和testThingB()
同时调用assertProperties(for thing: Thing)
,而在assertProperties
里面出错了,如果把错误标记在assertProperties
处,那就不知道是哪条路径调用过来的,如果是标记在testThingA()
也不行,因为assertProperties
包含多个 XCAssertNotNil
语句,无法定位到底是哪一处,因此最好的办法就是现实完整的调用栈,Xcode 12 做到了这一点,调用栈用灰色表示,最终发生错误的地方用红色标记。
你可以直接创建 XCTIssue,然后手动记录问题。在下面这个例子里面,会先验证数据,然后验证失败则把数据加到 XCTAttachment,最后进行记录。
你也可以重写 record 方法,比如你可以在记录问题之前,加入数据附件;或者你想跳过某些问题,你也可以去掉super.record(issue)
这一句,这样错误就不会记录下来。
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐:
看电影前一定要检查一下域名是不是HTTPS的
有个大神级女朋友是什么体验
世界上五个最不务正业的科学家!
魂斗罗只有128KB为何可以实现那么长的剧情
在看点这里好文分享给更多人↓↓