Comment exécuter un seul test à partir d'une suite de tests de rails?


Réponses:


158

REMARQUE: cela n'exécute pas le test via rake. Ainsi, tout code que vous avez Rakefilene sera PAS exécuté.

Pour exécuter un seul test, utilisez la commande suivante à partir du répertoire principal de votre projet rails:

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

Cela exécute un seul test nommé "nom", défini dans la classe MyModelTest dans le fichier spécifié. Le test_name est formé en prenant le nom du test, en le précédant du mot «test», puis en séparant les mots par des traits de soulignement. Par exemple:

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

Vous pouvez exécuter les deux tests via:

ruby -I test test/unit/my_model_test.rb

et juste le deuxième test via

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

4
Cela ne fonctionne pas pour moi (sur les tests fonctionnels ou unitaires). Je reçois 0 tests, 0 assertions, 0 failures, 0 errors. Rails 3.0.7.
B Seven

10
Personnellement , je suis un fan de la forme regex: -n "/good/". L'échappement Shell est toujours amusant, donc j'ai tendance à m'en tenir à de simples expressions rationnelles, mais c'est beaucoup plus facile que d'écrire le nom complet du test tout le temps.
Groxx

4
Il est important de noter que pour que cela fonctionne, vous ne devez pas être dans le répertoire MAIN comme spécifié dans la réponse mais dans le sous-répertoire qui contient le test/dossier. Par exemple, si je veux exécuter le test, activesupport/test/core_ext/array_ext_test.rbje devrais être le activesupport/premier.
Vincent B.

3
@Groxx - Enfin une solution! Je vous remercie! -n "/good/"travaillé.
B Seven

Soyez prudent en l'exécutant en 2018+. Il contourne certaines tâches de test intégrées dans les rails (comme db: test: prepare) qui sont utilisées pour beaucoup de choses, comme échanger des données locales contre des données de fixture, et les restaurer à nouveau. L'exécution de cela a époustouflé ma base de données locale. Considérez une solution qui utilise les tâches de test de rails intégrées, comme stackoverflow.com/a/47006811/1154642 (qui a fonctionné pour moi).
bryanbraun

100

Exécutez un fichier de test :

rake test TEST=tests/functional/accounts_test.rb

Exécutez un seul test dans un fichier de test:

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

(D'après le commentaire de @Puhlze.)


10
De plus, si vous souhaitez exécuter un seul test dans le fichier donné, vous pouvez ajouter une variable d'environnement TESTOPTS qui sera transmise au test. EG rake test TEST = tests / fonctionnel / accounts_test.rb TESTOPTS = "- n / comptes payés /"
Puhlze

1
si la dernière commande de test ne fonctionne pas, essayez rake test TEST=tests/functional/accounts_test.rb TESTOPTS="-n '/paid accounts/'"( /paid accounts/avec des guillemets simples)
rrw


38

Pour les rails 5:

rails test test/models/my_model.rb

9
Mais cela exécute tous les cas de test dans le fichier, la question demande d'exécuter un seul test ...
user000001

Vous pouvez exécuter un seul test en ajoutant un numéro de ligne à un nom de fichier:bin/rails test test/models/user_test.rb:27
Segfault

30

Grâce à @James, la réponse semble être:

rails test test/models/my_model.rb:22

En supposant que 22 est le numéro de ligne du test donné. Selon l'aide des rails:

 $ rails test --help

Vous pouvez exécuter un seul test en ajoutant un numéro de ligne à un nom de fichier:

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

Veuillez également noter que votre test doit hériter de ActionDispatch :: IntegrationTest pour que cela fonctionne (c'était mon erreur):

class NexApiTest < ActionDispatch::IntegrationTest
.
.
.

4
Cela semble être la meilleure réponse basée sur les guides Rails, au moins pour tester une ligne spécifique.
tfantina


5

Pour exécuter un seul test dans la suite Rails réelle:

bundle exec ruby -I"railties/test" actionpack/test/template/form_options_helper_test.rb


3

C'était une de mes questions idiotes à minuit. Rails imprime gentiment la commande sur laquelle il s'exécute rake test. Le reste est un exercice de copier-coller.

~/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

Si vous souhaitez exécuter un seul test, vous pouvez simplement les exécuter en tant que script Ruby standard

ruby actionmailer/test/mail_layout_test.rb

Vous pouvez également exécuter une suite complète (par exemple ActiveRecord ou ActionMailer) en cd-ing dans le répertoire et en exécutant rake testà l' intérieur.


1
Pas dans Rails - du moins pas avec les fichiers de test par défaut générés. Ils ont "require 'test_helper'" sur la première ligne, mais le chemin de chargement n'aura pas été configuré à temps. Si vous changez chaque première ligne en un require explicite ("require File.join (File.dirname ( FILE ), '..', 'test_helper')"), alors votre solution fonctionne.
James A. Rosen

ahem, c'estrequire File.join(File.dirname(__FILE__), '..', 'test_helper')
James A. Rosen

@Gaius Double-vérifié. Le premier ne fonctionne pas, mais cd-ing le fait. Juste pour être clair (je ne sais pas si j'ai mal lu ceci, mais vous avez dit "fichiers de test générés"), c'est pour la bibliothèque Rails elle-même, pas pour un projet Rails.
Aupajo

2

Dans ma situation pour rakene fonctionne que TESTOPTS="-n='/sample/'":

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

0

Tout d'abord, accédez au dossier de la bibliothèque que vous souhaitez tester (c'est important) puis exécutez:

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

0

Dossier Rails

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

Notez que vous devez charger le dossier approprié: "activerecord / test" (où vous avez test)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.