并行运行测试

您的项目的测试越多,它们将在一台机器上完成越长。要减少此时间,您可以通过在多个单独的执行器中传播它们来并行运行测试。这需要指定并行级别来定义有多少单独的执行器获取测试作业。然后,您可以使用Circleci CLI拆分测试文件,或使用环境变量单独配置每个并行机器。

指定作业的并行级别

测试套件通常定义工作水平在你的.circleci / config.yml.文件。这并行密钥指定将设置有多少独立执行器以运行作业的步骤。

要并行运行工作步骤,请设置并行键超过1。

#〜/ .circleci / config.yml版本2工作测试Docker.-图片Circleci / <语言>:<版本标签>验证用户名mydockerhub-user.密码$ dockerhub_password.#上下文/项目UI ENV-VAR参考并行4.

并行

有关更多信息,请参阅配置Circleci.文档。

使用Circleci CLI进行分割测试

Circleci支持整个容器的自动测试分配。分配是基于文件名或类名,具体取决于您使用的测试跑者的要求。它需要Circleci CLI,在运行时自动注入您的构建。

要在本地安装CLI,请参阅使用circleci本地cli文档。

拆分测试文件

CLI在运行并行作业时支持跨机器的拆分测试。这是通过传递任何文件或类名的列表,以任何测试运行者在命令行中需要哪个Circleci测试拆分命令。

globbing测试文件

要帮助定义测试套件,CLI使用以下模式支持Globbing测试文件:

  • *匹配任何字符序列(不包括路径分隔符)
  • **匹配任何字符序列(包括路径分隔符)
  • 匹配任何单个字符(不包括路径分隔符)
  • [ABC]将任何字符(不包括路径分隔符)与括号中的字符匹配
  • {foo,bar,...}匹配一系列字符,如果括号中的任何替代方案匹配

到Glob测试文件,将一个或多个模式传递给Circleci测试球命令。

Circleci测试Glob“测试/单位/ *。Java”“测试/功能/ *。Java”

要检查模式匹配的结果,请使用回声命令。

#〜/ .circleci / config.yml版本2工作测试Docker.-图片Circleci / <语言>:<版本标签>验证用户名mydockerhub-user.密码$ dockerhub_password.#上下文/项目UI ENV-VAR参考并行4.脚步-命令|Echo $(Circleci Tests Glob“Foo / ** / *”“Bar / ** / *”)Circleci Tests Glob“foo / ** / *”“bar / ** / *”|xargs-n 1回声

通过定时数据分离

优化跨一组并行执行器的测试套件的最佳方法是使用定时数据来分割测试。这将确保测试以最均匀的方式分开,导致总体测试时间较短。

测试分裂

在每次成功运行测试套件时,Circleci会从路径指定的目录中保存时间数据store_test_results.步。此时序数据包括每个测试完成每个文件名或ClassName的时间长度,具体取决于您使用的语言。

注意:如果您不使用store_test_results.,不会有用于拆分测试的时间数据。

通过测试时间来拆分,使用- 逐个国旗与之超时分裂类型。然后将分析可用的定时数据,并且您的测试将尽可能均匀地拆分并联运行的容器,导致最快的测试运行时间

Circleci测试Glob“** / * Go”|Circleci测试拆分 - 逐个=时间

CLI期望在测试套件产生的时序数据中存在文件名和ClassNames。默认情况下,将默认值拆分为文件名,但您可以使用该文件指定ClassNames- 定义型旗帜。

cat my_java_test_classnames |circleci测试拆分 - 逐个=时间 -  timings-type = classname

如果您需要手动存储和检索时序数据,请使用Store_Arifacts.步。

按名称分裂

默认情况下,如果未使用使用方法- 逐个旗帜,Circleci测试拆分预计文件名/ ClassNames列表并按测试名称按字母顺序拆分测试。有几种方法可以提供此列表:

使用测试文件名创建文本文件。

Circleci测试拆分test_filenames.txt

提供测试文件的路径。

Circleci测试拆分

或管道的测试文件。

Circleci Tests Glob“测试/ ** / *。java”|Circleci测试拆分

CLI查找可用容器的数量以及当前的容器索引。然后,它使用确定性分裂算法来跨所有可用容器拆分测试文件。

默认情况下,容器的数量由并行钥匙。您可以使用使用手动设置此操作- 全部的旗帜。

Circleci测试拆分--total = 4 test_filenames.txt

同样,当前的容器索引从环境变量自动拾取,但可以通过使用手动设置- 指数旗帜。

Circleci测试拆分--index = 0 test_filenames.txt

拆分文件大小

当提供FilePaths时,CLI也可以通过FILESIZE拆分。为此,使用- 逐个国旗与之文件大小分裂类型。

Circleci测试Glob“** / * Go”|Circleci测试拆分 - 逐个文件

使用环境变量来分割测试

为了完全控制并行性,Circleci提供了两个环境变量,您可以使用代替CLI来单独配置每个容器。circle_node_total.是用来运行工作的平行容器的总数,以及circle_node_index.是当前正在运行的特定容器的索引。看看内置环境变量文档更多细节。

运行分割测试

Globbing和Splitting测试实际上并没有运行您的测试。要将测试分组与测试执行组合,请考虑将分组的测试保存到文件,然后将此文件传递给测试赛道。

Circleci测试球“测试/ ** / *。rb”|Circleci测试分裂>/ tmp / tests-to-run捆绑包exc.rspec.$(/ tmp / tests-to-run

文件的内容/ tmp / tests-to-run基于的每个容器中都会有所不同$ cifite_node_index.$ cifite_node_total.

视频:出发故障排除

也可以看看

使用容器

分割测试的其他方法

一些第三方应用程序和库可能会帮助您分割测试套件。Circleci未开发或支持这些应用程序。如果您使用Circleci遇到问题,请咨询所有者。如果您无法解决您可以在我们的论坛上搜索和询问的问题,讨论

  • 背包专业- 使得能够在并行CI节点上动态分配测试,允许您的测试套件退出以更快地运行。看CI构建时间图示例

  • phpunit-finder.- 这是查询的帮助器CLI工具phpunit.xml.文件以获取测试文件名列表并打印它们。如果要将测试拆分测试以基于CI工具的时间,则这是有用的。
  • 去列表- 使用内置Go命令去列表。/ ...到Glob Golang套餐。这允许跨多个容器拆分包测试。
    GO TEST -V $(GO列表。/ ... | CIRCLECI测试分裂)