iOS SwiftMonkey 随机暴力测试
参考源文章
https://github.com/zalando/SwiftMonkey
https://kemchenj.github.io/2017/03/16/2017-03-16/
简介
这个库让我想起了无限猴子理论, 其实也类似, 就是产生间隔一段事件就产生一个随机操作事件, 例如点击拖拽, 闪退的话是最容易发现的, 或者是你看到一些错误的数据和 UI 呈现.
- 这个库分成两部分:
主体是 SwiftMonkey, 依赖于 XCUITest, 调用了一些私有方法去发起操作事件
SwiftMonkeyPaws, 负责呈现操作事件的视觉效果, 上面的动图里, 那些小手掌就是 SwiftMonkeyPaws 制造出来的, 需要直接接入到 app 里面
安装步骤
但使用 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 DEBUG
if CommandLine.arguments.contains("--MonkeyPaws") {
paws = MonkeyPaws(view: window!)
}
#endif
return true
}
}
记得要在 AppDelegate 里声明一个 paws 去维持引用计数, 然后 MonkeyPaws 就会 swizzle 掉 UITouch 的方法, 让每次点击, 拖拽都会有相应的视觉效果.
这里我们看到一个 CommandLine.argments.contains(“—MonkeyPaws”) 可能会比较奇怪, 这段代码是为了区分开 app 是否跑在测试模式下的, 然后为了不在正式版里加入这段代码, 我们还加上了 compile flag 去判断是否编译这段代码. 直接加一个 ConfiguationSet 也行, 但不优雅, 也没必要…
接下里我们就去处理 UI 测试的代码:
import SwiftMonkey
class UITest: XCTestCase {
override func setUp() {
super.setUp()
continueAfterFailure = false
let 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).frame
let 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 产生.
其实觉得无论是哪种情况, 都挺适合用一下这个库去找到一些低级的明显的 bug, 强烈推荐大家用一下.
iOS SwiftMonkey 随机暴力测试的更多相关文章
- Cocos2d-x 关于在iOS平台真机测试的一些注意
下面简单记录一下在最近cocos2d-x项目在iOS平台真机测试和模拟器测试中遇到的一些要注意的地方(使用ipod): 1.图片大小 游戏中基本上都是会用到图片,那么在使用图片的时候要特别注意图片的s ...
- unity - ios打包真机测试及模拟器测试
本文介绍unity游戏如何在iphone机和ios模拟器上进行测试打包 准备工作:mac电脑一台.iphone一部.连接mac和iPhone的数据线.unity.Xcode.苹果开发者账号. 苹果开发 ...
- 数学:随机素数测试(Miller_Rabin算法)和求整数素因子(Pollard_rho算法)
POJ1811 给一个大数,判断是否是素数,如果不是素数,打印出它的最小质因数 随机素数测试(Miller_Rabin算法) 求整数素因子(Pollard_rho算法) 科技题 #include< ...
- IOS AppStore上线前测试
IOS AppStore上线前测试 TestFlight Beta ios 8才开始支持. https://developer.apple.com/library/ios/documentation ...
- ios 中如何应对UIScrollView快速滑动(暴力用户,暴力测试)
1.实现UIScrollViewDelegate 开始滑动: - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 滑动 ...
- Xcode5 + phoneGap2.9搭建ios开发环境-配置-测试-归档上传/phoneG...
前言: 小弟是做JAVA/Android的第一次搞这个ios,公司有mobile项目是使用phoneGap开发的,需要开发ios版本.什么都不会只能一点一点琢磨了……大神越过…… 原文链接:http: ...
- HDU2138 随机素数测试 Miller-Rabin算法
题目描述 Give you a lot of positive integers, just to find out how many prime numbers there are.. In eac ...
- 【iOS】随机三角瓷砖布局算法
你已经看够iOS鉴于这些默认的正方形块,整齐地显示? 本篇给出一个随机算法设计的三角布局的瓷砖和实施. 这样的规则,并提出妥协随机排列间.它看起来很凌乱,不会有一个新事物. 重点是设计和实施,以实现布 ...
- iOS 程序调试、测试方案
1. iOS 之 界面调试 2. iOS 之 调试.解决BUG 3. iOS 程序测试.程序优化.提交前检测
随机推荐
- [原]unity3d ios平台内存优化(一)
关于内存优化,人云亦云 各有己见.本文将通过设置Strpping Level ,减少内存使用. 先看三幅图: 1.没做任何优化,默认选项 2.设置Stripping level 为 Use micro ...
- Laravel5.1 填充数据库
当我们创建好表结构后 通常都要生成一些测试用的数据来测试,应对这个场景呢 Laravel提供了相当好的服务 --seed Laravel的seeder都会放在:/database/seeders 目录 ...
- C# winform开发嵌套Chrome内核浏览器(WebKit.net)开发(一)
https://www.cnblogs.com/Maxq/p/6566558.html WebKit.net是对WebKit的.Net封装, 使用它.net程序可以非常方便的集成和使用webkit作为 ...
- SqlServer当前月份时间
SqlServer当前月份时间 SELECT -DAY(getdate()+-DAY(getdate()))
- PHP计算两个绝对路径的相对路径
用PHP计算两个绝对路径的相对路径,该如何求呢? 先根据分隔符切割,然后查找相同 异同点,然后开始有相同点,从相同点结束为止开始拼接剩余部分,没有的话,到达根路径拼接整体. 截图如下: 代码如下: & ...
- Redis 集群配置
Redis 集群介绍: (1) 为什么要使用集群:如果数据量很大,单台机器会存在存储空间不够用 .查询速度慢 .负载高等问题,部署集群就是为了解决这些问题(2) Redis 集群架构如下,采用无中心结 ...
- Maven编译出现“[ERROR] java.lang.OutOfMemoryError: Java heap space”
Windows下添加环境变量MAVEN_OPTS的value为-Xms1024m -Xmx1024m -Xss1m Linux下可修改.profile或者.bash_profile文件,并做如下设置: ...
- Hashtable的应用
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其 ...
- hadoop JOB的性能优化实践
使用了几个月的hadoopMR,对遇到过的性能问题做点笔记,这里只涉及job的性能优化,没有接触到 hadoop集群,操作系统,任务调度策略这些方面的问题. hadoop MR在做大数据量分析时候有限 ...
- 《Lua程序设计》9.1 协同程序基础 学习笔记
协同程序(coroutine)与线程(thread)差不多,也就是一条执行序列,拥有自己独立的栈.局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西.从概念上讲线程与协同程序的主要区 ...