{{< details >}}
- Tier: 专业版, 旗舰版
- Offering: JihuLab.com, 私有化部署
{{< /details >}}
对于使用 RSpec 进行测试的应用程序,我们引入了 Verify/Failfast
模板来运行测试套件的子集,基于合并请求中的更改。该模板使用了 test_file_finder
(tff
) gem,接受文件列表作为输入,并返回与输入文件相关的 spec(测试)文件列表。tff
专为 Ruby on Rails 项目设计,因此 Verify/FailFast
模板配置为在检测到 Ruby 文件更改时运行。默认情况下,它在极狐GitLab CI/CD 流水线的 .pre
阶段 运行,在所有其他阶段之前。
示例用例
当向项目添加新功能并添加新的自动化测试时,快速失败测试非常有用。您的项目可能有成千上万的测试需要很长时间才能完成。您可能期望新的测试通过,但必须等待所有测试完成以验证它。即使使用并行化,这可能需要一个小时或更长时间。快速失败测试为您提供了来自流水线的更快反馈循环。它让您快速知道新测试通过了,并且新功能没有破坏其他测试。
先决条件
该模板需要:
- 一个使用 RSpec 进行测试的 Rails 项目。
- CI/CD 配置为:
- 使用可用的 Ruby 的 Docker 镜像。
- 使用 合并请求流水线
- 在项目设置中启用 合并结果流水线。
- 一个可用的 Ruby 的 Docker 镜像。模板默认使用
image: ruby:2.6
,但您可以覆盖它。
配置快速 RSpec 失败
我们使用以下简单 RSpec 配置作为起点。它安装所有项目 gem 并仅在合并请求流水线上执行 rspec
。
rspec-complete:
stage: test
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- bundle install
- bundle exec rspec
要首先运行最相关的 spec 而不是整个套件,请通过在您的 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 应用程序 spec 套件由每个模型 100 个 spec 组成的情况,如果没有 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 个测试套件没有运行。