Descubra flocos executando novos testes muitas vezes

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.jsondeve 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"