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

Stanley3719 8年前
   <p>测试是3x3 策略里面的关键组成。随着我们提高 iOS 持续交付流水线,我们面临两大难题:测试工具的稳定性和可扩展性。我们需要一个工具来把 iOS UI 测试跑的又快又可靠。因此,我们创建了一个项目,叫蓝色药丸,今天我们开源了这个项目。蓝色药丸是一个稳定的 iOS 测试工具,它可以在同一台机器上的多个模拟器上运行 UI 测试。蓝色药丸为 Linkedin 节省了数以千计的小时。我们相信,它可以极大地帮助任何大规模运行 iOS UI 测试的人。</p>    <h2>现有的限制</h2>    <p>通常开箱即用的 iOS 测试工具主要有两个限制:稳定性和扩展性。</p>    <h3>稳定性</h3>    <p>如同其他公司做大规模 iOS 开发和测试一样,在处理 iOS 模拟器稳定性上,我们面临了很多挑战。我们在去年的一篇博文里阐述了我们是如何处理模拟器的碎片化,为了找出最优的解决方案,我们试验了不同的环境配置。然而,由于 iOS 模拟器是一个黑盒,而且会随着 Xcode 的升级而升级。我们逐渐意识到并只能接受,即使在某个版本,无论环境多健壮,仍旧无法避免模拟器升级之后带来的变化和反复无常。</p>    <h3>可扩展性</h3>    <p>Xcode 一次只能运行一个模拟器。所以我们只能串行运行测试用例。我们有 <strong>2000</strong> 多的 UI 测试用例,串行运行需要花大概 15 小时。如果想在三小时内完成提交就发布的节奏,我们必须并行运行。</p>    <h2>现有的解决方案</h2>    <p>为了解决这些问题,我们找到了两个现有方案,但是没有一个能非常好的满足我们的需求。</p>    <ol>     <li> <p>分发测试</p> <p>我们先尝试了把我们的 iOS UI 测试拆分成多个子集,然后分发给多个机器。在以前的文章 <a href="/misc/goto?guid=4959671331157347879" rel="nofollow,noindex">iOS Build Speed and Stability</a> 中,我们提到过这个方案。但是这个方案有两个问题:</p>      <ol>       <li>稳定性: 我们 Mac 设备池的稳定性大约 98%。如果我们把测试分发给 10 台设备,只有所有这 10 台机器上的测试都通过,这个版本才算测试通过。由于每加一台设备,遇到不确定失败的场景就会指数级增加,所以工具的不确定性急剧恶化。当有10台设备在跑用例的时候,可靠性就掉到了 98%*98%...(10次)约等于 82%。</li>       <li>容量需求: 使用硬件并行测试的第二个问题就是容量。在高峰期间(比如,午饭或者晚饭时候),我们有大约 80 个并发的持续集成的任务。要跑起来,就需要 800 台机器。我们遇到这个问题时候,我们只有200台机器。那么其他的任务只能排队了。这个时候如果有开发提交代码,那么他只能等几个小时才能测试到。</li>      </ol> </li>     <li> <p>九头蛇项目(Hydra):一个多模拟器运行的 python 的封装</p> <p>后来有人建议在多个模拟器上并行运行用例来解决上面说的分发测试问题。非死book 的 xctool 和 Johannes 的 <a href="/misc/goto?guid=4959735903073081049" rel="nofollow,noindex">在多个模拟器运行 iOS 用例的概念</a> 的给了我们灵感,我们搞了一个基于 xctool 的 python 封装来在多个模拟器上运行用例。这个方案帮助我们搞定了持续交互的环境问题。但是我们还遇到了几个问题:</p>      <ol>       <li><strong>基于 xctool</strong> :作为 iOS 测试工具,xctool 是非常棒的。然后 xctool 停止开发了,没人维护了。我们只有两个选择:要么 fork 一个自己重构,要么做我们自己的测试工具。在做了一番调研之后,我们发现做一个在多个模拟器上运行测试工具并不难。</li>       <li><strong>这仅仅是一个 xctool python 封装</strong> :基于 xctool 的 python 封装无法访问 CoreSimulator 的 API。如果不能直接和模拟器对话,就很难操控模拟器。</li>      </ol> </li>    </ol>    <h2>Introducing Bluepill</h2>    <p>既然现有方案无法满足我们的需求,我们决定自己搞。这个工具基于苹果的 CoreSimulator 框架使用 Objective-C 写的,我们叫他蓝色药丸,名字出自黑客帝国里的蓝色药丸,原来不是伟哥。。</p>    <p>蓝色药丸可以在多个模拟器上并行运行测试,主要特点如下:</p>    <ul>     <li>在多个模拟器上并行运行测试</li>     <li>自动把差不多时间完成的测试打包成组</li>     <li>使用 headless 模式运行测试,减少内存消耗</li>     <li>生成 junit 的报告</li>     <li>实时报告测试状态,包括测试速度和环境健康度</li>     <li>模拟器挂掉重试机制</li>    </ul>    <p>看下我们的演示:</p>    <p><img src="https://simg.open-open.com/show/e4825e4e59aef31bae94e52a14ca3ff8.gif"></p>    <h2>如何使用蓝色药丸,难道不是口服?</h2>    <p>和口服一样简单迅速,我们就可以用起来了。最简单的方法就是你只要运行下面的命令,就可以启动4个模拟器来并行运行你的测试用例。运行结束之后,你就会在 ./output 目录里找到测试报告:</p>    <pre>  ./bluepill -a ./Sample.app -s ./SampleAppTestScheme.xcscheme -o ./output/</pre>    <p>另外,你可以写一个配置文件,使用命令: ./bluepill -c config.json 就可以跑起来了。具体就看这里吧—— <a href="/misc/goto?guid=4959735903161033742" rel="nofollow,noindex">https://github.com/linkedin/bluepill</a></p>    <h2>开源</h2>    <p>我们很高兴的宣布,蓝色药丸开源了。开源证书是 BSD-2 clause。大家想来贡献或者提建议的直接来我们的github,地址是: <a href="/misc/goto?guid=4959735903161033742" rel="nofollow,noindex">https://github.com/linkedin/bluepill</a> 。欢迎大家来玩。</p>    <h2>Acknowledgements</h2>    <p>Bluepill was created by <a href="/misc/goto?guid=4959735903262090109" rel="nofollow,noindex">Ashit Gandhi</a> , <a href="/misc/goto?guid=4959735903346528731" rel="nofollow,noindex">Jarek Rudzinski</a> , <a href="/misc/goto?guid=4959735903429128785" rel="nofollow,noindex">Keqiu Hu</a> , and <a href="/misc/goto?guid=4959735903521397595" rel="nofollow,noindex">Oscar Bonilla</a> . It was inspired by <a href="/misc/goto?guid=4959735903073081049" rel="nofollow,noindex">parallel iOS test</a> and 非死book’s <a href="/misc/goto?guid=4958822653748995612" rel="nofollow,noindex">xctool</a> . The Bluepill icon was created by <a href="/misc/goto?guid=4959735903641863702" rel="nofollow,noindex">Maria Iu</a> .</p>    <p> </p>    <p>来自:https://testerhome.com/topics/7229</p>    <p> </p>    <p> </p>    <p> </p>