Por que o RSpec é tão lento no Rails?
-
09-06-2019 - |
Pergunta
Sempre que executo testes rspec para meu aplicativo Rails, leva uma eternidade e um dia de sobrecarga antes que ele realmente comece a executar os testes.Por que o rspec é tão lento?Existe uma maneira de acelerar o carregamento inicial do Rails ou destacar a parte do meu aplicativo Rails que preciso (por exemplo,Somente material do ActiveRecord) para que ele não carregue absolutamente tudo para executar alguns testes?
Solução
Você deve ser capaz de acelerar seu script/spec
chamadas executando script/spec_server
em uma janela de terminal separada e, em seguida, adicionando o adicional -X
parâmetro para suas chamadas de especificação.
Outras dicas
Definitivamente, sugiro dar uma olhada no spork.
O railstutorial aborda especificamente isso e fornece uma solução alternativa para fazer o spork funcionar bem no Rails 3.0 (no momento, o spork não está pronto para o Rails 3).Claro, se você não está no Rails 3.0, então você deve estar pronto.
A parte do tutorial que mostra como fazer o spork rodar no Rails 3.0
http://railstutorial.org/chapters/static-pages#sec:spork
Verificando quando o spork está pronto para o Rails 3.0
Por que o rspec é tão lento? porque carrega todo o ambiente, carrega equipamentos e todo aquele jazz.
Existe uma maneira de acelerar o carregamento inicial do Rails você pode tentar usar simulações em vez de confiar no banco de dados. Isso é realmente correto para testes de unidade e definitivamente acelerará seus testes de unidade.Além disso, usando o servidor de especificações mencionado por @Scott Matthewman pode ajudar, o mesmo acontece com o autoteste do zentest mencionado por @Marc-André Lafortune
Existe uma maneira de destacar a parte do meu aplicativo Rails que preciso (por exemploSomente material do ActiveRecord) para que ele não carregue absolutamente tudo para executar alguns testes? e quanto a isso
rake test:recent
Não tenho certeza de como a tarefa rspec se integra a isso, mas você definitivamente poderia usar a tarefa test:recent como modelo para fazer o mesmo com os testes rspec, se o.
rake test:rspec:recent
ainda não existe
porque carrega todo o ambiente, carrega equipamentos e todo aquele jazz.
O verdadeiro culpado é se você executá-lo usando rake spec
, ele executa o db:test:prepare
tarefa.
Esta tarefa elimina todo o seu banco de dados de teste e o recria do zero.Isso parece ridículo para mim, mas é o que acontece (a mesma coisa acontece quando você executa rake:test:units
etc).
Você pode facilmente contornar isso usando o spec
aplicativo que o rspec instala como parte do gem rspec.
Assim:
cd railsapp
spec spec # run all specs without rebuilding the whole damn database
spec spec/models # run model specs only
cd spec
spec controllers/user* # run specs for controllers that start with user
Acho que a experiência "zen" que você procura é correr spec_server
e autospec
em segundo plano, resultando em testes quase instantâneos quando você salva um arquivo.
No entanto, estou tendo problemas para comunicar esses dois programas.
encontrei uma explicação aqui:
Percebi que o autoteste não envia comandos para o spec_server.Em vez disso, ele recarrega todo o ambiente do Rails e os plugins do seu aplicativo sempre que ele é executado.Isso faz com que o AutoTest seja executado significativamente mais lento que o servidor de script, porque quando você executa o comando Script/Spec, as especificações são enviadas para o SPEC_SERVER, que já possui seu ambiente de Rails acionado e pronto para ir.Se você instalar um novo plug -in ou algo parecido, precisará reiniciar o SPEC_SERVER.
Mas, como podemos resolver esse problema?Suponho que isso envolveria baixar o ZenTest e alterar o código do autotest
programa, mas não tenho tempo para experimentá-lo agora.
Você está executando isso no Rails?Nesse caso, não é a inicialização do RSpec que é lenta, é a do Rails.Rails tem que inicializar toda a base de código e o seu antes de executar as especificações.Bem, isso não ter para, mas acontece.O RSpec funciona muito rápido para mim em meus pequenos projetos não-rails.
A execução de testes pode ser muito lenta porque todo o ambiente Rails precisa ser carregado (tente o script/console) e só então todos os testes podem ser executados.Você deveria usar auto teste que mantém o ambiente carregado e verificará quais arquivos você edita.Ao editar e salvar um arquivo, apenas os testes que dependem dele serão executados de forma automática e rápida.
Se você estiver usando um Mac, recomendo usar o Rspactor em vez do autoteste, pois ele usa muito menos recursos para pesquisar arquivos alterados do que o autoteste.Existe uma versão completa do Cocoa
ou a versão gem que mantenho em GitHub
sudo gem install pelle-rspactor
Embora eles não acelerem os testes de rspec individuais, eles parecem muito mais rápidos, pois executam automaticamente as especificações afetadas um segundo depois de você clicar em salvar.
A partir do rspec-rails-1.2.7, spec_server está obsoleto em favor da gem spork.
A principal razão é que require leva para sempre no Windows, por algum motivo.
Dicas para aceleração:spork agora funciona com Windows, eu acredito.
Você pode tentar "faster_require", que armazena locais em cache:
http://github.com/rdp/faster_require
G.L.-rp
Se você estiver em um ambiente Windows, provavelmente há pouco que você possa fazer, pois o Rails parece inicializar muito lentamente no Windows.Tive a mesma experiência no Windows e tive que mover minha configuração para uma VM Linux para torná-la realmente rápida (eu também estava usando o autoteste).