在上线之后发生了几次崩溃闪退, 需要紧急修复的情况之后, 我决定我要动手了...

分析了这几次情况之后, 发现其实大的逻辑都没有错, 但是细的东西特别容易出篓子, 例如说布尔条件写反了, 某个 @IBOutlet 的控件改名了, 删掉了, 忘了去 storyboard 里处理掉它, 就会发生 setValue: forUndefinedKey: 的错误, 本来我是想直接 swizzle 掉这个方法, 不让它抛出错误, 但是想想又觉得不值得. 难道终于要开始学一下怎么写测试了吗?

然后突然想起了之前好像看到过一个 UI 测试的框架, 可以自动帮忙测试 UI, 找到之后就开始用, 然后一发不可收拾.

仓库的位置在这里 GitHub - zalando/SwiftMonkey: A framework for doing randomised UI testing of iOS apps

简介

这个库让我想起了无限猴子理论, 其实也类似, 就是产生间隔一段事件就产生一个随机操作事件, 例如点击拖拽, 闪退的话是最容易发现的, 或者是你看到一些错误的数据和 UI 呈现.(效果图是张 gif, 手机端加载可能会比较慢)

这个库分成两部分:

  1. 主体是 SwiftMonkey, 依赖于 XCUITest, 调用了一些私有方法去发起操作事件
  2. SwiftMonkeyPaws, 负责呈现操作事件的视觉效果, 上面的动图里, 那些小手掌就是 SwiftMonkeyPaws 制造出来的, 需要直接接入到 app 里面

接入流程

官方文档目前还不是很详细, 我花了一点时间才把这个库给搞明白, 所以大概介绍一下接入流程.

包管理, 很简单嘛, 支持 Carthage 和 Cocoapods 两种方式, 想用哪个用哪个.

但使用 Cocoapods 的同学有一点事情要注意, 作者忘了 push podspec 到主仓库了, 所以我们 pod 里搜索和安装的都是 1.0.0 版本, 最低支持 iOS 9.0, 而最新的 1.0.1 版本最低支持 8.0.

解决方法也很简单, pod 的时候指定仓库就行了, 就像这样:

pod 'SwiftMonkey', :git => 'https://github.com/zalando/SwiftMonkey.git'复制代码

安装完之后, 在 AppDelegate 里面我们需要初始化一下 SwiftMonkeyPaws, 有视觉效果毕竟会更好一点

