Est-il possible d'exécuter un seul test dans MiniTest?

168

Je peux exécuter tous les tests dans un seul fichier avec:

rake test TEST=path/to/test_file.rb

Cependant, si je veux exécuter un seul test dans ce fichier, comment le ferais-je?

Je recherche des fonctionnalités similaires à:

rspec path/to/test_file.rb -l 25
Josiah Kiehl
la source
3
8 ans plus tard et pour les rails 5+ utilisateurs, rails test path/to/test_file.rb:25voir @Derek_Hill ans - tiré de guides.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Réponses:

44

Je recherche des fonctionnalités similaires à rspec path / to / file.rb -l 25

Ouaip! Utilisez la gemme "m" de Nick Quaranto . Avec lui, vous pouvez dire:

m spec/my_spec.rb:25
Elliot Winkler
la source
4
Bien que la réponse fonctionne et était exactement ce qui a été demandé :-) La manière Mini-test d'exécuter un seul test est par correspondance de nom (voir la réponse de M. Grimm). Si vous avez essayé cela et que vous l'avez rejeté, il est temps d'essayer les alternatives non standard - telles que Nick's Gem.
notapatch
3
C'est vrai, je suis d'accord. En fait, j'aimerais vous laisser également passer -n comme option ... ou que MiniTest soit uniquement pris en charge en utilisant des numéros de ligne ainsi que des noms de méthodes.
Elliot Winkler
15
La tête haute! m ne fonctionne actuellement pas ce Minitest 5.0 .
davetapley
alors que cette gemme fait des choses similaires à la manière rspec d'exécuter un seul test, Minitest a une manière intégrée d'exécuter un seul test qui était exactement la question. La dépendance n'est pas nécessaire. Il est bon de savoir que cela pourrait être plus facile avec un bijou accessoire (comme peut-être beaucoup autour) mais je pense que pour cette question, les réponses minimes pures comme de jduan ou randomor conviendraient mieux
cefigueiredo
209

La commande doit être:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"
Jduan
la source
6
+1 - c'est ce que vous voulez faire. Si vous voulez tester tous les tests dans un fichier spécifique, laissez de TESTOPTS=...côté
awenkhh
Réponse très utile. Je demande à MinitestReporter d'afficher les commandes de réexécution des tests ayant échoué à la fin du rapport de test. Voir: gist.github.com/foton/141b9f73caccf13ccfcc
Foton
1
Que fait le -v?
Jon Schneider
149

As-tu essayé:

ruby path/to/test_file.rb --name test_method_name
Andrew Grimm
la source
10
Qu'en est-il des tests utilisant Minispec, définis comme specify {}? Ceux-ci apparaissent juste comme test_0001_anonymous... et il pourrait y avoir plusieurs test_0001_anonymouss si la même syntaxe est utilisée dans plusieurs blocs de description ... des suggestions pour exécuter des tests uniques dans ce type d'environnement?
neezer
1
"tc" signifie "cas de test".
Andrew Grimm
4
Il dit cannot load such file -- test_helper.
x-yuri
11
utiliser ruby -Itest path/to/tc_file.rb --name test_method_namecomme stackoverflow.com/a/15714985/327786
TlmaK0
bundle exec ruby -I lib path/to --name test_fit
puchu
49

C'est l'une des choses qui me dérangent string name definitiondans les tests.

Lorsque vous avez:

def test_my_test
end

vous savez toujours comment votre test est nommé afin que vous puissiez l'exécuter comme ceci:

ruby my_test -n test_my_test

Mais quand vous avez quelque chose comme:

it "my test" do
end

vous n'êtes jamais sûr de la manière dont ce test est vraiment nommé en interne, vous ne pouvez donc pas utiliser l' -noption directement.

Pour savoir comment ce test est nommé en interne, vous n'avez qu'une option: exécutez le fichier entier pour essayer de comprendre la recherche dans les journaux.

Ma solution de contournement est (temporairement) d'ajouter quelque chose au nom du test très unique comme:

it "my test xxx" do
end

puis utilisez la version RegEx du paramètre '-n' comme:

