web-dev-qa-db-fra.com

Comment configurer MiniTest?

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:

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

Merci!

47
Andrew

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

  • tous les tests: rake test
  • un 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'
  • tous les tests: rake test
  • un test: Ruby -Ilib -Ispec spec/alpha_spec.rb
40
Patrick

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
4
cczona

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!

4
nfm

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
3
blowmage

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.

1
Raymond Gan

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.

1
SnapShot

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
0
Chris McAnally