Comment mettre en place MiniTest?

Je suis un testeur relativement novice, mais j’ai essayé de m’améliorer à TDD dans Rails.

RSpec fonctionne très bien, mais mes tests sont assez lents. J’ai entendu dire que MiniTest est beaucoup plus rapide et que le DSL MiniTest / Spec ressemble beaucoup à la façon dont j’ai l’habitude de travailler avec RSpec, alors j’ai pensé l’essayer.

Cependant, je n’ai rien trouvé sur le Web qui permette de savoir comment configurer et exécuter Minitest. J’ai appris à tester à partir du livre RSpec, et je ne sais pas comment Test :: Unit ou MiniTest sont censés fonctionner. J’ai le bijou dans mon gemfile, j’ai écrit quelques tests simples, mais je n’ai aucune idée où les mettre ou comment les exécuter. Je pense que c’est l’une de ces choses si évidentes que personne n’a pris la peine de l’écrire …

Quelqu’un peut-il m’expliquer comment configurer certains fichiers Minitest / spec et les faire fonctionner pour que je puisse comparer les performances avec Rspec?

MODIFIER

Plus précisément, ce sont les bases dont j’ai le plus besoin de savoir:

  1. Avez-vous besoin d’un fichier test_helper (comme spec_helper) et si oui, comment le créez-vous?
  2. Comment vous lancez minitest? Il ne semble pas y avoir d’équivalent à rspec spec ou à rspec path/to/file_spec.rb , qu’est-ce qui me manque?

Merci!

Cette question est similaire à Comment exécuter tous les tests avec minitest?

En utilisant Ruby 1.9.3 et Rake 0.9.2.2, étant donné une structure de répertoire comme celle-ci:

 Rakefile lib/alpha.rb spec/alpha_spec.rb 

Voici à quoi pourrait ressembler alpha_spec.rb :

 require 'minitest/spec' require 'minitest/autorun' # arranges for minitest to run (in an exit handler, so it runs last) require 'alpha' describe 'Alpha' do it 'greets you by name' do Alpha.new.greet('Alice').must_equal('hello, Alice') end end 

Et voici Rakefile

 require 'rake' require 'rake/testtask' Rake::TestTask.new do |t| t.pattern = 'spec/**/*_spec.rb' end 

Tu peux courir

  • tous les tests: rake test
  • un test: ruby -Ilib spec/alpha_spec.rb

Je ne sais pas si utiliser un spec_helper.rb avec minitest est commun ou non. Il ne semble pas y avoir de méthode pratique pour en charger une. Ajoutez ceci au fichier Rakefile:

 require 'rake' require 'rake/testtask' Rake::TestTask.new do |t| t.pattern = 'spec/**/*_spec.rb' t.libs.push 'spec' end 

Alors spec/spec_helper.rb peut contenir divers éléments redondants:

 require 'minitest/spec' require 'minitest/autorun' require 'alpha' 

Et spec/alpha_spec.rb remplace les parties redondantes par:

 require 'spec_helper' 
  • tous les tests: rake test
  • un test: ruby -Ilib -Ispec spec/alpha_spec.rb

Quelle version de Ruby utilisez-vous?

D’après ce que j’ai compris, la version 1.9 a introduit MiniTest , qui remplace entièrement Test::Unit , par une API rétrocompatible. Donc, si vous êtes sur 1.9 et que votre application Rails fait référence à Test::Unit , elle utilise déjà MiniTest .

Jetez un oeil à votre source Ruby – test/unit.rb pour 1.9.2 a les test/unit.rb suivantes:

 require 'minitest/unit' require 'test/unit/assertions' require 'test/unit/testcase' 

Et test/unit/assertions inclut MiniTest::Assertions .


Faire tourner vos tests plus rapidement est un autre art noir. Jetez un oeil à spork et watchr . Le premier conserve l’initialisation de votre application, recharge les fichiers modifiés et les forks avant chaque exécution de votre suite de tests. Ce dernier surveille les fichiers de votre repository pour les modifications et exécute automatiquement les scénarios de test associés.

Ensemble, ils vous offrent une configuration TDD assez moyenne. Vous écrivez un scénario de test pour votre nouveau modèle et il s’exécute automatiquement et échoue. Ensuite, chaque fois que vous enregistrez le modèle associé, ce test s’exécute très rapidement. Vous obtenez un retour quasi instantané pour savoir si vous êtes rouge / vert.

Ils sont tous deux un peu difficiles à mettre en place et à bien se comporter, alors revenez avec quelques questions supplémentaires si vous êtes coincé.

Bonne chance!

Notez que watchr ou spork ne sont pas nécessaires pour exécuter des tests. Ils sont pratiques pour faire des tests automatiques. Mais la manière la plus simple d’exécuter un ensemble de tests MiniTest est avec ruby ​​lui-même:

 $ ruby myfileoftests.rb 

Découvrez cette vidéo de démarrage pour les minitest-rails . Il parcourt le processus de configuration de Minitest pour une application Rails.

http://www.youtube.com/watch?v=xA2f2zBNvsc

La procédure montre comment créer un fichier d’aide et comment exécuter les tests à l’aide d’une tâche de râteau. Si vous souhaitez exécuter un test spécifique, vous pouvez le faire avec les éléments suivants:

 ruby -Itest test/models/user_test.rb 

Les nouvelles versions de RSpec (publiées depuis 2.8 en janvier 2012) enregistrent une augmentation spectaculaire de la vitesse. Voici une exploration des différences de performances et une comparaison avec MiniTest.

Aussi, j’ai trouvé ce screencast par Ryan Bates une excellente introduction à MiniTest. Notez que c’est l’une des vidéos professionnelles et que vous devrez vous abonner pour la regarder.

Voici mon rakefile complet, que j’ai mis dans mon répertoire principal:

 task :default => :test task :test do Dir.glob('./test/*_test.rb').each { |file| require file} end 

Pour lancer tous mes fichiers Minitest à la fois, je saisis simplement rake . C’est tout!

Assurez-vous d’avoir require 'minitest/autorun' en haut de chacun de vos fichiers Minitest. Dir.glob fonctionne certainement avec Minitest.

Pour obtenir une jolie sortie Minitest colorée, avec les noms de toutes mes méthodes de test, j’ai le fichier minitest_helper.rb dans le répertoire / test. (Doit installer les gem minitest-reporters):

 require 'minitest/reporters' Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new) require 'minitest/autorun' 

Je devais juste require_relative './minitest_helper' en haut de chacun de mes fichiers de test.

Pasortingck a écrit une très bonne explication et un exemple. Pour les futurs lecteurs, sachez que les attentes globales sont maintenant dépréciées et seront supprimées dans Minitest 6. Cela nécessite un changement presque insignifiant de la manière dont vous testez ce que vous testez dans un appel.

 require 'minitest/spec' require 'minitest/autorun' # arranges for minitest to run (in an exit handler, so it runs last) require 'alpha' describe 'Alpha' do it 'greets you by name' do expect(Alpha.new.greet('Alice')).must_equal('hello, Alice') end end