1. 什么是自动UITest?

当谈到测试时,我们通常会考虑单元测试。但是,在应用程序世界中还有另一种功能极其强大且有用的测试:UITests。
这些测试的目的是验证您的UI行为是否符合预期:按钮处于正确的状态,字符串的样式正确,导航在我们进行编码时发生。
测试的主体模拟了与UI交互的use r,从而导致应用程序随着时间的推移而发展,并允许我们断言某些条件,我们希望在应用程序执行过程中满足要求。

2. 为什么要执行自动UITest?

作为所有测试活动,编写适当的UITests需要时间。但是,这段时间将来将为我们节省很多麻烦,从长远来看,还将节省比其所消耗的时间更多的时间。

编写自动化的UITests有很多好处,特别是在应用变得非常大且可能难以维护的情况下。其中一些好处:

  • 无需测试旧功能。在敏捷的环境中,我们每两周创建一次新功能。但是,开发人员有些偏执:他们会要求QA朋友每次都测试整个应用程序,以避免性能下降。可以使用自动化的UITest自动浏览最常见的用例,从而保持开发人员和质量检查人员的头脑清醒。
  • 编码用例知识。UITests允许我们查看事件序列发生时应用程序的行为。这对于跟踪常见用例并验证每次我们修改应用程序时它们不会崩溃都非常有用。
  • 测试UI性能。假设您的应用必须执行一些繁重的UI操作,例如滚动浏览一大堆图像,我们可以使用UITests来衡量执行这些操作所需的时间以及是否存在回归。
  • 检查本地化。假设您的应用程序已本地化,我们可以自动检查是否用省略号剪切了某些字符串。

这些只是自动UITest的一些优点。可能会有更多,但我认为这些是最突出的。当然也有缺点:

  • 他们比单元测试花费更多的时间。
  • 鉴于UI可以经常更改,因此它们往往更加不稳定。您的UITests有可能在6个月内过时。

尽管存在这些缺点,但我认为这些测试确实有帮助,特别是对于某些部分不太可能更改的大型应用程序。如果您必须由一个只能同时关注一个应用程序的小型团队管理多个应用程序,它们也很有用。

3. 如何编写UITests?

搭建环境
UITests已集成到Xcode中,我们的IDE为我们完成了大部分工作。第一步是为我们的应用添加一个新的UITest目标。

  1. 点击 File > New > Target
  2. 选择 UI Testing Bundle
  3. 单击Next并在表单中填写名称
  4. 点击Finish。

Xcode将使用第一个空UITest文件创建新目标。该文件具有以下结构(请注意Xcode提供了多少注释,以帮助我们进行首次尝试)。

