PlanetScale 将开源 Vitess 测试套件从 Python 迁移到 Go
在过去的三个季度里,PlanetScale 团队专注于实现两个目标:让开源的 Vitess 更易于使用,同时更易于贡献。其中一项工作是将所有使用 Python 编写的集成测试迁移到 Go。
这项迁移的主要原因包括:
- 使用 Python 编写和调试测试非常耗时。
- 使用 Python 测试增加了额外的安装依赖,对于新加入的贡献者而言,这是一种负担。
- 所使用的 Python 版本(2.7)支持已经于 2020 年 1 月 1 日终止。
这是一项相当庞大的工程,需要数名开发者投入接近四个月的时间。项目于 2019 年 11 月 1 日开始,2020 年 2 月 25 日完成。在这个迁移过程中,共需要迁移 39 个文件中的 197 个独立的集成测试,总计超过 24,000 行 Python 代码。
为了实现迁移,我们首先用 Go 构建了一个测试框架(基于 command
和 testing
包),该框架支持启动一个 Vitess 集群并以编程方式与之交互。这个框架需要满足以下需求:支持多个测试并行运行且无端口冲突;为所有相关进程创建无冲突的工作目录;记录足够的信息以便诊断失败原因等。完成框架开发后,这个工作便集中于将 Python 测试翻译成等效的 Go 代码。
在迁移的过程中,我们还改进了 Vitess 的 CI(持续集成)流水线。虽然 Travis CI 多年来一直为我们提供良好的服务,但我们看到了切换至 GitHub Actions 的机会,其优势包括:
- 更大的计算能力和内存实例类型:虽然 Travis CI(以及 Circle CI 等其他服务)会在付费计划中提供更大实例,但我们希望保持在免费层级,以便贡献者能够使用与核心项目同样的技术和体验。对于 Vitess 来说,使用更大的实例至关重要,因为测试套件可能需要启动 6 个或更多的
mysqld
实例。 - 不再受限于最多 5 个并发任务:我们之前使用 Travis CI 的矩阵构建来应对测试时间过长的问题,将 2 小时 30 分钟的测试分成 5 个“分片”,每个分片约 30 分钟。结果,我们实际上只能运行一个并发任务。在高峰期,这甚至可能导致测试结果延迟一小时或更长时间。而我们的新的 GitHub Actions 配置仍然使用分片,但现在有超过 14 个分片。同时,其他开发者同时运行 CI 任务时也不会再阻塞我们的测试任务。
最终,项目的成果显著:开发新的集成测试变得更加容易和快速,初学者也能更轻松地加入项目。CI 流程的优化让我们能够更快地在 pull request 中获得反馈,提高了提交请求的处理效率。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:http://www.choupangxia.com/2025/05/17/planetscale-vitess-python-go/