close
当前位置: 物联网在线 > 技术文库 > ios >

iOS开源:Bluepill - Linkedin 的蓝色药丸

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

现有的限制

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

稳定性

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

可扩展性

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

现有的解决方案

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

分发测试

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

稳定性: 我们 Mac 设备池的稳定性大约 98%。如果我们把测试分发给 10 台设备,只有所有这 10 台机器上的测试都通过,这个版本才算测试通过。由于每加一台设备,遇到不确定失败的场景就会指数级增加,所以工具的不确定性急剧恶化。当有10台设备在跑用例的时候,可靠性就掉到了 98%*98%...(10次)约等于 82%。

容量需求: 使用硬件并行测试的第二个问题就是容量。在高峰期间(比如,午饭或者晚饭时候),我们有大约 80 个并发的持续集成的任务。要跑起来,就需要 800 台机器。我们遇到这个问题时候,我们只有200台机器。那么其他的任务只能排队了。这个时候如果有开发提交代码,那么他只能等几个小时才能测试到。

九头蛇项目(Hydra):一个多模拟器运行的 python 的封装

后来有人建议在多个模拟器上并行运行用例来解决上面说的分发测试问题。Facebook 的 xctool 和 Johannes 的 在多个模拟器运行 iOS 用例的概念 的给了我们灵感,我们搞了一个基于 xctool 的 python 封装来在多个模拟器上运行用例。这个方案帮助我们搞定了持续交互的环境问题。但是我们还遇到了几个问题:

基于 xctool :作为 iOS 测试工具,xctool 是非常棒的。然后 xctool 停止开发了,没人维护了。我们只有两个选择:要么 fork 一个自己重构,要么做我们自己的测试工具。在做了一番调研之后,我们发现做一个在多个模拟器上运行测试工具并不难。

这仅仅是一个 xctool python 封装 :基于 xctool 的 python 封装无法访问 CoreSimulator 的 API。如果不能直接和模拟器对话,就很难操控模拟器。

Introducing Bluepill

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

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

在多个模拟器上并行运行测试

自动把差不多时间完成的测试打包成组

使用 headless 模式运行测试,减少内存消耗

生成 junit 的报告

实时报告测试状态,包括测试速度和环境健康度

模拟器挂掉重试机制

看下我们的演示:

iOS开源:Bluepill - Linkedin 的蓝色药丸

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

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

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

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

开源
(责任编辑:ioter)

用户喜欢...

CN0398开发板和ADuCM360_demo_cn0398开源软件包解决了土壤测量系统设

保持适当的土壤湿度和pH值是植物健康的基本要求,无论是用于大规模农业还是简单的家庭菜园。然而,为了测量这些土壤特性,开发人员需要设计出具有成本效益的高精度模拟信号链,能够将...


创新的组合:开源和众筹

开源已经被称为力量倍增器,这是使公司的员工,融资和资源更为有效的一个因素。但是,在过去的几年里,开源已经开始与另一个力量倍增器 - 众筹相提并论。现在,这种结合的结果正在出...


推荐 10 个饱受好评且功能独特的开源人工智能项目

关于人工智能的项目,相信大家都看过或者用过不少了,但它们的大多数看上去都十分“高大上”,让人感觉要掌握他们犹如习屠龙之术一样。事实上,有很多关于人工智能的项目还是十分实...


“开源”为何对于IoT如此重要?

物联网、开源、操作系统是目前IT业界的热门词汇,也正是这三个词汇构成了物联网开源操作系统。 对于物联网发展而言,“碎片化”是主要的问题,其中芯片、传感器、通信协议、应用场景...


基于Zedboard的开源软件定义无线电(SDR)设备:Panoradio!

软件定义无线电(Software Defined Radio, SDR)是一种现代无线电广播通信技术,它采用软件定义的无线通信协议而非“纯硬件电路”实现各种通信和信号采集功能,这种方式打破了有史以来设备...


开源工具助你在FPGA上轻松实现二值化神经网络

神经网络技术起源于上世纪五、六十年代,当时叫感知机,拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果,早期感知机的推动者是...


KVM开源贡献排名重磅发布,腾讯云成全球唯一上榜公有云厂商

腾讯云向KVM内核贡献了46个patch,在全球企业贡献者中位居第6,是唯一一家上榜的公有云厂商。这标志着腾讯云在KV...


OPNFV‘Euphrates’开启云原生NFV之旅

作为开源项目,OPNFV项目通过集成、部署和测试,促进各开源生态支持系统网络功能虚拟化(NFV,Network Functions Virtu...


芯片开源成功难 谁来挑战ARM架构?

这场开源运动从软件而起,却显然不满足于单纯的软件开源。硬件开源从OCP开始,就已经成为一种新趋势。但开源C...


iOS开源:WJClipsButton-Clips 按钮的完整实现

效果 要求 Swift 3.0 iOS 8.0 Xcode 8.0 安装 WJClipsButton is available through CocoaPods . To install it, simply add the following line to your Podfile: pod "WJClipsButton" 使用 Code Import import WJClipsButton Init Setup let wjButton = WJCl...