import XCTestclass UITestAppUITests: XCTestCase {override func setUpWithError() throws {// Put setup code here. This method is called before the invocation of each test method in the class.// In UI tests it is usually best to stop immediately when a failure occurs.continueAfterFailure = false// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.}override func tearDownWithError() throws {// Put teardown code here. This method is called after the invocation of each test method in the class.}func testExample() throws {// UI tests must launch the application that they test.let app = XCUIApplication()app.launch()// Use recording to get started writing UI tests.// Use XCTAssert and related functions to verify your tests produce the correct results.}func testLaunchPerformance() throws {if #available(macOS 10.15, iOS 13.0, tvOS 13.0, *) {// This measures how long it takes to launch your application.measure(metrics: [XCTOSSignpostMetric.applicationLaunch]) {XCUIApplication().launch()}}}
}

让我们专注于该testExample()方法。一切都由一个XCUIApplication()对象管理。该对象是我们应用程序的抽象。我们可以launch()并且terminate()它可以让我们查询UI中的所有元素。

4. 记录我们的第一个测试

是的,你没看错!我们不会立即编写测试:Xcode提供了一个非常不错且有用的工具,允许我们与应用程序进行交互,而Xcode会将我们的交互转换为代码。多么酷啊?!
要开始此操作,我们只需要将光标置于第testExample()24行下方的empty方法中,然后按一下record(红色按钮是record按钮。), Xcode底部的小按钮即可。

当record按下按钮时,Xcode将启动我们的应用程序并捕获所有交互,为我们编写代码。
对于本文,我准备了一个非常简单的应用程序(您可以在此处找到代码),该应用程序view具有3个按钮:一个privacy按钮,一个tos(服务条款)按钮和一个继续按钮。Continue除非用户同时点击privacytos按钮,否则该按钮将被禁用。一旦两个按钮都被选中,该Continue按钮将变为启用状态,并且用户HomeView在点击该Continue按钮时会导航到蓝色。

屏幕A。未选择按钮,继续禁用;屏幕B。选择了服务条款,继续禁用;屏幕C,两个按钮均被选中,继续启用;屏幕D,蓝色HomeView。

让我们做一个快速实验并开始记录测试。在此用例中,我们要:

  1. 轻按 Tap to accept TOS
  2. 轻按 Tap to Accept Privacy Policy
  3. 确认已Continue启用
  4. 点按Continue,即可看到该应用导航至蓝色view
  5. 停止录音。
    此过程的输出是以下代码:
func testExample() throws {// UI tests must launch the application that they test.let app = XCUIApplication()app.launch()// Use recording to get started writing UI tests.// Use XCTAssert and related functions to verify your tests produce the correct results.// XCODE STARTS WRITING HERE:												

翻译:您在Swift 5中的第一个UITest相关推荐

  1. uitest_您在Swift中的第一个UITest

    uitest 测试中 (TESTING) 什么是自动UITest? (What Is Automated UITest?) When we speak about testing, we usuall ...

  2. Swift语言中如何使用JSON数据教程

    原文:Swift语言中如何使用JSON数据教程 这是一篇翻译文章,原文出处:http://www.raywenderlich.com/82706/working-with-json-in-swift- ...

  3. Swift语言中的#ifdef替换

    本文翻译自:#ifdef replacement in the Swift language In C/C++/Objective-C you can define a macro using com ...

  4. Swift语言中的感叹号是什么意思?

    本文翻译自:What does an exclamation mark mean in the Swift language? The Swift Programming Language guide ...

  5. iOS Swift 5中的键盘处理

    This article was originally published at CometChat. 本文最初在CometChat上发布. "Handling Keyboard in iO ...

  6. 如何在Swift 3中创建调度队列

    在Swift 2中,我能够使用以下代码创建队列: let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue&quo ...

  7. ​Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    ​Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift ...

  8. 1.Swift教程翻译系列——关于Swift

    英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 我本来是做JAVA的.可是有一颗折腾的心,苹果公布Swift以后就下载了苹果的开 ...

  9. 在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON

    SwiftyJSON能够让在Swift语言中更加简便处理JSON数据. With SwiftyJSON all you have to do is: ? 1 2 3 4 let json = JSON ...

  10. Swift项目中不能定义OC类继承Swift类

    2019独角兽企业重金招聘Python工程师标准>>> 报错原因 Swift项目中 OC文件类  继承  Swift文件类 Cannot subclass a class with ...

最新文章

  1. Xshell+技巧+快捷键
  2. Chrome浏览器官方离线安装包下载
  3. python中if __name__ == __main__的解释
  4. ETL学习之四:SQL Server Integration Services入门
  5. javascript对象包含哪些要素_重学JavaScript 对象
  6. spring 定时器注释_带注释的控制器– Spring Web / Webflux和测试
  7. jaxb 解析list元素_JAXB和根元素
  8. 2012浙大878计算机专业基础综合大题答案解析
  9. Web服务器的部署地点
  10. 算法与数据结构(一)-导学
  11. endnotex9下载安装_endnote x9怎么和word关联?Word中用EndNote X9教程
  12. 安卓手机屏幕在电脑上实时同步显示
  13. Hive 连接 secured ES 踩坑日记
  14. 又一块遮羞布被撕了,5G的发展还是得靠手机用户
  15. 把单元格一分为二_怎么将一个单元格一分为二
  16. SQLServer iif函数
  17. Tomcat7集群共享Session 基于redis进行统一管理
  18. 影响照片锐度的7个要素
  19. 云宏携手英特尔基于英特尔® 至强® 可扩展平台全面升级超融合一体机解决方案
  20. 请简述什么是mysql,MySQL之什么是MySQL

热门文章

  1. python曲线图局部放大_python放大图片和画方格实现算法
  2. titanic数据集_数据可视化泰坦尼克号图表预测
  3. 在O(1)时间复杂度删除链表节点(372)
  4. WPF中INotifyPropertyChanged用法与数据绑定
  5. Tomcat 下面使用软连接指向真实的上传文件夹
  6. wordpress不登陆后台禁用插件
  7. oracle 平均值 最大值,Oracle分析函数三——SUM,AVG,MIN,MAX,COUNT
  8. 将给出的整数x翻转_LeetCode(七)整数反转
  9. 函数模板---清晰的例子,通俗易懂(超详细)
  10. kafka应用场景_从未如此简单:10分钟带你逆袭Kafka!