Ist es möglich, einen einzelnen Test in MiniTest durchzuführen?

168

Ich kann alle Tests in einer einzigen Datei ausführen mit:

rake test TEST=path/to/test_file.rb

Wenn ich jedoch nur einen Test in dieser Datei ausführen möchte, wie würde ich das tun?

Ich suche nach ähnlichen Funktionen wie:

rspec path/to/test_file.rb -l 25
Josiah Kiehl
quelle
3
8 Jahre später und für Rails 5+ Benutzer rails test path/to/test_file.rb:25siehe @Derek_Hill ans - entnommen ausguides.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Antworten:

44

Ich suche nach ähnlichen Funktionen wie rspec path / to / file.rb -l 25

Jep! Verwenden Sie Nick Quarantos "m" Edelstein . Damit kann man sagen:

m spec/my_spec.rb:25
Elliot Winkler
quelle
4
Während die Antwort funktioniert und genau das war, was gefragt wurde :-) Die Mini-Test-Methode zum Ausführen eines einzelnen Tests besteht in der Namensübereinstimmung (siehe die Antwort von Herrn Grimm). Wenn Sie dies versucht und abgelehnt haben, ist es Zeit, die nicht standardmäßigen Alternativen auszuprobieren - wie beispielsweise Nick's Gem.
Notapatch
3
Stimmt, ich stimme zu. Eigentlich möchte ich, dass Sie auch -n als Option übergeben können ... oder dass MiniTest nur die Verwendung von Zeilennummern sowie Methodennamen unterstützt.
Elliot Winkler
15
Kopf hoch! m Derzeit funktioniert dieser Minitest 5.0 nicht .
Davetapley
Während dieses Juwel ähnliche Dinge wie die rspec-Methode zum Ausführen eines einzelnen Tests macht, verfügt Minitest über eine integrierte Methode zum Ausführen eines einzelnen Tests, die genau die Frage war. Die Abhängigkeit ist nicht erforderlich. Es ist gut zu wissen, dass dies mit einem Accessoire-Juwel einfacher sein könnte (wie es vielleicht viele gibt), aber ich denke, dass für diese Frage die rein kleinsten Antworten wie von Jduan oder Randomor besser passen würden
cefigueiredo
209

Der Befehl sollte lauten:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"
Jduan
quelle
6
+1 - das willst du tun. Wenn Sie alle Tests in einer bestimmten Datei testen möchten, lassen Sie es einfach TESTOPTS=...weg
awenkhh
Sehr nützliche Antwort. Ich lasse MinitestReporter Wiederholungsbefehle für fehlgeschlagene Tests am Ende des Testberichts anzeigen. Siehe: gist.github.com/foton/141b9f73caccf13ccfcc
Foton
1
Was macht das -v?
Jon Schneider
149

Hast du es versucht:

ruby path/to/test_file.rb --name test_method_name
Andrew Grimm
quelle
10
Was ist mit Tests mit Minispec, definiert wie specify {}? Diese werden nur als test_0001_anonymous... angezeigt, und es kann mehrere test_0001_anonymouss geben, wenn dieselbe Syntax in mehreren Beschreibungsblöcken verwendet wird. Gibt es Vorschläge für die Ausführung einzelner Tests in dieser Umgebung?
Neezer
1
"tc" steht für "Testfall".
Andrew Grimm
4
Es heißt cannot load such file -- test_helper.
X-Yuri
11
Verwenden Sie ruby -Itest path/to/tc_file.rb --name test_method_namewie stackoverflow.com/a/15714985/327786
TlmaK0
bundle exec ruby -I lib path/to --name test_fit
Puchu
49

Dies ist eines der Dinge, die mich an den string name definitionTests stören .

Wenn du. .. hast:

def test_my_test
end

Sie wissen immer, wie Ihr Test benannt ist, damit Sie ihn folgendermaßen ausführen können:

ruby my_test -n test_my_test

Aber wenn Sie so etwas haben wie:

it "my test" do
end

Sie sind sich nie sicher, wie dieser Test intern wirklich benannt ist, daher können Sie die -nOption nicht direkt verwenden.

Um zu wissen, wie dieser Test intern benannt ist, haben Sie nur eine Option: Führen Sie die gesamte Datei aus, um herauszufinden, wie Sie in den Protokollen suchen.

Meine Problemumgehung besteht darin, (zeitlich) dem Testnamen etwas hinzuzufügen, das sehr einzigartig ist, wie:

it "my test xxx" do
end

und verwenden Sie dann die RegEx- Version des Parameters '-n' wie folgt :