import SwiftMonkeyPaws@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {var paws: MonkeyPaws?func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {#if DEBUGif CommandLine.arguments.contains("--MonkeyPaws") {paws = MonkeyPaws(view: window!)}#endifreturn true}
}复制代码

记得要在 AppDelegate 里声明一个 paws 去维持引用计数, 然后 MonkeyPaws 就会 swizzle 掉 UITouch 的方法, 让每次点击, 拖拽都会有相应的视觉效果.

这里我们看到一个 CommandLine.argments.contains(“—MonkeyPaws”) 可能会比较奇怪, 这段代码是为了区分开 app 是否跑在测试模式下的, 然后为了不在正式版里加入这段代码, 我们还加上了 compile flag 去判断是否编译这段代码. 直接加一个 ConfiguationSet 也行, 但不优雅, 也没必要...

接下里我们就去处理 UI 测试的代码:

import SwiftMonkeyclass UITest: XCTestCase {override func setUp() {super.setUp()continueAfterFailure = falselet app = XCUIApplication()app.launchArguments.append("--MonkeyPaws")app.launch()}
}复制代码

在 setup 方法里, 需要注意的就是最好把 continueAfterFailure 设为 false, 让代码出错时能够停留在出错的位置那里, 方便我们 DEBUG, 毕竟我们使用的不是常规的测试方法, 测试用例跟代码之间没有一一对应的关系.

还有一个就是加上参数 —-MonkeyPaws 去区分运行和测试状态, 不加的话 paws 就不会运行了.

那么久该开始写用例了, 我用的方式比较粗暴.

func testMonkey() {let application = XCUIApplication()// Workaround for bug in Xcode 7.3. Snapshots are not properly updated// when you initially call app.frame, resulting in a zero-sized rect.// Doing a random query seems to update everything properly.// TODO: Remove this when the Xcode bug is fixed!_ = application.descendants(matching: .any).element(boundBy: 0).framelet monkey = Monkey(frame: application.frame)monkey.addXCTestTapAction(weight: 25)monkey.addXCTestDragAction(weight: 200)monkey.addXCTestTapAction(weight: 100)monkey.addXCTestDragAction(weight: 30)monkey.monkeyAround(iterations: 360000)
}复制代码

前面的代码是我照抄官方给的例子的, 不加的话会有 bug.

接着我们初始化一只 Monkey, 然后给它添加一些动作, 其实还有什么各种 pinch, peek, pop 之类的, 但我的项目比较简单, 所以我就只加了点击和拖拽动作, weight 是间隔. monkeyAround 就是开始随机操作, iteration 是操作的次数, 操作满 360000 次就会停止.

这基本上就是我的用法, 里面还有一些挺有趣的东西, 之后有空的话我还会再探索一下, 例如添加多几个用例, 然后先跳转到新写的 ViewController 那里, 让这只猴子把里面的东西全都搞乱, 看看有啥 bug.

使用体验

到目前位置我用了这个库两三天, 每天中午去吃饭都会跑一下, 发现了几个 bug, 三个是低级错误, 两个比较隐晦, 主要是关于多次点击重复触发关键事件, 例如说一秒内连续点了七八次提交订单, 导致发出去七八个请求, 实际在网络情况不好的时候, 用户也有可能心急多次点击, 所以挺好的, 帮我提前预防了一些问题.

其实觉得无论是哪种情况, 都挺适合用一下这个库去找到一些低级的明显的 bug, 强烈推荐大家用一下.

觉得我写的还不错的话可以关注一下我的博客

养一只”无限猴子”帮你测试相关推荐

  1. 阿里竟然雇佣了一只大猴子...

    我们"雇佣"了一只大猴子,只为"搞破坏",不开玩笑. 一.这只猴子是用来做什么的? 从程序员的视角来看,提高系统稳定性的方法无外乎三种: •通过各种技术手段,例 ...

  2. 我们雇佣了一只大猴子…

    Picture from Gremlin 我们"雇佣"了一只大猴子,只为"搞破坏",不开玩笑. 这只猴子是用来做什么的? 从程序员的视角来看,提高系统稳定性的方 ...

  3. 痛与快乐有一个代码是什么_养一只真大型犬的生活是什么样的?铲屎官:痛并快乐着!...

    全国多地都颁布了禁养大型犬相关条例,给人一种狗狗「体型大」就很「凶恶」的感觉. 但真是这样的吗? 今天,我还想为大家介绍一种体型超大号,内心却很奶的狗子--中亚牧羊犬. 下面就是今天的主人公--金刚, ...

  4. 一只老猴子说的话,太经典了!

    一只老猴子说的话,太经典了! 故事一 一只猴子,肚子被树枝划伤,流了很多血. 它见到一个猴子就扒开伤口说,你看我的伤口好痛. 每个看见它伤口的猴子都安慰它,告诉它不同的治疗方法. 它就继续给朋友们看伤 ...

  5. 如何科学养一只鸽子为你飞鸽传书——程序间异步通信_莫韵乐的Linux英雄传

    如何科学养一只鸽子为你飞鸽传书--程序间异步通信 程序间异步通信--其本质都只是将信息从A端到B端的传递,只要通信双方都做好发出信息和接收信息的准备就可以实现飞鸽传书 接下来看一下怎样如何科学养一只鸽 ...

  6. 训练自己集中注意力就是要驯服这只大猴子

    在互联网内容中每日浸泡的我们每个人,思路就象一只跳来跳去的猴子,一会想这个,一会想那个,而训练自己集中注意力就是要驯服这只大猴子. 在日常生活中,你可以采用下面这些技巧,让自己更加专注. 1.专注力到 ...

  7. 养个儿子不如养一只狗划算

    奉节男子冉运海与6旬母亲吴某吵完架后,将其活活掐死,并埋尸屋后土坑中.随后,冉以母亲失踪为由,变卖家财潜逃.吴养了近10年的黄狗四处搜寻主人,4个月后从土中刨出主人尸骨.昨日,记者从奉节县检察院获悉, ...

  8. 只安装python_AI帮你写Python,安装只需5步,还能任你调教 | 开源

    一行一行地敲代码就像是徒手搬砖,聪明的程序猿们表示:我们要解放生产力! 比如像这样: 在机器学习的时代,AI智能补全代码早已不是梦想,各种IDE和插件都在努力帮助程序猿减少击键次数,延长键盘寿命(雾. ...

  9. 阿里工程师养了只“二哈”,专治讨厌的骚扰电话

    前几天的3.15晚会上曝光了利用智能机器人,一天打4万个骚扰电话,从而赚取利润的黑色产业链. 阿里的工程师恼了,技术是用来让人们生活变美好的,不是被利用来走向阴暗的. 机器人的问题交给机器人! 工程师 ...

  10. 计算机谭音乐两只老虎,Arduino播放音乐《两只老虎》完整代码-测试有效.docx

    Arduino播放音乐<两只老虎>完整代码 [测试有效才发布的] #define C_0 -1 #define C_1 262 #define C_2 294 #define C_3 33 ...

最新文章

  1. java好用的hbase库_Hbase入库基于java
  2. docker java 不兼容_Apple M1 芯片不支持 Docker?Docker:正在努力适配
  3. Ubuntu使用技巧(二)
  4. 微信小程序设置启动图时出现滚动条
  5. [渝粤教育] 山东第一医科大学 健康教育与健康促进 参考 资料
  6. Vue解析--如何应对面试官提问
  7. Java 基础——构造器和方法的区别
  8. matlab程序聚类预测机器学习
  9. ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...
  10. 怎样找回由于IO设备错误移动硬盘的文件
  11. 九章算法 | Facebook 面试题 : Backpack VI 背包算法
  12. Java继承 implements 与 extends 总结
  13. Docker学习总结(23)——Docker搭建大规模测试环境的实践
  14. 一步一步写算法(之线性堆栈)
  15. 6.Jenkins 权威指南 --- 高级构建
  16. 解决 OCS: No schema for XXX at xx index, context <Quirks> 警告
  17. 联控智能无刷电机板子运行STM32 FOC 5.x电机库的程序,电机转一会儿会自动停下来的解决办法
  18. 马哥python课堂笔记_马哥教育PYTHON相关基础 笔记
  19. js判断图片加载完成后再执行代码
  20. 关于java反射的一些基础方法说明--Filed

热门文章

  1. Ubuntu搭建饥荒(Don't Starve Together)游戏服务器
  2. 笔记本开不了机怎么办?
  3. outlook qr码在哪里_Outlook与iPhone并存管理通讯录
  4. tespeed - 测试网速的Python工具
  5. IBM Tivoli Storage Manager安装介绍
  6. 侯捷 C++11/14 笔记
  7. JS 移动端网页特效(一)
  8. 2021-02-15 大数据课程笔记 day26
  9. Ballot evaluation
  10. java教程51_java基础视频教程