150 6005 0030

行业资讯

使用 AWS CodeBuild 加速 CI:现已提供并行测试执行

发布时间:2025-03-28 浏览量:543

我很高兴地宣布AWS CodeBuild现在支持并行测试执行,因此您可以同时运行测试套件并显著减少构建时间。

使我为本文编写的演示项目,总测试时间从 35 分钟缩短至 6 分钟,其中包括配置环境的时间。AWS管理控制台这两个屏幕截图显示了差异。

测试套件的顺序执行

CodeBuild 并行测试结果

测试套件的并行执行

CodeBuild 并行测试结果

运行大规模持续集成(CI)时,非常长的测试时间会带来巨大挑战。随着项目复杂性和团队规模的增长,执行全面测试套件所需的时间会大幅增加,从而导致管道执行时间延长。这不仅会延迟新功能和错误修复的交付,还会妨碍开发人员的工作效率,因为他们必须等待构建结果才能继续执行任务。我曾遇到过需要长达 60 分钟才能运行的管道,结果在最后一步失败,需要完全重新运行并进一步延迟。这些漫长的周期会削弱开发人员对 CI 流程的信任,导致挫败感,并最终减慢整个软件交付周期。此外,长时间运行的测试可能会导致资源争用、因计算能力浪费而增加成本以及降低开发流程的整体效率。

借助 CodeBuild 中的并行测试执行功能,您现在可以在多个构建计算环境中同时运行测试。此功能实施了一种分片方法,其中每个构建节点独立执行测试套件的子集。CodeBuild 提供环境变量来标识当前节点号和节点总数,这些变量用于确定每个节点应运行哪些测试。构建时没有控制构建节点或节点之间的协调 - 每个节点独立运行以执行其分配的测试部分。

要启用测试拆分,请在您的 中配置批处理扇出buildspec.xml部分,指定所需的并行度和其他相关参数。此外,在构建步骤中使用codebuild-tests-run实用程序,以及适当的测试命令和所选的拆分方法。

测试根据您指定的分片策略进行拆分。codebuild-tests-run提供两种分片策略:

  • 均等分布。此策略按字母顺序对测试文件进行排序,并将它们以块的形式均匀分布在并行测试环境中。测试文件的名称或数量发生变化可能会在分片之间重新分配文件。

  • 稳定性。此策略使用一致性哈希算法来修复分片中的测试分布。当添加或删除新文件时,它会维护现有的文件到分片的分配。

CodeBuild 支持在并行运行测试时自动合并测试报告。借助自动测试报告合并功能,CodeBuild 可将测试报告合并为单个测试摘要,从而简化结果分析。合并后的报告包括汇总的通过/失败状态、测试持续时间和失败详细信息,从而减少了手动处理报告的需要。您可以在CodeBuild控制台中查看合并后的结果,使用AWS命令行界面(AWS CLI)检索它们,或将它们与其他报告工具集成以简化测试分析。

让我们看看它是如何工作的
让我来演示如何在项目中实现并行测试。为了演示,我创建了一个包含数百个测试的非常基本的Python项目。为了加快速度,我在命令行上要求 Amzaon Q Developer创建一个项目和 1,800 个测试用例。每个测试用例都在一个单独的文件中,需要一秒钟才能完成。按顺序运行所有测试需要 30 分钟,不包括配置环境的时间。

在这个演示中,我在十个计算环境中并行运行测试套件,并测量运行该套件所需的时间。

为此,我buildspec.yml向我的项目添加了一个文件。

version: 0.2batch:
  fast-fail: false
  build-fanout:
    parallelism: 10 # ten runtime environments 
    ignore-failure: falsephases:
  install:
    commands:
      - echo 'Installing Python dependencies'      - dnf install -y python3 python3-pip      - pip3 install --upgrade pip      - pip3 install pytest  build:
    commands:
      - echo 'Running Python Tests'      - |
         codebuild-tests-run 
          --test-command 'python -m pytest --junitxml=report/test_report.xml' 
          --files-search "codebuild-glob-search 'tests/test_*.py'" 
          --sharding-strategy 'equal-distribution'
  post_build:
    commands:
      - echo "Test execution completed"reports:
  pytest_reports:
    files:
      - "*.xml"
    base-directory: "report"
    file-format: JUNITXML