ruby my_test.rb -n /xxx/
fguillen
quelle
6
Die reguläre Version des Parameters -n war die Kupplung, danke!
Woahdae
Beachten Sie, dass Sie dies überprüfen können, indem Sie __method__im Kontext der aktuell ausgeführten Methode (in diesem Fall Ihres Tests) aufrufen . Die vorliegende Implementierung führt zu so etwas wie "does not break my stuff".gsub(" ", "_").prepend("test_"). Führen Sie dann beispielsweise aus ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff.
TK-421
33

Wenn Sie MiniTest mit Rails 5+ verwenden, können Sie alle Tests am besten in einer einzigen Datei ausführen:

bin/rails test path/to/test_file.rb

Und für einen einzelnen Test (z. B. in Zeile 25):

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

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

Derek Hill
quelle
23

Sie können dies verwenden, um eine einzelne Datei auszuführen:

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

Ich habe auch verwendet

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

zur besseren Anzeige.

Tuhaj
quelle
12

Es gibt zwei Möglichkeiten, dies zu tun:

  1. Führen Sie Tests 'manuell' durch (siehe Andrew Grimms Antwort).
  2. Hack- Rake::TestTaskZiel, um einen anderen Testlader zu verwenden.

Rake::TestTask(ab Rake 0.8.7) kann theoretisch zusätzliche Optionen MiniTest::Unitmit einer "TESTOPTS=blah-blah"Befehlszeilenoption übergeben, zum Beispiel:

% Rake Test TEST = test / test_foobar.rb TESTOPTS = "- Name test_foobar1 -v"

In der Praxis --namefunktioniert die Option (ein Filter für Testnamen) aufgrund von Rake-Interna nicht. Um dies zu beheben, müssen Sie einen kleinen Affen-Patch in Ihr Rakefile schreiben:

# 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 
}

Für diesen Patch müssen Sie eine Datei erstellen test/my-minitest-loader.rb:

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

Geben Sie ein, um alle möglichen Optionen für Minitest zu drucken

% ruby ​​-r minitest / autorun -e '' - --help
Alexander Gromnitsky
quelle
3
Beachten Sie, dass das erste Beispiel mit einem neueren rake(0.9.2) korrekt funktioniert und kein Affen-Patch erforderlich ist.
Verwirrung
1
Als ich es mit Rake versuchte TESTOPTS="--name test_foobar", TESTOPTS="--name=test_foobar"funktioniert Version 10.5.0 nicht, funktioniert aber .
Kangkyu
11

Sie können --nameeinen Test anhand seines Namens oder einer Nummer innerhalb seines Namens ausführen:

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

z.B:

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

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

Dieses Flag ist in der README von Minitest dokumentiert .

Rimian
quelle
1

Wenn Sie Turn gem mit Minitest verwenden, stellen Sie sicher, dass Sie die Turn.config.patternOption verwenden, da der Run Minitest-Läufer die Option --name in ARGs nicht berücksichtigt.

Laknath
quelle
Dies war der Hinweis, den ich brauchte, um zu erkennen, dass Turn die nameOption war, die die Option verschluckte . Vielen Dank! Da dieser Turn nicht mehr aufrechterhalten wird, plane ich, zu Minitest-Reportern zu migrieren
pdobb
1

Ich suche nach ähnlichen Funktionen wie:

rspec path / to / test_file.rb -l 25

Es gibt ein Juwel, das genau das tut : minitest-line.

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

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

knugie
quelle
Hallo @ChrisHough, kannst du beschreiben, was genau nicht funktioniert (zB eine Fehlermeldung)? Der Zweck des Minitest-Line-Edelsteins besteht ausschließlich darin, einen einzelnen Test in MiniTest durchzuführen. Wenn es nicht funktioniert, haben Sie möglicherweise einen Fehler in der Minitest-Zeile gefunden.
Knugie
1

ich benutze ruby /path/to/test -n /distinguishable word/

Bearbeiten: -nist eine Abkürzung für --name. distinguishable wordkann eine beliebige Zeichenfolge sein, die Sie in die Testbeschreibung einfügen. Normalerweise verwende ich ein zufälliges Wort, von dem ich weiß, dass es in den Beschreibungen anderer Tests nicht vorhanden ist.

sloneorzeszki
quelle
Können Sie das weiter erklären? Was bedeutet dieser -nParameter?
Nico Haase
Es ist eine Abkürzung für --name. Nur eine Annehmlichkeitssache. Besonders nützlich mit dem / regex /, füge ich normalerweise nur ein zufälliges Wort in einen Testnamen ein (von dem ich weiß, dass es in den Beschreibungen anderer Tests nicht vorhanden ist).
Sloneorzeszki
1
Bitte fügen Sie eine Erklärung dazu zur Antwort selbst hinzu, nicht zum Kommentarbereich
Nico Haase
0

Folgendes wird funktionieren

def test_abc
end

test "hello world"
end

Dies kann vorbei laufen

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

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

quelle
-1

rails test path/to/test_file.rb:25 werde es tun

sekmo
quelle