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

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.)


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

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
.
.
.

4
Dies scheint die beste Antwort zu sein, die auf den Rails-Handbüchern basiert, zumindest zum Testen einer bestimmten Linie.
Tfantina


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

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"


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 .


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/'"

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 

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)

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.