但是首先,要进行一次简短的历史考察:苹果WWDC(世界开发者大会),简称为dub-dub,是苹果自1980年代末以来一直在加利福尼亚举行的会议。今年,该会议首次在网上举行。而且,如果以前的彩票是通过抽奖的方式抽出的,而那些未收到所需电子邮件的人必须对https://developer.apple.com/videos/网站上的视频感到满意,由于明显的原因,今年没有其他选择:每个人都观看了视频...
那么,从那里的测试中您会看到什么?
我将立即保留一个意见,那就是在WWDC 2020上没有像往年一样专门针对Apple生态系统进行测试的大型常规会议(Xcode 2019中的测试和2018中的新功能,2017)。2020年的测试新颖性被涂抹为六个小节。走!
XCTSkip为您的测试
Xcode 11.4添加了新的API以控制基于条件的测试的启动-XCTSkip。
通常在测试中,尤其是集成测试中,存在不容易混淆的条件或要求。例如,一个应用程序具有某些不适用于iPhone的iPad的特定功能。或特定版本操作系统的某些功能。
以前,当对这种情况进行测试(检查iPhone上仅iPad的功能)时,可以选择:
- 结束测试用例;
- 将测试标记为通过并继续;
- 测试失败。
现在,我们出现一个错误,当前测试停止运行,并标记为已跳过。
因此,现在XCTest具有通过测试的三种状态,而不是两种:这里和此处有
更多详细信息。
UI测试中的中断和警报处理
中断和警报处理以前是在XCTest中进行的,但是在会话中,它的操作机制得到了更详细的揭示。我发现它在Xcode 11.4,iOS / tvOS 13.4和macOS 10.15.4中添加了有趣的新功能,即重置权限(又称受保护的资源)。
底线是这样的:例如,在较早的测试1中,您授予应用程序对摄像机或联系人的访问权限,然后在较早的测试2中,则使访问不那么容易。为此,您将必须重新安装该应用程序。
现在,使用API重置受保护资源的授权,您可以选择先前授予的访问权限:
Class XCUIApplication {
open func resetAuthorizationStatus(for: XCUIProtectedResource)
}
重置权限使应用程序的行为就像以前从未要求用户访问受保护的资源一样。
这样一来,您就可以发布和收集联系人,日历,照片,麦克风,相机和地理位置的权限。在iOS上,您还可以将对Bluetooth和Keyboard网络访问的访问权限重置,并从Xcode 12 / iOS 14开始,对Health数据进行重置。在Mac OS上,您可以重置对“桌面”和“下载”目录的访问。
以下是如何重置应用对照片的访问权限的示例:
// Example
func testAddingPhotosFirstTime() throws {
let app = XCUIApplication()
app.resetAuthorizationStatus(for: .photos)
app.launch()
// Test code...
}
重要的是要记住,经常(但并非总是)重置权限会杀死应用程序。这里,这里和这里有
更多细节。
使用XCTest消除动画滞后
动画滞后或停顿是帧显示的时间晚于预期的行为。
讲座描述了如何通过使用Performance XCTests进行测量和测试来防止出现滞后现象。
它还提供了最佳实践,并确定了哪些延迟是可以容忍的,哪些延迟值得寻找:
描述了为什么严重的延迟值得我们认真研究和解决。测试动画本身的主题非常广泛,值得单独撰写一篇文章,因此我们将仅限于介绍部分和源链接。
分类和诊断失败的诊断
通常,修复失败的测试是一种痛苦,需要花费大量时间和资源。
Xcode 12将具有一个新的API,该API应该可以更轻松地修复失败的测试。该API应该有助于快速回答以下问题:什么,如何,为什么以及最重要的-它落在哪里?
如果较早,在测试失败后,您必须在“
问题”导航器或“报告”导航器中查找崩溃站点,然后使用Xcode 12,搜索过程变得更加容易:现在,崩溃站点会在测试本身中突出显示。
如果该行以后引用其他行,则会出现带有灰色突出显示的错误:
如果错误直接在此行中出现,则显示为红色:
一个方便的新功能-不在单独的窗口中而是在报表导航器中直接打开代码编辑器:
另外,在Xcode 12中添加了一个新的XCTIssue对象,该对象除了封装XCTest先前自身收集的错误数据(消息,路径,行号和“ Expected”标志)外,现在还添加了:
- 不同的类型;
- 详细说明;
- 相关错误;
- 附件。
这里和这里有 更多细节。
编写测试以使其失败
测试人员的目标是编写测试,以使其通过绿色测试,这意味着产品可以交付给最终用户。但是,编写测试以使其失败也很有必要,因为失败的测试很可能是发现的错误。因此,我们需要编写测试时要考虑到这样的事实,即如果测试失败,我们将有足够的信息进行调查。
因此建议:
在断言中使用人类可读的消息:
确保使用适合您情况的断言类型:
取消包装可选项,使您的测试崩溃而不是抛出错误。Swift提供了几种方法来执行此操作,但是测试倾向于使用XCTUnwrap,这是对保护让结构的简化。
使用waitForExistence()代替sleep()进行异步等待。
使用XCTContext.runActivity()来提高测试执行日志的可读性:
并且,如果要添加其他日志记录,则可以添加附件,附加屏幕快照或调试器输出(如此处)。如果您的测试在CI / CD中运行,则此功能特别有用。
更多细节在这里。
更快获得测试运行结果
当星期一早上您发现星期五晚上开始的长期工作一直没有结束时,真是太可惜了,它停留在中间甚至一开始。并且您必须在一周的简短汇报中开始工作:为什么会发生这种情况?将来如何避免这种情况?
Xcode 12引入了防冻工具。这是执行时间津贴计划测试的新选项。
启用后,Xcode设置每个测试运行方式的时间限制。
如果超出限制,Xcode将执行以下操作:
- 收集报告(spindump);
- 杀死挂起的测试;
- 重新启动测试运行程序,以便套件的其余部分可以运行。
报告(spindump)显示哪个线程,哪个函数花费的时间最多。这将使您甚至在早晨咖啡/茶冷却之前就可以用眼睛看到测试的瓶颈。
默认情况下,每个测试分配10分钟,如果测试完成得更快,则下一次测试的计时器将重置为零。如果测试套件中的每个测试需要更多/更少的时间,则可以在测试计划设置中更改默认值。
您还可以使用xcodebuild命令选项执行此操作:
xcodebuild option
-default-test-execution-time-allowance <seconds>
同样,您可以设置最大测试执行时间:
xcodebuild option
-maximun-test-execution-time-allowance <seconds>
即使您需要设置特定测试或测试类的执行时间,也可以使用executionTimeAllowance API来实现:
Class XCTestCase: XCTest {
var executionTimeAllowance: TimeInterval //
}
对特定测试的执行进行微调可以节省您的时间,但这并不是加速长测试套件通过的全部方法。
Xcode 12允许您同时在多个设备上运行测试。此功能称为并行分布式测试。在多个设备上运行测试的好处显而易见-节省了大量时间。
但是,不幸的是,还存在一些缺陷:并行运行测试的顺序是不确定的,不能保证在5号测试之后将在1号设备上执行6号测试,在计划使用Parallel启动测试时必须考虑这一事实。分布式测试。
总的来说,并行运行测试的想法并不新鲜。在Xcode 12之前有这样的机会,但是在Xcode 12中才有可能在真实设备上运行测试(到目前为止仅使用xcodebuild)。
运行并行分布式测试的命令如下:
xcodebuild test
-project MyProject.xcodeproj
-scheme MyProject
-parallel-testing-enabled YES
-parallelize-test-among-desinations
-destination 'platform=iOS,name=iPhone 11'
-destination 'platform=iOS,name=iPad pro'
更多细节在这里。
总结了WWDC 2020的新测试功能。感谢您阅读到底。
希望本文对您有所帮助。测试愉快!