É possível executar um único teste no MiniTest?

168

Eu posso executar todos os testes em um único arquivo com:

rake test TEST=path/to/test_file.rb

No entanto, se eu quiser executar apenas um teste nesse arquivo, como eu o faria?

Estou procurando uma funcionalidade semelhante a:

rspec path/to/test_file.rb -l 25
Josiah Kiehl
fonte
3
8 anos mais tarde e para trilhos 5+ usuários rails test path/to/test_file.rb:25ver @Derek_Hill ans - tirado de guides.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Respostas:

44

Estou procurando uma funcionalidade semelhante ao caminho rspec / to / file.rb -l 25

Sim! Use a jóia "m" de Nick Quaranto . Com ele você pode dizer:

m spec/my_spec.rb:25
Elliot Winkler
fonte
4
Enquanto a resposta funciona e foi exatamente o que foi solicitado :-) A maneira do Mini-teste de executar um único teste é por correspondência de nomes (consulte a resposta do Sr. Grimm). Se você tentou e rejeitou, é hora de tentar alternativas não padronizadas - como a Nick's Gem.
precisa saber é o seguinte
3
É verdade que eu concordo. Na verdade, eu gostaria de permitir que você também insira -n como uma opção ... ou que o MiniTest apenas suporte usando números de linhas e nomes de métodos.
Elliot Winkler
15
Atenção! m atualmente não funciona com este Minitest 5.0 .
Davetapley 15/05
Embora essa gema torne as coisas semelhantes à maneira rspec de executar um único teste, o Minitest tem uma maneira integrada de executar um único teste que era exatamente a pergunta. A dependência não é necessária. É bom saber que poderia ser mais fácil com uma jóia acessório (como pode ter muitos ao redor), mas eu acho que para esta pergunta, as respostas minitest puros como de jduan ou randomor caberia melhor
cefigueiredo
209

O comando deve ser:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"
jduan
fonte
6
+1 - é isso que você quer fazer. Se você quiser testar todo o teste em um arquivo específico, deixe de TESTOPTS=...fora
awenkhh 4/15
Resposta muito útil. Eu faço o MinitestReporter para mostrar comandos de reexecução de testes com falha no final do relatório de teste. Veja: gist.github.com/foton/141b9f73caccf13ccfcc
Foton
1
O que -vfaz?
Jon Schneider
149

Você tentou:

ruby path/to/test_file.rb --name test_method_name
Andrew Grimm
fonte
10
E os testes usando o Minispec, definidos como specify {}? Eles aparecem como test_0001_anonymous... e pode haver vários test_0001_anonymouss se a mesma sintaxe for usada em vários blocos de descrição ... alguma sugestão para executar testes únicos nesse tipo de ambiente?
N
1
"tc" significa "caso de teste".
Andrew Grimm
4
Diz cannot load such file -- test_helper.
x-yuri
11
use ruby -Itest path/to/tc_file.rb --name test_method_namecomo stackoverflow.com/a/15714985/327786
TlmaK0:
bundle exec ruby -I lib path/to --name test_fit
Puchu
49

Essa é uma das coisas que me incomoda string name definitionnos testes.

Quando voce tem:

def test_my_test
end

você sempre sabe como o seu teste é nomeado, para que você possa executá-lo assim:

ruby my_test -n test_my_test

Mas quando você tem algo como:

it "my test" do
end

você nunca sabe ao certo como esse teste é nomeado internamente; portanto, não é possível usar a -nopção diretamente.

Para saber como esse teste é nomeado internamente, você só tem uma opção: execute o arquivo inteiro para tentar descobrir os logs.

Minha solução alternativa é (temporariamente) adicionar algo ao nome do teste muito exclusivo, como:

it "my test xxx" do
end

e use a versão RegEx do parâmetro '-n' como:

ruby my_test.rb -n /xxx/
fguillen
fonte
6
A versão regex do parâmetro -n era a informação da embreagem, obrigado!
Woahdae 19/01
Observe que você pode verificar isso chamando __method__dentro do contexto do método atualmente em execução (seu teste, nesta instância). A implementação atual resulta em algo como "does not break my stuff".gsub(" ", "_").prepend("test_"). Em seguida, execute, por exemplo ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff,.
TK-421
33

Se você estiver usando o MiniTest com Rails 5+, a melhor maneira de executar todos os testes em um único arquivo é:

bin/rails test path/to/test_file.rb

E para um único teste (por exemplo, na linha 25):

bin/rails test path/to/test_file.rb:25

