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

131

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

rake test ANYTHING semble ne pas aider.

artémave
la source
duplication possible de l'unité
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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
Darryl
la source
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.)

laffuste
la source
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
James
la source
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
.
.
.
Roozbeh Zabihollahi
la source
4
Cela semble être la meilleure réponse basée sur les guides Rails, au moins pour tester une ligne spécifique.
tfantina
12

Dans les rails 5,

J'ai utilisé cette façon d'exécuter un seul fichier de test (tous les tests dans un seul fichier)

rails test -n /TopicsControllerTest/ -v

regardez ici https://stackoverflow.com/a/41183694/3626659

Alupotha
la source
1
c'est la meilleure réponse à la question pour les versions de rails récentes, +1
user000001
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
Brian Rose
la source
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"
artémave
la source
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.

Aupajo
la source
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/'"
N0xFF
la source
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 
Diego Plentz
la source
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)

Igor Kasyanchuk
la source