Help us learn about your current experience with the documentation. Take the survey.

快速失败测试

  • 版本:Premium, Ultimate
  • 产品:GitLab.com, GitLab Self-Managed, GitLab Dedicated

对于使用 RSpec 运行测试的应用程序,我们引入了 Verify/Failfast 模板,它会根据您的合并请求中的变更来运行测试套件的子集。

该模板使用了 test_file_finder (tff) gem,它接受一个文件列表作为输入,并返回一个与输入文件相关的规范(测试)文件列表。

tff 专为 Ruby on Rails 项目设计,因此 Verify/FailFast 模板被配置为在检测到 Ruby 文件变更时运行。默认情况下,它会在 GitLab CI/CD 流水线的 .pre 阶段 运行,即所有其他阶段之前。

使用场景示例

当您为项目添加新功能和新的自动化测试时,快速失败测试就非常有用。

您的项目可能有数十万个测试,需要很长时间才能完成。您可能期望新的测试能够通过,但必须等待所有测试完成才能验证。即使使用了并行处理,这也可能需要一个多小时。

快速失败测试为您提供了来自流水线的更快的反馈循环。它能让您快速知道新测试是否通过,以及新功能是否破坏了其他测试。

先决条件

此模板需要:

  • 一个使用 Rails 构建、并采用 RSpec 进行测试的项目。
  • CI/CD 配置为:
  • 在项目设置中启用合并结果流水线
  • 一个包含 Ruby 的 Docker 镜像。该模板默认使用 image: ruby:2.6,但您可以覆盖此设置。

配置 RSpec 快速失败

我们使用以下基础的 RSpec 配置作为起点。它仅在合并请求流水线中安装所有项目 gems 并执行 rspec

rspec-complete:
  stage: test
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - bundle install
    - bundle exec rspec

要优先运行最相关的规范而不是整个测试套件,请将以下内容添加到您的 CI/CD 配置中,以 include 该模板:

include:
  - template: Verify/FailFast.gitlab-ci.yml

要自定义此作业,可以设置特定选项来覆盖模板。例如,要覆盖默认的 Docker 镜像:

include:
  - template: Verify/FailFast.gitlab-ci.yml

rspec-rails-modified-path-specs:
  image: custom-docker-image-with-ruby

测试负载示例

为了便于说明,假设我们的 Rails 应用规范套件包含十个模型,每个模型有 100 个规范。

如果没有 Ruby 文件被更改:

  • rspec-rails-modified-paths-specs 不会运行任何测试。
  • rspec-complete 会运行全部 1000 个测试。

如果一个 Ruby 模型被更改,例如 app/models/example.rb,那么 rspec-rails-modified-paths-specs 将运行 example.rb 的 100 个测试:

  • 如果这 100 个测试全部通过,那么完整的 rspec-complete 套件(1000 个测试)将被允许运行。
  • 如果这 100 个测试中有任何一个失败,它会快速失败,并且 rspec-complete 不会运行任何测试。

最后一种情况节省了资源和时间,因为完整的 1000 个测试套件没有运行。