Veja http://guides.rubyonrails.org/testing.html#the-rails-test-runner

Derek Hill
fonte
23

Você pode usar isso para executar um único arquivo:

rake test TEST=test/path/to/file.rb

Eu também usei

ruby -I"lib:test" test/path/to/file.rb

para melhor visualização.

tuhaj
fonte
12

Existem 2 maneiras de fazer isso:

  1. Execute os testes 'manualmente' (consulte a resposta de Andrew Grimm).
  2. Hackeie o Rake::TestTaskalvo para usar um carregador de testes diferente.

Rake::TestTask(do rake 0.8.7) teoricamente é capaz de passar opções adicionais para MiniTest::Unituma "TESTOPTS=blah-blah"opção de linha de comando, por exemplo:

% rake test TEST = teste / test_foobar.rb TESTOPTS = "- nome test_foobar1 -v"

Na prática, a opção --name(um filtro para nomes de teste) não funcionará, devido a varreduras internas. Para corrigir isso, você precisará escrever um pequeno patch de macaco no seu Rakefile:

# overriding the default rake tests loader
class Rake::TestTask
  def rake_loader
    'test/my-minitest-loader.rb'
  end
end

# our usual test terget 
Rake::TestTask.new {|i|
  i.test_files = FileList['test/test_*.rb']
  i.verbose = true 
}

Este patch requer que você crie um arquivo test/my-minitest-loader.rb:

ARGV.each { |f|
  break if f =~ /^-/
  load f
}

Para imprimir todas as opções possíveis para o Minitest, digite

% ruby ​​-r minitest / autorun -e '' - --help
Alexander Gromnitsky
fonte
3
Observe que o exemplo inicial funciona corretamente com uma rakeversão mais recente (0.9.2) e nenhuma correção de macaco é necessária.
Confusão
1
Quando eu tentei com rake versão 10.5.0 TESTOPTS="--name test_foobar"não funciona, mas TESTOPTS="--name=test_foobar"funciona.
kangkyu
11

Você pode passar --namepara executar um teste pelo nome ou número dentro do nome:

-n, --name PATTERN               Filter run on /regexp/ or string.

por exemplo:

$ ruby spec/stories/foo_spec.rb --name 3

FAIL (0:00:00.022) test_0003_has foo
Expected: "foo"
Actual: nil

Esse sinalizador está documentado no README do Minitest .

Rimian
fonte
1

Se você estiver usando o Turn gem com minitest, certifique-se de usar a Turn.config.patternopção, pois o corredor Turn Minitest não respeita a opção --name nos ARGs.

Laknath
fonte
Esta foi a dica que eu precisava para perceber que Turn é o que estava engolindo a nameopção. Obrigado! Sendo que Ligue já não está sendo mantido, eu pretendo migrar para minitest-repórteres
pdobb
1

Estou procurando uma funcionalidade semelhante a:

caminho do rspec / para / test_file.rb -l 25

Não é uma jóia que faz exatamente isso: minitest-line.

gem install minitest-line
ruby test/my_file -l 5

de https://github.com/judofyr/minitest-line#minitest-line

knugie
fonte
Olá @ChrisHough, você poderia descrever o que exatamente não está funcionando (por exemplo, uma mensagem de erro)? O objetivo da gema minitest-line é apenas executar um único teste no MiniTest. Se não estiver funcionando, você pode encontrar um bug na linha minitest.
knugie
1

eu uso ruby /path/to/test -n /distinguishable word/

Edit: -né uma abreviação de --name. distinguishable wordpode ser qualquer string que você insira na descrição do teste, geralmente uso uma palavra aleatória que sei que não estará presente nas descrições de outros testes.

sloneorzeszki
fonte
Você pode explicar isso mais? O que esse -nparâmetro significa?
Nico Haase
É uma abreviação para --name. Apenas uma coisa de conveniência. Especialmente útil com o / regex /, geralmente coloco algumas palavras aleatórias no nome de um teste (que eu sei que não estará presente nas descrições de outros testes).
Sloneorzeszki 18/03/19
1
Por favor, adicione um pouco de explicação sobre o que a resposta em si, não para a seção de comentários
Nico Haase
0

A seguir funcionará

def test_abc
end

test "hello world"
end

Isso pode ser executado por

bundle exec ruby -I test path/to/test -n test_abc

bundle exec ruby -I test path/to/test -n test_hello_word

fonte
-1

rails test path/to/test_file.rb:25 vai fazer isso

sekmo
fonte