Je suis un testeur assez novice, mais j'essaie de m'améliorer à TDD dans Rails.
RSpec fonctionne très bien, mais mes tests sont plutôt lents. J'ai entendu dire que le MiniTest est beaucoup plus rapide et que le DSL du MiniTest/Spec ressemble assez à mon habitude de travailler avec RSpec, j'ai donc décidé de l'essayer.
Cependant, je n'ai trouvé aucun élément sur le Web qui explique en détail la configuration et l'exécution de Minitest. J'ai appris à tester dans le livre RSpec et je ne sais pas du tout comment fonctionne Test :: Unit ou MiniTest. J'ai la gemme dans mon gemfile, j'ai écrit quelques tests simples, mais je ne sais pas où les placer ni comment les exécuter. Je pense que c’est 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 afin que je puisse comparer les performances à Rspec?
MODIFIER
Ce sont précisément les bases que je dois le plus savoir:
rspec spec
ou rspec path/to/file_spec.rb
, que me manque-t-il?Merci!
Cette question est similaire à Comment exécuter tous les tests avec minitest?
Utiliser Ruby 1.9.3 et Rake 0.9.2.2, avec une disposition 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
rake test
Ruby -Ilib spec/alpha_spec.rb
Je ne sais pas si l'utilisation d'un spec_helper.rb
avec minitest est courante ou non. Il ne semble pas y avoir de méthode pratique pour en charger une. Ajoutez ceci au 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 diverses choses redondantes:
require 'minitest/spec'
require 'minitest/autorun'
require 'alpha'
Et spec/alpha_spec.rb
remplace les parties redondantes par:
require 'spec_helper'
rake test
Ruby -Ilib -Ispec spec/alpha_spec.rb
Notez que watchr ou spork ne sont pas obligatoires pour l'exécution de tests. Ils sont pratiques pour l'autotest. Mais la manière la plus simple d’exécuter un ensemble de tests MiniTest consiste à utiliser Ruby lui-même:
$ Ruby myfileoftests.rb
Quelle version de Ruby utilisez-vous?
D'après ma compréhension, 1.9 a introduit MiniTest
, qui remplace Test::Unit
entièrement, avec une API compatible avec les versions antérieures. Ainsi, si vous utilisez la version 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 exigences suivantes:
require 'minitest/unit'
require 'test/unit/assertions'
require 'test/unit/testcase'
Et test/unit/assertions
inclut MiniTest::Assertions
.
Obtenir vos tests pour courir plus vite est un tout autre art sombre. Jetez un oeil à spork et watchr . La première conserve votre application initialisée, recharge les fichiers modifiés et les fourchettes avant chaque exécution de votre suite de tests. Ce dernier surveille les modifications apportées aux fichiers de votre référentiel et exécute automatiquement les scénarios de test associés.
Ensemble, ils vous donnent une configuration TDD plutôt moyenne. Vous écrivez un scénario de test pour votre nouveau modèle, qui s'exécute automatiquement et échoue. Ensuite, chaque fois que vous enregistrez le modèle associé, ce test est relancé très rapidement. Vous obtenez un retour quasi instantané sur si vous êtes rouge/vert.
Ils sont tous les deux un peu difficiles à mettre en place et à bien se comporter, alors revenez avec quelques questions si vous êtes bloqué.
Bonne chance!
Regardez cette vidéo de démarrage pour minitest-Rails . Il décrit le processus de configuration de l'application Minitest pour une application Rails.
http://www.youtube.com/watch?v=xA2f2zBNvsc
La procédure pas à pas montre comment créer un fichier d'assistance et comment exécuter les tests à l'aide d'une tâche rake. 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
Voici ma rakefile
entière, que je mets dans mon répertoire principal:
task :default => :test
task :test do
Dir.glob('./test/*_test.rb').each { |file| require file}
end
Pour exécuter tous mes fichiers Minitest à la fois, il suffit de taper rake
. C'est tout!
Assurez-vous que require 'minitest/autorun'
figure en haut de chacun de vos fichiers Minitest. Dir.glob travaille 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 mon répertoire/test. (J'ai dû installer le gem minitest-reporters):
require 'minitest/reporters'
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new)
require 'minitest/autorun'
Je viens de devoir require_relative './minitest_helper'
en haut de chacun de mes fichiers de test.
Les nouvelles versions de RSpec (depuis la version 2.8 publiées en janvier 2012) connaissent une augmentation spectaculaire de la vitesse. Ici est une exploration des différences de performances et une comparaison avec MiniTest.
De plus, j'ai trouvé this screencast de Ryan Bates une excellente introduction à MiniTest. Notez qu'il s'agit d'une des vidéos professionnelles et que vous devrez vous abonner pour la regarder.
Patrick a écrit une très bonne explication et exemple. Pour les futurs lecteurs, sachez simplement que les attentes globales sont maintenant amorties et seront supprimées dans Minitest 6. Cela nécessite un changement presque trivial dans l'intégration de la chose que vous testez dans un appel à expect
.
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