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.