生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

Yelp 是如何实现每天运行数百万个测试的

  • 2017-05-08
  • 本文字数:2971 字

    阅读完需:约 10 分钟

Yelp 每天要运行数百万个测试,确保开发人员提交的代码不会对已有的功能造成破坏。如此巨大规模的测试,他们是怎么做到的呢?以下内容翻译自 Yelp 的技术博客,并已获得翻译授权,查看原文 How Yelp Runs Millions of Tests Every Day

开发速度对于一个公司的成败来说是至关重要的。我们总是通过减少测试、部署和监控变更的时间来提升开发效率。为了让开发者能够安全地提交代码,我们每天通过内部的分布式系统 Seagull 运行了超过数百万个测试。

Seagull 是什么?

Seagull 是一个具备容错能力和弹性的分布式系统,我们用它来并行执行我们的测试套件。我们使用了如下技术来构建 Seagull 。

挑战

在将我们的单体 Web 应用 yelp-main 的新代码部署到生产环境之前,Yelp 的开发人员针对 yelp-main 的特定版本运行了整个测试套件。开发人员通过触发 seagull-run 作业来运行测试,这个作业将会在我们的集群上安排调度以便运行测试用例。这里需要考虑两方面的因素。

  • 性能:每一个 seagull-run 作业都有将近 10 万个测试用例,如果逐个运行它们需要差不多 2 天的时间
  • 规模:一般情况下,每天会有超过 300 个 seagull-run 作业被触发,高峰期有 30 到 40 个作业并行运行。

我们所面临的挑战是如何在分钟级别运行每一个 seagull-run 作业,而不是按天来运行,同时还能保持较低的成本。

Seagull 的工作原理

首先,开发人员在控制台触发 seagull-run,它会启动一个 Jenkins 作业,用于编译代码,并生成测试清单。这些测试清单被组合在一起,传递给一个调度器,调度器将会在 Seagull 集群上执行测试。最后,测试结果被保存到 Elasticsearch 和 S3 上。

1. 一个开发人员为某个版本的代码(基于 git 某个分支的 SHA 值)触发了一个 seagull-job,我们假设 git 分支的名字叫作 test_branch。

2. 为 test_branch 生成代码包和测试清单,并上传到 S3 上。

3.Bin Packer 获取测试清单和测试历史时间元数据,用于创建多个包含了测试用例的 bundle。如何进行有效的 bundle 其实是一个装箱问题,我么使用了如下两种算法来解决这个问题。至于使用哪一种算法,由开发人员传给 Seagull 的参数来决定。

  • 贪婪算法( Greedy Algorithm ):测试用例先是按照它们的历史测试时长来排序,然后我们开始按照 10 分钟的工作量(测试用例)来填充 bundle。

  • 线性编程( Linear Programming ):如果出现了测试依赖,一个测试需要与同一个 bundle 里的另一个测试一起运行。对于这种情况,我们将会使用线性编程。线性编程方程式的目标函数和约束定义如下。

    1. 目标函数:最小化生成 bundle 的数量

    2. 主要的约束

      • 单个 bundle 的运行时长不超过 10 分钟
      • 每个测试只能存在于一个 bundle 里
      • 具有依赖关系的测试需要被放在同一个 bundle 里

我们使用了 Pulp 来解开这个方程式。

复制代码
# 目标函数:
problem = LpProblem('Minimize bundles', LpMinimize)
problem += lpSum([bundle[i] for i in range(max_bundles)]), 'Objective: Minimize bundles'
# 其中的一个约束:
for i in range(max_bundles):
sum_of_test_durations = 0
for test in all_tests:
sum_of_test_durations += test_bundle[test, i] * test_durations[test]
problem += (sum_of_test_durations) <= bundle_max_duration * bundle[i], ''

在这里,bundle 和 test_bundle 是 LpVariable 类型,max_bundles 和 bundle_max_duration 是整数。

一般情况下,我们会在线性编程约束里考虑测试用例的 setup 和 teardown 时长,不过为了简单起见,我们在这里把它们忽略了。

4. 在 Jenkins 服务器上启动一个调度器进程,它将会获取 bundle,然后启动一个 mesos 框架。我们为每一个 seagull-run 创建一个新的调度器。每次运行会生成 300 多个 bundle,每个 bundle 大概需要 10 分钟的运行时间。调度器为每一个 bundle 创建了一个 mesos 执行器,并被安排在 Seagull 集群上执行,只要 Mesos Master 能够提供可用的资源。

5. 在执行器被安排到集群上之后,执行器内部将执行如下几个步骤。

每个执行器启动一个沙箱,并从 S3 上下载软件包(它们是在第二步时上传到 S3 上的)。测试服务所依赖的 Docker 镜像被下载下来,用于启动 docker 容器(也就是服务)。在所有的容器都运行起来之后,开始执行测试。最后,测试结果和元数据被保存到 Elasticsearch(ES)和 S3 上。我们使用了内部的代理服务 Apollo 将数据写到 ES 上。

如果你处在一个分布式环境里,那么遭遇主机崩溃是一件不可避免的事情。不过,Seagull 具有容错能力。

例如,假设一个调度器需要调度两个 bundle。Mesos 将代理(A1)的资源分配给调度器。假设调度器认为已经分配到足够的资源,那么两个 bundle 就会被安排在 A1 上。A1 因为某些原因发生崩溃,那么 Mesos 会让调度器知道 A1 已经崩溃了。调度器的任务管理器决定进行重试,或者直接取消任务。如果进行了重试,当 Mesos 提供了足够的资源时(比如 A2),那么 bundle 就会重新被安排执行。如果任务被取消,调度器会将这些 bundle 的测试用例标记为未执行。

