iOS 测试 Linkedin 的蓝色药丸

恒温 · 2017年01月24日 · 最后由 恒温 回复于 2017年02月13日 · 4216 次阅读
本帖已被设为精华帖!

看到有同学提到蓝色药丸(https://testerhome.com/topics/7200),感兴趣去看了下,随手翻译过来,理念还不错。原文在这里:

https://engineering.linkedin.com/blog/2017/01/open-sourcing-bluepill--run-ios-tests-in-multiple-simulators

测试是 3x3 策略里面的关键组成。随着我们提高 iOS 持续交付流水线,我们面临两大难题:测试工具的稳定性和可扩展性。我们需要一个工具来把 iOS UI 测试跑的又快又可靠。因此,我们创建了一个项目,叫蓝色药丸,今天我们开源了这个项目。蓝色药丸是一个稳定的 iOS 测试工具,它可以在同一台机器上的多个模拟器上运行 UI 测试。蓝色药丸为 Linkedin 节省了数以千计的小时。我们相信,它可以极大地帮助任何大规模运行 iOS UI 测试的人。

现有的限制

通常开箱即用的 iOS 测试工具主要有两个限制:稳定性和扩展性。

稳定性

如同其他公司做大规模 iOS 开发和测试一样,在处理 iOS 模拟器稳定性上,我们面临了很多挑战。我们在去年的一篇博文里阐述了我们是如何处理模拟器的碎片化,为了找出最优的解决方案,我们试验了不同的环境配置。然而,由于 iOS 模拟器是一个黑盒,而且会随着 Xcode 的升级而升级。我们逐渐意识到并只能接受,即使在某个版本,无论环境多健壮,仍旧无法避免模拟器升级之后带来的变化和反复无常。

可扩展性

Xcode 一次只能运行一个模拟器。所以我们只能串行运行测试用例。我们有 2000 多的 UI 测试用例,串行运行需要花大概 15 小时。如果想在三小时内完成提交就发布的节奏,我们必须并行运行。

现有的解决方案

为了解决这些问题,我们找到了两个现有方案,但是没有一个能非常好的满足我们的需求。

  1. 分发测试
    我们先尝试了把我们的 iOS UI 测试拆分成多个子集,然后分发给多个机器。在以前的文章iOS Build Speed and Stability中,我们提到过这个方案。但是这个方案有两个问题:

    1. 稳定性: 我们 Mac 设备池的稳定性大约 98%。如果我们把测试分发给 10 台设备,只有所有这 10 台机器上的测试都通过,这个版本才算测试通过。由于每加一台设备,遇到不确定失败的场景就会指数级增加,所以工具的不确定性急剧恶化。当有 10 台设备在跑用例的时候,可靠性就掉到了 98%*98%...(10 次)约等于 82%。
    2. 容量需求: 使用硬件并行测试的第二个问题就是容量。在高峰期间(比如,午饭或者晚饭时候),我们有大约 80 个并发的持续集成的任务。要跑起来,就需要 800 台机器。我们遇到这个问题时候,我们只有 200 台机器。那么其他的任务只能排队了。这个时候如果有开发提交代码,那么他只能等几个小时才能测试到。
  2. 九头蛇项目(Hydra):一个多模拟器运行的 python 的封装
    后来有人建议在多个模拟器上并行运行用例来解决上面说的分发测试问题。Facebook 的 xctool 和 Johannes 的在多个模拟器运行 iOS 用例的概念的给了我们灵感,我们搞了一个基于 xctool 的 python 封装来在多个模拟器上运行用例。这个方案帮助我们搞定了持续交互的环境问题。但是我们还遇到了几个问题:

    1. 基于 xctool:作为 iOS 测试工具,xctool 是非常棒的。然后 xctool 停止开发了,没人维护了。我们只有两个选择:要么 fork 一个自己重构,要么做我们自己的测试工具。在做了一番调研之后,我们发现做一个在多个模拟器上运行测试工具并不难。
    2. 这仅仅是一个 xctool python 封装:基于 xctool 的 python 封装无法访问 CoreSimulator 的 API。如果不能直接和模拟器对话,就很难操控模拟器。

Introducing Bluepill

既然现有方案无法满足我们的需求,我们决定自己搞。这个工具基于苹果的 CoreSimulator 框架使用 Objective-C 写的,我们叫他蓝色药丸,名字出自黑客帝国里的蓝色药丸,原来不是伟哥。。

蓝色药丸可以在多个模拟器上并行运行测试,主要特点如下:

  • 在多个模拟器上并行运行测试
  • 自动把差不多时间完成的测试打包成组
  • 使用 headless 模式运行测试,减少内存消耗
  • 生成 junit 的报告
  • 实时报告测试状态,包括测试速度和环境健康度
  • 模拟器挂掉重试机制

看下我们的演示:

如何使用蓝色药丸,难道不是口服?

和口服一样简单迅速,我们就可以用起来了。最简单的方法就是你只要运行下面的命令,就可以启动 4 个模拟器来并行运行你的测试用例。运行结束之后,你就会在 ./output 目录里找到测试报告:

./bluepill -a ./Sample.app -s ./SampleAppTestScheme.xcscheme -o ./output/

另外,你可以写一个配置文件,使用命令:./bluepill -c config.json 就可以跑起来了。具体就看这里吧——https://github.com/linkedin/bluepill

开源

我们很高兴的宣布,蓝色药丸开源了。开源证书是 BSD-2 clause。大家想来贡献或者提建议的直接来我们的 github,地址是:https://github.com/linkedin/bluepill。欢迎大家来玩。

Acknowledgements

Bluepill was created by Ashit Gandhi, Jarek Rudzinski, Keqiu Hu, and Oscar Bonilla. It was inspired by parallel iOS test and Facebook’s xctool. The Bluepill icon was created by Maria Iu.

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 15 条回复 时间 点赞

那么晚了还在翻译,点个赞👍

思寒_seveniruby 将本帖设为了精华贴 01月24日 12:33

先 mark 一下

赞,不过模拟器的结果真的那么可靠么?

#4 楼 @chenhengjie123 用模拟器跑的话,只是对开发提交代码后做一次冒烟测试,这个成本比用真机低,而且易维护得多~你觉得呢?

#4 楼 @chenhengjie123 我准备放到持续集成里构建后的环节中做冒烟

#5 楼 @huayinwang 上家公司核心流程涉及 iOS 系统的一些核心功能,模拟器上实现不一样,结果不可靠,所以基本都用真机跑。如果是业务流程应该问题不大。

xctool 真的已经停止更新了么?

恒温 #10 · 2017年02月04日 Author

#9 楼 @debugtalk 应该是维护不积极吧

药不能停,好文好文~~

怎么用药啊 看了好久了 还是不会用,求大神让我雄起
最简单的方法就是你只要运行下面的命令,就可以启动 4 个模拟器来并行运行你的测试用例。
需要什么前戏?

恒温 #13 · 2017年02月04日 Author

#12 楼 @ZJEdward 这是个介绍的帖子,要用起来得自己研究。是篇翻译啊。

我也想知道怎么用

不支持真机有什么测试价值。。。

恒温 #16 · 2017年02月13日 Author

#15 楼 @sixleaves

用模拟器跑的话,只是对开发提交代码后做一次冒烟测试,这个成本比用真机低,而且易维护得多~你觉得呢?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册