YAML

YAML 文件中有三个部分需要突出显示。

首先,在 下有一个build-fanout部分batch。该parallelism命令告诉 CodeBuild 并行运行多少个测试环境。该ignore-failure命令指示是否可以忽略任何扇出构建任务中的失败。

其次,我使用预先安装的codebuild-tests-run命令来运行我的测试。

该命令接收测试文件的完整列表并决定必须在当前节点上运行哪些测试。

  • 使用该sharding-strategy参数在均匀分布或稳定分布之间进行选择,正如我之前所解释的那样。

  • 使用files-search参数传递所有适合运行的文件。codebuild-glob-search出于性能原因,我们建议使用提供的命令,但任何文件搜索工具(例如find(1))都可以使用。

  • 我传递了带有参数的实际测试命令在分片上运行test-command

最后,该reports部分指示 CodeBuild 收集并合并每个节点上的测试报告。

然后,我打开 CodeBuild 控制台创建一个项目,并为该项目创建一个批量构建配置。这里没有什么新东西,所以我就不多说了。文档中包含了所有入门细节。  并行测试适用于批量构建。请确保将您的项目配置为批量运行

CodeBuild:创建批量构建

现在,我已准备好触发测试套件的执行。我可以在我的 GitHub 存储库上提交新代码,也可以在控制台中触发构建。

CodeBuild:触发新构建

几分钟后,我看到了构建的不同步骤的状态报告;其中包含每个测试环境或分片的状态。

CodeBuild:状态

测试完成后,我选择“报告”选项卡来访问合并的测试报告。

CodeBuild:测试报告

报告部分汇总了所有分片的所有测试数据,并保留了所有构建的历史记录。我在报告历史记录部分中选择了最近的构建,访问详细报告。

CodeBuild:测试报告

正如预期的那样,我可以看到 1,800 个测试用例的汇总状态和单独状态。在此演示中,它们全部通过,报告为绿色。

演示项目的 1,800 个测试每个需要一秒钟才能完成。当我按顺序运行此测试套件时,需要 35 分钟才能完成。当我在十个计算环境中并行运行测试套件时,需要 6 分钟才能完成,其中包括配置环境的时间。并行运行占用了顺序运行时间的 17.9%。实际数字将因您的项目而异。

其他须知事项
此新功能与所有测试框架兼容。文档包括Django、Elixir、Go、Java (Maven)、Javascript (Jest)、Kotlin、PHPUnit、Pytest、Ruby (Cucumber) 和 Ruby (RSpec) 的示例。

对于不接受空格分隔列表的测试框架,CLI codebuild-tests-run 通过环境变量提供了一种灵活的替代方案CODEBUILD_CURRENT_SHARD_FILES。此变量包含当前构建分片的测试文件路径的换行符分隔列表。您可以使用它来适应不同的测试框架要求和格式化测试文件名。

您可以通过编写自己的分片脚本并使用环境变量(每次构建时都会自动设置)来进一步自定义测试在各个环境中的拆分方式CODEBUILD_BATCH_BUILD_IDENTIFIER。您可以使用此技术实现特定于框架的并行化或优化。

定价和可用性通过并行测试执行,您现在可以在以前所需时间的一小部分内完成测试套件,从而加快开发周期并提高团队的工作效率。

CodeBuild 提供的所有三种计算模式均可并行执行测试:按需、预留容量和AWS Lambda计算。

目前,所有提供 CodeBuild 的 AWS 区域均已开放此功能,除 所使用的计算资源的标准 CodeBuild 定价外,无需支付其他费用。

我邀请您立即尝试在 CodeBuild 中执行并行测试。访问 AWS CodeBuild 文档以了解更多信息并开始并行化您的测试。

EN

微信

QQ

联系QQ

电话咨询

×