6.Seagull UI 通过 Apollo 从 ES 上获取测试结果,并将它们加载到一个 UI 上,让开发人员可以看到结果。如果测试通过,就可以进行部署!

我们所谈论的规模是多大?

我们每天有 300 多个 seagull-run,高峰期每小时有 30 到 40 个。它们为此每天启动超过 200 万个 Docker 镜像。为了应付这些场景,我们的 Seagull 集群在高峰期需要差不多 1 万个 CPU 核心。

这种规模所带来的挑战

为了保持测试套件的及时性,特别是在高峰时期,我们需要确保 Seagull 集群里有数百个可用的实例。我们曾经使用过 AWS ASG AWS On-Demand 实例,不过它们对于我们来说太昂贵了。

为了降低成本,我们开始使用一个叫作 FleetMiser 的内部工具来维护 Seagull 集群。FleetMiser 是一个自动扩展引擎,我们用它基于一些信号来扩展集群,比如当前集群的使用情况、管道里运行的工作负荷数量,等等。它有两个主要的组件。

  • AWS Spot Fleet :AWS 的 Spot 实例比 On-Demand 实例要便宜,Spot Fleet 为使用 Spot 实例提供了简单易用的接口。
  • 自动伸缩:我们对集群的使用是动态变化的,主要集中在太平洋时间 10:00 到 19:00,开发人员的主要工作都集中在这段时间。为了能够自动伸缩,FleetMiser 使用了集群的当前和历史数据。每天,Seagull 集群在 1500 个 CPU 核心到 10000 个 CPU 核心之间伸缩。

自动伸缩:几周前的容量数据

FleetMiser 为我们节省了 80% 的集群成本。而在那之前,我们的集群部署在 AWS On-Demand 实例上,无法进行自动伸缩。

我们已经达成了什么样的目标?

Seagull 将测试结果的时间从 2 天降低到 30 分钟,而且减少了大量的运行成本。我们的开发人员能够自信地提交代码,无需等待数个小时甚至数天来验证他们提交的变更没有造成任何破坏。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2017-05-08 19:001340
用户头像

发布了 322 篇内容, 共 134.0 次阅读, 收获喜欢 144 次。

关注

评论

发布
暂无评论
发现更多内容

利用淘宝/天猫API实现商品数据的实时获取、处理与分析

Noah

Tiktok云手机养号教程,教你少走弯路

Ogcloud

云服务 TikTok 云服务商

MoE模型性能还能更上一层楼?一次QLoRA微调实践

Baihai IDP

人工智能 自然语言处理 程序员 AI MoE

提升跨境电商独立站用户体验的实用指南!

九凌网络

Mac实用软件推荐:FAF简单实用的磁盘文件搜索工具

南屿

磁盘管理 Mac软件 Find Any File 本地文件查找工具

专为 Mac 用户设计的蓝光播放器:Aiseesoft Blu-ray Player

南屿

苹果软件下载 Mac蓝光播放软件 Aiseesoft Blu-ray Player

多媒体影音库Emby for Mac使用教程

南屿

emby破解版 emby使用教程 Mac多媒体影音库

聚道云软件连接器助力某电商企业实现电商业务与财务系统的数据互通

聚道云软件连接器

案例分享

通义千问Qwen-72B-Chat大模型在PAI平台的微调实践

阿里云大数据AI技术

OpenHarmony社区运营报告(2023年12月)

OpenHarmony开发者

OpenHarmony

面试官:禁用Cookie后Session还能用吗?

王磊

Java 面试

常见的几种限流方案以及相关算法

想要飞的猪

海外云手机:一机多用,引领跨境电商新潮流

Ogcloud

网络 云服务 云服务商

软件测试/测试开发/全日制/测试管理丨Python深拷贝与浅拷贝

测试人

软件测试

SD-WAN对企业网络升级的价值

Ogcloud

网络 SD-WAN 组网 组网网络

软件测试/测试开发/全日制/测试管理丨Pytest 框架介绍与优势

测试人

Python 软件测试

SourceTree for Mac(Git客户端工具)v4.1.5中文免登陆版 兼容M1

南屿

Mac软件 Git客户端 SourceTree Mac Sourcetree 激活补丁 Sourcetree 中文版

跟弱口令说“拜拜”

尚思卓越

数据安全 弱口令

ArcNeural: AI 时代的多模数据库丨技术专栏

Fabarta

人工智能 AI 大模型 多模态数据 AI基础设施

软件测试/测试开发/全日制/测试管理丨Python 特点与应用

测试人

关于程序员技术方面的一些思考

伤感汤姆布利柏

WebGL+H5 智慧充电站3D可视化运维平台

2D3D前端可视化开发

物联网 数字孪生 三维可视化 智慧充电站 智慧充电桩

RAG:让大语言模型拥有特定的专属知识

博文视点Broadview

链上数据分析:解读加密生态的秘密武器

Footprint Analytics

区块链 加密货币

聚道云软件连接器助力某家居公司实现付款流程自动化

聚道云软件连接器

案例分享

软件测试/测试开发/全日制/测试管理丨Python关键字

测试人

软件测试

JNPF低代码是什么,怎么样?

这我可不懂

软件开发 低代码 JNPF

iOS 应用上架指南:资料填写及提交审核

雪奈椰子

MacOS专用防火墙Paragon Firewall可有效监视控制网络接入

南屿

防火墙 mac软件下载 Paragon防火墙

2024年远控软件年度盘点:安全、稳定、功能之选

不叫猫先生

远程办公 远控软件

Xcode 15 for Mac(开发工具) v15.2正式版

iMac小白

Yelp是如何实现每天运行数百万个测试的_语言 & 开发_Chunky G._InfoQ精选文章