A suíte de specs deste app, cronometrada, roda num processo só
Os números, medidos
$ bundle exec rspec spec/
...
Finished in 1 minute 19.03 seconds (files took 2.87 seconds to load)
Essa é a suíte de specs deste app, rodada para este curso: 205 arquivos de spec e 1.219 exemplos. O RSpec mostra 1 minuto e 19,03 segundos de execução. Carregar os arquivos antes, com require de cada spec, factory e arquivo de suporte antes de qualquer exemplo rodar, levou mais 2,87 segundos. Todo número deste curso vem de rodar a suíte, e não de uma estimativa geral de quanto um app deste tamanho costuma levar.
Um processo, do começo ao fim
O bundle exec rspec spec/ sobe um processo Ruby, carrega o Rails uma vez e conecta a um banco. Depois roda todo exemplo nesse processo, um depois do outro, na ordem que a configuração de ordem de testes do RSpec escolhe. Nenhuma flag nesse comando, nenhuma linha em spec/spec_helper.rb ou spec/rails_helper.rb e nenhuma variável de ambiente divide esse trabalho em mais de um processo. As próximas seis aulas seguem a pergunta que isso levanta: mais de um processo deixaria isso mais rápido, e este app tem as peças para tentar?
O CI deste app não roda a suíte
O .github/workflows/ci.yml define três jobs: scan_ruby (roda bin/brakeman), scan_js (roda bin/importmap audit) e lint (roda bin/rubocop). Lido linha a linha, nas 63 linhas, o arquivo não tem job que rode bundle exec rspec. A suíte só roda onde um desenvolvedor a roda à mão; ela não faz parte das checagens automáticas dos pull requests deste repositório. Vale dizer isso antes de seguir. A pergunta "isso deveria rodar em paralelo" fica ao lado de outra, "onde isso roda", e este curso cobre só a primeira.
Nenhum dos dois mecanismos de teste em paralelo está configurado aqui
$ grep -rn "parallelize\\|parallel_tests\\|PARALLEL_WORKERS" spec/ config/ Gemfile
# (nenhuma saída)
Nada volta. Existem duas respostas diferentes para "rodar meus testes em paralelo" no mundo Rails. Uma é embutida no ActiveSupport::TestCase para o Minitest, e a outra é uma gem separada da comunidade para o RSpec. Este app não usa nenhuma.
O que este curso cobre
Sete aulas, com cada número e cada trecho de código checado contra o Rails 8.1.3.1 instalado neste app e o repositório dele. A aula 2 trata do ActiveSupport::TestCase.parallelize do Minitest, e de por que este app RSpec não pode usá-lo. A aula 3 trata da resposta do RSpec, a gem separada parallel_tests, a partir do README dela. A aula 4 trata de como essa gem decide que arquivos de spec vão para qual processo. A aula 5 trata da convenção de vários bancos de que as execuções em paralelo dela dependem, checada contra o config/database.yml deste app. A aula 6 dá uma resposta baseada em números sobre paralelizar uma suíte deste tamanho valer a pena. A aula 7 fecha com um pequeno desafio em Ruby puro que simula a mesma ideia de balanceamento de carga em miniatura.
Continue com a aula 2
O parallelize embutido do Minitest: instalado, mas sem nada para rodar aqui
Lê o código do parallelize do Minitest, seus modos de processo e thread, o limite de 50 testes e por que não serve aqui.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.