ruby my_test.rb -n /xxx/
fguillen
la source
6
La version regex du paramètre -n était l'élément clé de l'information, merci!
Woahdae
Notez que vous pouvez vérifier cela en appelant __method__dans le contexte de la méthode en cours d'exécution (votre test, dans ce cas). L'implémentation actuelle aboutit à quelque chose comme "does not break my stuff".gsub(" ", "_").prepend("test_"). Ensuite, exécutez, par exemple ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff,.
TK-421
33

Si vous utilisez MiniTest avec Rails 5+, la meilleure façon d'exécuter tous les tests dans un seul fichier est:

bin/rails test path/to/test_file.rb

Et pour un seul test (par exemple en ligne 25):

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

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

Derek Hill
la source
23

Vous pouvez l'utiliser pour exécuter un seul fichier:

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

J'ai aussi utilisé

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

pour un meilleur affichage.

tuhaj
la source
12

Il y a 2 façons de le faire:

  1. Exécutez les tests «manuellement» (voir la réponse d'Andrew Grimm).
  2. Hack Rake::TestTaskcible pour utiliser un autre chargeur de tests.

Rake::TestTask(à partir de rake 0.8.7) est théoriquement capable de passer des options supplémentaires à MiniTest::Unitavec une "TESTOPTS=blah-blah"option de ligne de commande, par exemple:

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

En pratique, l'option --name(un filtre pour les noms de test) ne fonctionnera pas, en raison des internes de rake. Pour résoudre ce problème, vous devrez écrire un petit patch de singe dans votre 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 
}

Ce patch vous oblige à créer un fichier test/my-minitest-loader.rb:

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

Pour imprimer toutes les options possibles pour Minitest, tapez

% ruby ​​-r minitest / autorun -e '' - --help
Alexandre Gromnitsky
la source
3
Notez que l'exemple initial fonctionne correctement avec une version plus récente rake(0.9.2) et qu'aucun patch de singe n'est requis.
Confusion
1
Quand j'ai essayé avec rake la version 10.5.0 TESTOPTS="--name test_foobar"ne fonctionne pas, mais TESTOPTS="--name=test_foobar"fonctionne.
kangkyu
11

Vous pouvez passer --namepour exécuter un test par son nom ou un numéro dans son nom:

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

par exemple:

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

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

Cet indicateur est documenté dans le fichier README de Minitest .

Rimian
la source
1

Si vous utilisez Turn gem avec minitest, assurez-vous simplement d'utiliser l' Turn.config.patternoption car Turn Minitest runner ne respecte pas l'option --name dans les ARG.

Laknath
la source
C'était l'indice dont j'avais besoin pour réaliser que Turn était ce qui avalait l' nameoption. Merci! Étant donné que Turn n'est plus maintenu, je prévois de migrer vers les minitest-reporters
pdobb
1

Je recherche des fonctionnalités similaires à:

chemin rspec / vers / fichier_test.rb -l 25

Il y a un petit bijou qui fait exactement cela: minitest-line.

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

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

knugie
la source
Salut @ChrisHough, pourriez-vous décrire ce qui ne fonctionne pas exactement (par exemple un message d'erreur)? Le but de la gemme minitest-line est uniquement d'exécuter un seul test dans MiniTest. Si cela ne fonctionne pas, vous avez peut-être trouvé un bogue dans minitest-line.
knugie
1

j'utilise ruby /path/to/test -n /distinguishable word/

Edit: -nest un raccourci pour --name. distinguishable wordpeut être n'importe quelle chaîne que vous mettez dans la description du test, j'utilise généralement un mot aléatoire dont je sais qu'il ne sera pas présent dans les descriptions d'autres tests.

sloneorzeszki
la source
Pouvez-vous expliquer cela davantage? Que signifie ce -nparamètre?
Nico Haase
C'est un raccourci pour --name. Juste une chose de commodité. Particulièrement utile avec le / regex /, je mets généralement un mot aléatoire dans un nom de test (je sais qu'il ne sera pas présent dans les descriptions des autres tests).
sloneorzeszki
1
Veuillez ajouter quelques explications à ce sujet à la réponse elle-même, pas à la section des commentaires
Nico Haase
0

La suite fonctionnera

def test_abc
end

test "hello world"
end

Cela peut fonctionner par

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

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

la source
-1

rails test path/to/test_file.rb:25 le fera

sekmo
la source