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.