È possibile eseguire un singolo test in MiniTest?


168

Posso eseguire tutti i test in un singolo file con:

rake test TEST=path/to/test_file.rb

Tuttavia, se volessi eseguire un solo test in quel file, come lo farei?

Sto cercando funzionalità simili a:

rspec path/to/test_file.rb -l 25

3
8 anni dopo e per gli utenti di rotaie 5+ utenti rails test path/to/test_file.rb:25vedono @Derek_Hill ans - tratto da guide.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Risposte:


44

Sto cercando funzionalità simili a rspec path / to / file.rb -l 25

Sì! Usa la gemma "m" di Nick Quaranto . Con esso puoi dire:

m spec/my_spec.rb:25

4
Mentre la risposta funziona ed è stato esattamente quello che è stato chiesto :-) Il modo Mini-test di eseguire un singolo test è la corrispondenza dei nomi (vedi la risposta di Mr Grimm). Se l'hai provato e lo hai rifiutato, è tempo di provare le alternative non standard - come Nick's Gem.
notapatch

3
Vero, sono d'accordo. Vorrei davvero lasciarti passare anche in -n come opzione ... o che MiniTest ha appena supportato l'utilizzo dei numeri di riga e dei nomi dei metodi.
Elliot Winkler il


mentre questa gemma rende le cose simili al modo rspec di eseguire un singolo test, Minitest ha un modo integrato per eseguire un singolo test che era esattamente la domanda. La dipendenza non è necessaria. È bene sapere che potrebbe essere più facile con una gemma accessoria (come potrebbero averne molte in giro) ma penso che per questa domanda, le risposte più minime come jduan o randomor si adatteranno meglio
cefigueiredo,

209

Il comando dovrebbe essere:

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

6
+1 - questo è quello che vuoi fare. Se si desidera verificare tutti i test in un file specifico, basta lasciare TESTOPTS=...via
awenkhh

Risposta molto utile. Faccio MinitestReporter per mostrare i comandi di riesecuzione dei test non riusciti alla fine del rapporto di prova. Vedi: gist.github.com/foton/141b9f73caccf13ccfcc
Foton

1
Che cosa -vfa?
Jon Schneider,

149

Hai provato:

ruby path/to/test_file.rb --name test_method_name

10
Che dire dei test con Minispec, definito come specify {}? Questi vengono visualizzati come test_0001_anonymous... e potrebbero esserci più messaggi test_0001_anonymousse la stessa sintassi viene utilizzata in più blocchi descrittivi ... qualche suggerimento per l'esecuzione di test singoli in questo tipo di ambiente?
Neezer,

1
"tc" sta per "test case".
Andrew Grimm,

4
Dice cannot load such file -- test_helper.
X-Yuri,

11
uso ruby -Itest path/to/tc_file.rb --name test_method_namecome stackoverflow.com/a/15714985/327786
TlmaK0

bundle exec ruby -I lib path/to --name test_fit
Puchu,


49

Questa è una delle cose che mi danno fastidio string name definitionnei test in.

Quando hai:

def test_my_test
end

sai sempre come viene chiamato il tuo test in modo da poterlo eseguire in questo modo:

ruby my_test -n test_my_test

Ma quando hai qualcosa come:

it "my test" do
end

non si è mai sicuri di come questo test sia realmente chiamato internamente, quindi non è possibile utilizzare l' -nopzione direttamente.

Per sapere come questo test viene chiamato internamente hai solo un'opzione: esegui l'intero file per provare a capire guardando nei registri.

La mia soluzione alternativa è (temporaneamente) aggiungere qualcosa al nome del test univoco come:

it "my test xxx" do
end

e quindi usa la versione RegEx del parametro '-n' come:

ruby my_test.rb -n /xxx/

6
La versione regex del parametro -n era l'informazione della frizione, grazie!
Woahdae

Nota che puoi verificarlo chiamando __method__nel contesto del metodo attualmente in esecuzione (il tuo test, in questo caso). La presente implementazione si traduce in qualcosa di simile "does not break my stuff".gsub(" ", "_").prepend("test_"). Quindi eseguire, ad esempio ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff,.
TK-421,


23

Puoi usarlo per eseguire un singolo file:

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

Ho anche usato

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

per una migliore visualizzazione.


12

Ci sono 2 modi per farlo:

  1. Esegui i test "manualmente" (vedi la risposta di Andrew Grimm).
  2. Hack Rake::TestTasktarget per utilizzare un caricatore di test diverso.

Rake::TestTask(dal rake 0.8.7) teoricamente è in grado di passare opzioni aggiuntive a MiniTest::Unitcon "TESTOPTS=blah-blah"un'opzione della riga di comando, ad esempio:

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

In pratica, l'opzione --name(un filtro per i nomi dei test) non funzionerà, a causa dei rake interni. Per risolvere il problema, dovrai scrivere una piccola patch di scimmia nel tuo 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 
}

Questa patch richiede di creare un file test/my-minitest-loader.rb:

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

Per stampare tutte le opzioni possibili per Minitest, digitare

% ruby ​​-r minitest / autorun -e '' - --help

3
Si noti che l'esempio iniziale funziona correttamente con un più recente rake(0.9.2) e non è richiesta alcuna patch scimmia.
Confusione,

1
Quando ho provato con la versione rake 10.5.0 TESTOPTS="--name test_foobar"non funziona, ma TESTOPTS="--name=test_foobar"funziona.
kangkyu,

11

Puoi passare --nameper eseguire un test con il suo nome o un numero all'interno del suo nome:

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

per esempio:

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

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

Questa bandiera è documentata nel README di Minitest .


1

Se stai usando Turn gem with minitest, assicurati di usare l' Turn.config.patternopzione poiché Turn Minitest runner non rispetta l'opzione --name negli ARG.


Questo era il suggerimento di cui avevo bisogno per rendermi conto che Turn è ciò che stava inghiottendo l' nameopzione. Grazie! Essendo quel turno non viene più mantenuto, ho intenzione di migrare verso i reporter più
piccoli

1

Sto cercando funzionalità simili a:

percorso rspec / to / test_file.rb -l 25

V'è una gemma che fa esattamente questo: minitest-line.

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

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


Ciao @ChrisHough, potresti descrivere cosa non funziona esattamente (ad es. Un messaggio di errore)? Lo scopo della gemma più minuta è quello di eseguire un singolo test in MiniTest. Se non funziona potresti aver trovato un bug nella riga più minuta.
knugie,

1

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

Modifica: -nè una scorciatoia per --name. distinguishable wordpuò essere una qualsiasi stringa inserita nella descrizione del test, di solito uso qualche parola casuale che so che non sarà presente nelle descrizioni di altri test.


Puoi spiegarlo ulteriormente? Cosa significa quel -nparametro?
Nico Haase,

È una scorciatoia per --name. Solo una cosa di convenienza. Particolarmente utile con / regex /, di solito inserisco semplicemente una parola a caso nel nome di un test (che so non sarà presente nelle descrizioni di altri test).
sloneorzeszki,

1
Per favore, aggiungi qualche spiegazione al riguardo alla risposta stessa, non alla sezione commenti
Nico Haase,

0

Di seguito funzionerà

def test_abc
end

test "hello world"
end

Questo può essere eseguito da

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

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

-1

rails test path/to/test_file.rb:25 lo farà

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.