Os testes que só às vezes são bem-sucedidos são um grande incômodo:
– Eles podem fazer com que os desenvolvedores executem novamente seu build repetidamente, tentando torná-lo verde, custando dinheiro real à sua empresa.
– Eles podem mascarar problemas reais – talvez um teste esteja falhando esporadicamente onde não estava antes porque há um novo bug?
– Pior ainda, como qualquer bug, eles são realmente difíceis de corrigir após o fato .
A melhor maneira de matar os flocos é não os deixando acontecer. Executando novos testes em PRs várias vezes para ver se eles falham pelo menos uma vez.
O código
Veja como você pode fazer isso:
# flake_discoverer.rb
module FlakeDiscoverer
# This file should be generated on CI, with a command such like
# `bundle exec rspec --format json --dry-run --tag ~skip > spec/master_tests.json`
# on master branch
def self.known_test_descriptions
@known_test_descriptions ||= begin
data = JSON.parse(File.open('spec/master_tests.json').read)
data.fetch('examples').map { |row| row['full_description'] }.to_set
end
end
def self.run_new_test_multiple_times?(example)
!known_test_descriptions.include?(example.full_description)
end
end
# rails_helper.rb
config.around :each do |ex|
if FlakeDiscoverer.run_new_test_multiple_times?(ex) && ENV['CI'].present?
puts("New test, running 50 times: #{ex.full_description}")
50.times { ex.run }
else
ex.run
end
end
Para fazer isso funcionar, spec/master_tests.json
deve ser gerado antes que os testes sejam executados no CI.
Integrando no CircleCI
Para integrar isso ao CircleCI, você pode adicionar esta etapa antes de seus testes em .circleci/config.yml
- run:
name: Gather known tests
command: |
git checkout origin/master
bundle exec rspec --format json --dry-run --tag ~skip > spec/master_tests.json
git checkout "$CIRCLE_SHA1"