Wie führe ich einen einzelnen Test aus einer Rails-Testsuite aus?

Antworten:

158

HINWEIS: Dadurch wird der Test nicht über ausgeführt rake. Code, den Sie haben, Rakefilewird also NICHT ausgeführt.

Verwenden Sie den folgenden Befehl aus dem Hauptverzeichnis Ihres Rails-Projekts, um einen einzelnen Test auszuführen:

ruby -I test test/unit/my_model_test.rb -n test_name

Dadurch wird ein einzelner Test mit dem Namen "name" ausgeführt, der in der MyModelTest-Klasse in der angegebenen Datei definiert ist. Der Testname wird gebildet, indem der Testname mit dem Wort "test" vorangestellt und die Wörter durch Unterstriche getrennt werden. Beispielsweise:

class MyModelTest < ActiveSupport::TestCase

  test "valid with good attributes" do
    # do whatever you do
  end

  test "invalid with bad attributes" do
    # do whatever you do
  end
end

Sie können beide Tests ausführen über:

ruby -I test test/unit/my_model_test.rb

und nur der zweite Test über

ruby -I test test/unit/my_model_test.rb -n test_invalid_with_bad_attributes
Darryl
quelle
4
Dies funktioniert bei mir nicht (bei Funktions- oder Unit-Tests). Ich verstehe 0 tests, 0 assertions, 0 failures, 0 errors. Schienen 3.0.7.
B Sieben
10
Ich persönlich bin ein Fan der Regex-Form : -n "/good/". Das Entkommen von Shell macht immer Spaß, daher halte ich mich eher an einfache reguläre Ausdrücke, aber es ist weitaus einfacher, als ständig den vollständigen Testnamen aufzuschreiben.
Groxx
4
Es ist wichtig zu beachten, dass Sie sich nicht im MAIN-Verzeichnis befinden sollten, wie in der Antwort angegeben, sondern im Unterverzeichnis, das den test/Ordner enthält. Wenn ich zum Beispiel den Test ausführen möchte, activesupport/test/core_ext/array_ext_test.rbsollte ich activesupport/zuerst dabei sein.
Vincent B.
3
@Groxx - Endlich eine Lösung! Danke dir! -n "/good/"hat funktioniert.
B Sieben
Seien Sie vorsichtig, wenn Sie dies ab 2018 ausführen. Es umgeht einige in Schienen integrierte Testaufgaben (wie db: test: prepare), die für viele Zwecke verwendet werden, z. B. das Austauschen lokaler Daten gegen Fixture-Daten und das erneute Wiederherstellen. Das Ausführen hat meine lokale Datenbank umgehauen. Stellen Sie sich eine Lösung vor, die die integrierten Schienen-Testaufgaben verwendet, wie stackoverflow.com/a/47006811/1154642 (die für mich funktioniert hat).
Bryanbraun
99

Führen Sie eine Testdatei aus :

rake test TEST=tests/functional/accounts_test.rb

Führen Sie einen einzelnen Test in einer Testdatei aus:

rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n /paid accounts/"

(Aus @Puhlzes Kommentar.)

laffuste
quelle
10
Wenn Sie einen einzelnen Test in der angegebenen Datei ausführen möchten, können Sie auch eine TESTOPTS-Umgebungsvariable hinzufügen, die an den Test übergeben wird. EG Rake Test TEST = tests / function / accounts_test.rb TESTOPTS = "- n / bezahlte Konten /"
Puhlze
1
Wenn der letztere Testbefehl nicht funktioniert, versuchen Sie es rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n '/paid accounts/'"( /paid accounts/in einfachen Anführungszeichen)
rrw
38

Für Schienen 5:

rails test test/models/my_model.rb
James
quelle
9
Aber dies führt alle Testfälle in der Datei aus, die Frage fragt nach einem einzigen Test ...
user000001
Sie können einen einzelnen Test ausführen, indem Sie eine Zeilennummer an einen Dateinamen bin/rails test test/models/user_test.rb:27
anhängen
29

