Facebook 的移动端 A/B 测试框架

简介:
两年前,我们重写了我们 移动端(iOS, Android)的应用,使用了原生的开发栈(native development stacks)代替我们以前定制开发的  Web 栈(custom web-stack)。这给了我们在关于项目在那里/怎样下载、缓存、释放等等方面一个更好的控制。它分别深入地和 操作系统整合在一起,提供在底层调整修改所有系统的一整套工具。
   测试是我们开发的一个重要部分,但在转换到原生的之后,我们没有了 A/B 测试的能力。并不是每个测试都可以用到生产中,但即使是失败的测试也能帮助我们理解如何才能更好地改进。失去的这部分能力变成了一个我们要应对的挑战。
   A/B 测试
  要把我们的应用移植到 iOS 和 Android 上,需要来自不同团队的人来进行协作,每四周就要产生一个新的修复一些 bug 和带有一些新特性的二进制软件包。在我们发布一些更新之后,对于我们很重要的事情是要去明白:
  ● 新特性的使用情况
  ● bug 修复后的运行情况和稳定性
  ● 用户界面改进之后用户是怎么使用这个应用及在哪里花的时间多
  为了去了解这些事情,我们需要一个移动端进行 A/B 测试的基础组件,这个组件能让我们的用户分别使用不同版本的应用(版本 A 和版本 B),这些版本在除某些特别需要测试的部分外,其他各层面都是一样的。所以我们创造了 Airlock,一个可以让我们比较不同版本应用的度量数据(metric data)和进行各种各样测试的 测试框架,这帮助我们决定采用那个版本或者后续如何迭代。
   从一点一滴中建成
  我们尽可能从最简单的试验开始:使用已有的 Web-Stack A/B 分箱(binning system)系统。我们构造了一个测试:把聊天按钮换成文字"Chat"的试验。当应用启动的的时候,它会发送一个到我们服务器上的网络请求,询问这个试验的参数。当有回应返回后,我们就会更新按钮。一些员工会有按钮,另一些员工会有文字"Chat"。我们期望这仅仅会影响信息发送的数量(看起来不会太多),其他的东西不会受影响。
   曝光日志
  当这个版本的应用公开发布了,我们等待数据能稳定下来,然后发现看到文字"Chat" 的版本会更热衷于使用这个应用。是不是我们发现了什么秘密,或者诱惑般的魔法?沮丧地说,并不是。我们遇到了很多 bug,其中一个很大的问题是,某个组件并不能正确地缓冲数值。由于这是个大的系统,基础设施(the infrastructure)必须要是 "防弹的",不然收集到的数据就没用了。
  从服务器开始的数据管道决定某个人的版本是属于那种变体的。然后,数据就会被打包,接着发送到设备上,设备分析返回的信息然后保存。接着,这个值会被用于重新配置 UI,然后最终在屏幕上显示。问题是我们在依靠服务器对我们数据分析的分类。一个简单的 bug 就导致了一大群用户在使用有别于我们期望的的变种版本。服务器还在坚持:"我告诉了设备去显示字符串!" 但在某处地方这个语句变得有点令人模糊(一个在客户端存贮逻辑上的 bug)。
   一个试验的部署图:
  上面图表展示了一个试验的部署。浅绿色的条柱是试验用户的数量,黑绿色的条柱是实际被影响的用户数。我们可以看到,服务器和设备的数据区别还是很大的: 在第一天,大多数用户收到这个配置,但大多数用户没有留意到我们试验。
  当问题不仅仅是设备收到返回的数据,而需要加上我们的数据分析需要知道什么时候收到信息,然后把它正确地显示在 UI 上时,问题变得更大了。即使信息能正确地到达,在 UI 不正确时也有一个延迟。我们通过
  添加双向握手(wo-way handshake)解决了这个问题。设备请求用于试验的数据,服务器记录它发出的回应。因此,即使某用户没有看到我们想让他看到的,我们仍然可以进行正确性分析(但也必须意识到选择性偏差(selection bias)的问题,还有分发时由于某些原因变得不平均)。
   可伸缩性
  在进行了几个月这样的"课程"之后,我们必须将支持两个试验的系统升级支持整个应用的系统。这个促使 Airlock 发生变革的试验是以前我们原想着进化和简化我们应用内的导航模块而开发的。在经历这几个月之后,我们把这个应用改变了很多,你可以去下载 Facebook for iPhone 来体验一下,这里面很多是测试的功劳。
  随后,Airlock 被用于支持更多的试验,其请求的参数,数据的记录、客户端计算等等都快速地变多。Airlock 充分地被用于测试原生的应用,使得我们的应用运行得前所未有的轻快,伴随着测试的自由,再测试,和评估测试结果,我们期望能建造更好的测试和创造更好的用户体验。
最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
13天前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
59 8
|
19天前
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
|
8天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
39 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
13天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
37 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
18天前
|
Java 测试技术 API
探索软件测试中的自动化测试框架
本文深入探讨了自动化测试在软件开发中的重要性,并详细介绍了几种流行的自动化测试框架。通过比较它们的优缺点和适用场景,旨在为读者提供选择合适自动化测试工具的参考依据。
|
21天前
|
jenkins 测试技术 持续交付
自动化测试框架的搭建与实践
在软件开发领域,自动化测试是提升开发效率、确保软件质量的关键手段。本文将引导读者理解自动化测试的重要性,并介绍如何搭建一个基本的自动化测试框架。通过具体示例和步骤,我们将探索如何有效实施自动化测试策略,以实现软件开发流程的优化。
43 7
|
18天前
|
数据管理 jenkins 测试技术
自动化测试框架的设计与实现
在软件开发周期中,测试是确保产品质量的关键步骤。本文通过介绍自动化测试框架的设计原则、组件构成以及实现方法,旨在指导读者构建高效、可靠的自动化测试系统。文章不仅探讨了自动化测试的必要性和优势,还详细描述了框架搭建的具体步骤,包括工具选择、脚本开发、执行策略及结果分析等。此外,文章还强调了持续集成环境下自动化测试的重要性,并提供了实际案例分析,以帮助读者更好地理解和应用自动化测试框架。
|
19天前
|
监控 测试技术 定位技术
探索软件测试中的自动化测试框架选择与实施###
本文不概述传统意义上的摘要内容,而是直接以一段对话形式引入,旨在激发读者兴趣。想象一下,你是一名勇敢的探险家,面前摆满了各式各样的自动化测试工具地图,每张地图都指向未知的宝藏——高效、精准的软件测试领域。我们将一起踏上这段旅程,探讨如何根据项目特性选择合适的自动化测试框架,并分享实施过程中的关键步骤与避坑指南。 ###
29 4
|
18天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
19天前
|
测试技术 持续交付 数据安全/隐私保护
软件测试的艺术与科学:探索自动化测试框架
在软件开发的世界中,测试是确保产品质量的关键环节。本文将深入探讨自动化测试框架的重要性和实现方法,旨在为读者揭示如何通过自动化测试提升软件测试效率和准确性。我们将从测试的基本概念出发,逐步引导读者了解自动化测试框架的设计和实施过程,以及如何选择合适的工具来支持测试活动。文章不仅提供理论知识,还将分享实用的代码示例,帮助读者将理论应用于实践。无论你是测试新手还是经验丰富的开发者,这篇文章都将为你打开一扇通往更高效、更可靠软件测试的大门。
19 1
下一篇
DataWorks