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

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

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


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"

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

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/

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


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.


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

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 .


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.


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


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.


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

-1

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.