Dank @James scheint die Antwort zu sein:

rails test test/models/my_model.rb:22

Angenommen, 22 ist die Zeilennummer des gegebenen Tests. Laut Schienen helfen:

 $ rails test --help

Sie können einen einzelnen Test ausführen, indem Sie eine Zeilennummer an einen Dateinamen anhängen:

    bin/rails test test/models/user_test.rb:27

Beachten Sie außerdem, dass Ihr Test von ActionDispatch :: IntegrationTest erben sollte, damit dies funktioniert (das war mein Fehler):

class NexApiTest < ActionDispatch::IntegrationTest
.
.
.
Roozbeh Zabihollahi
quelle
4
Dies scheint die beste Antwort zu sein, die auf den Rails-Handbüchern basiert, zumindest zum Testen einer bestimmten Linie.
Tfantina
12

In Schienen 5,

Ich habe auf diese Weise eine einzelne Testdatei ausgeführt (alle Tests in einer Datei).

rails test -n /TopicsControllerTest/ -v

Schauen Sie hier https://stackoverflow.com/a/41183694/3626659

Alupotha
quelle
1
Dies ist die beste Antwort auf die Frage für aktuelle Rails-Versionen, +1
user000001
5

So führen Sie einen einzelnen Test in der eigentlichen Rails-Suite aus:

bundle exec ruby -I"railties/test" actionpack/test/template/form_options_helper_test.rb
Brian Rose
quelle
3

Das war eine dumme Mitternachtsfrage von mir. Rails gibt freundlicherweise den Befehl aus, den es ausführt rake test. Der Rest ist eine Übung zum Ausschneiden und Einfügen.

~/projects/rails/actionpack (my2.3.4)$ ruby -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/controller/base_test.rb"
Artemave
quelle
2

Wenn Sie einen einzelnen Test ausführen möchten, können Sie diese einfach als reguläres Ruby-Skript ausführen

ruby actionmailer/test/mail_layout_test.rb

Sie können auch eine ganze Suite (z. B. ActiveRecord oder ActionMailer) ausführen, indem Sie cd-ing in das Verzeichnis eingeben und rake testdort ausführen .

Aupajo
quelle
1
Nicht in Rails - zumindest nicht mit den generierten Standardtestdateien. Sie haben "require 'test_helper'" in der ersten Zeile, aber der Ladepfad wurde nicht rechtzeitig eingerichtet. Wenn Sie jede erste Zeile in eine explizite Anforderung ändern ("require File.join (File.dirname ( FILE ), '..', 'test_helper')"), funktioniert Ihre Lösung.
James A. Rosen
ähm, das istrequire File.join(File.dirname(__FILE__), '..', 'test_helper')
James A. Rosen
@Gaius doppelt geprüft. Zuerst funktioniert man nicht, aber cd-ing in. Nur um klar zu sein (ich bin nicht sicher, ob ich das falsch lese, aber Sie haben "generierte Testdateien" gesagt), dies ist für die Rails-Bibliothek selbst, nicht für ein Rails-Projekt.
Aupajo
2

In meiner Situation rakefunktioniert nur TESTOPTS="-n='/sample/'":

bundle exec rake test TEST=test/system/example_test.rb TESTOPTS="-n='/sample/'"
N0xFF
quelle
0

Greifen Sie zuerst auf den Ordner der Bibliothek zu, die Sie testen möchten (dies ist wichtig), und führen Sie dann Folgendes aus:

~/Projects/rails/actionview (master)$ ruby -I test test/template/number_helper_test.rb 
Diego Plentz
quelle
0

Rails-Ordner

  bundle install
  bundle exec ruby -I"activerecord/test" activerecord/test/cases/relation/where_test.rb 

Beachten Sie, dass Sie den entsprechenden Ordner laden müssen: "activerecord / test" (wo Sie test haben)

Igor Kasyanchuk
quelle