Como executar um único teste em um conjunto de testes de trilhos?

Respostas:

158

NOTA: Isso não executa o teste via rake. Portanto, qualquer código que você possui RakefileNÃO será executado.

Para executar um único teste, use o seguinte comando no diretório principal do seu projeto Rails:

ruby -I test test/unit/my_model_test.rb -n test_name

Isso executa um único teste chamado "nome", definido na classe MyModelTest no arquivo especificado. O nome_da_teste é formado usando o nome do teste, acrescentando-o com a palavra "teste" e depois separando as palavras com sublinhados. Por exemplo:

class MyModelTest < ActiveSupport::TestCase

  test "valid with good attributes" do
    # do whatever you do
  end

  test "invalid with bad attributes" do
    # do whatever you do
  end
end

Você pode executar os dois testes via:

ruby -I test test/unit/my_model_test.rb

e apenas o segundo teste via

ruby -I test test/unit/my_model_test.rb -n test_invalid_with_bad_attributes
Darryl
fonte
4
Isso não funciona para mim (em testes funcionais ou unitários). Eu entendo 0 tests, 0 assertions, 0 failures, 0 errors. Rails 3.0.7.
B Seven
10
Eu pessoalmente sou um fã da forma regex: -n "/good/". A fuga de shell é sempre divertida, então eu costumo seguir expressões simples, mas é muito mais fácil do que escrever o nome completo do teste o tempo todo.
Groxx
4
É importante observar que, para que isso funcione, você não deve estar no diretório MAIN conforme especificado na resposta, mas no subdiretório que contém a test/pasta. Por exemplo, se eu quiser executar o teste activesupport/test/core_ext/array_ext_test.rb, devo entrar activesupport/primeiro.
Vincent B.
3
@Groxx - Finalmente uma solução! Obrigado! -n "/good/"trabalhou.
B Seven
Tenha cuidado ao executar isso em 2018+. Ele ignora algumas tarefas de teste incorporadas aos trilhos (como db: test: prepare) que são usadas para muitas coisas, como trocar dados locais por dados de fixação e restaurá-los novamente. A execução disso surpreendeu meu banco de dados local. Considere uma solução que use as tarefas de teste de trilhos internos, como stackoverflow.com/a/47006811/1154642 (que funcionou para mim).
Bryanbraun 15/09/19
99

Execute um arquivo de teste :

rake test TEST=tests/functional/accounts_test.rb

Execute um único teste em um arquivo de teste:

rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n /paid accounts/"

(Do comentário de @Puhlze.)

Laffuste
fonte
10
Além disso, se você quiser executar um único teste no arquivo fornecido, poderá adicionar uma var do ambiente TESTOPTS que será passada para o teste. EG ancinho teste test = testes / funcionais / accounts_test.rb TESTOPTS = "- n / d contas pagas /"
Puhlze
1
se este não funciona comando de teste, tente rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n '/paid accounts/'"(encerrando /paid accounts/com aspas simples)
RRW
38

Para trilhos 5:

rails test test/models/my_model.rb
James
fonte
9
Mas isso funciona todos os casos de teste no arquivo, a questão pede para executar um único teste ...
user000001
Você pode executar um único teste anexando um número de linha a um nome de arquivo:bin/rails test test/models/user_test.rb:27
Segfault
29

Graças a @ James, a resposta parece ser:

rails test test/models/my_model.rb:22

Assumindo 22 é o número da linha do teste fornecido. De acordo com os trilhos de ajuda:

 $ rails test --help

Você pode executar um único teste anexando um número de linha a um nome de arquivo:

    bin/rails test test/models/user_test.rb:27

Além disso, observe que seu teste deve herdar de ActionDispatch :: IntegrationTest para que isso funcione (esse foi meu erro):

class NexApiTest < ActionDispatch::IntegrationTest
.
.
.
Roozbeh Zabihollahi
fonte
4
Essa parece ser a melhor resposta baseada nos guias do Rails, pelo menos para testar uma linha específica.
tfantina
12

Nos trilhos 5,

Eu usei esse caminho para executar um único arquivo de teste (todos os testes em um arquivo)

rails test -n /TopicsControllerTest/ -v

veja aqui https://stackoverflow.com/a/41183694/3626659

Alupotha
fonte
1
esta é a melhor resposta para a pergunta para as versões recentes trilhos, +1
user000001
5

Para executar um único teste no pacote Rails real:

bundle exec ruby -I"railties/test" actionpack/test/template/form_options_helper_test.rb
Brian Rose
fonte
3

Essa foi uma pergunta boba da meia-noite minha. O Rails gentilmente imprime o comando que está executando rake test. O resto é um exercício de recortar e colar.

~/projects/rails/actionpack (my2.3.4)$ ruby -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/controller/base_test.rb"
artemave
fonte
2

Se você deseja executar um único teste, basta executá-los como um script Ruby comum

ruby actionmailer/test/mail_layout_test.rb

Você também pode executar um conjunto inteiro (por exemplo, ActiveRecord ou ActionMailer) inserindo cdo diretório e executando rake testdentro dele.

Aupajo
fonte
1
Não no Rails - pelo menos não com os arquivos de teste padrão gerados. Eles "exigem 'test_helper'" na primeira linha, mas o caminho do carregamento não será configurado a tempo. Se você alterar cada primeira linha para um requisito explícito ("exigir File.join (File.dirname ( FILE ), '..', 'test_helper')"), sua solução funcionará.
James A. Rosen
ahem, isso érequire File.join(File.dirname(__FILE__), '..', 'test_helper')
James A. Rosen
@Gaius Verificado duas vezes. O primeiro não funciona, mas cdsim. Só para esclarecer (não tenho certeza se estou lendo isso errado, mas você disse "arquivos de teste gerados"), isso é para a própria biblioteca do Rails, não para um projeto do Rails.
Aupajo
2

Na minha situação, rakesó funciona TESTOPTS="-n='/sample/'":

bundle exec rake test TEST=test/system/example_test.rb TESTOPTS="-n='/sample/'"
N0xFF
fonte
0

Primeiro, acesse a pasta da lib que você deseja testar (isso é importante) e depois execute:

~/Projects/rails/actionview (master)$ ruby -I test test/template/number_helper_test.rb 
Diego Plentz
fonte
0

Pasta Rails

  bundle install
  bundle exec ruby -I"activerecord/test" activerecord/test/cases/relation/where_test.rb 

Observe que você precisa carregar a pasta apropriada: "activerecord / test" (onde você tem o teste)

Igor Kasyanchuk
fonte