web-dev-qa-db-fra.com

Minitest et Rspec

Je viens de regarder un Railscast pour Minitest.

Quels sont les avantages et les inconvénients d'utiliser RSpec vs Minitest pour tester une application Rails? Quelles fonctionnalités vais-je perdre lors de la conversion de RSpec en Minitest?

49
GTDev

Je suis l'un des développeurs RSpec, et je n'ai jamais utilisé de minitest, alors tenez compte de mes biais lors de la lecture de cette réponse.

Dans l'ensemble, la puissance de RSpec vient du fait qu'il réifie tant de concepts de test en objets de première classe. Lorsque Test :: Unit et Minitest utilisent des méthodes simples pour faire des assertions, RSpec utilise des objets de correspondance de première classe qui prennent en charge la négation, l'auto-description et plus encore. Les exemples de RSpec sont des objets de première classe qui prennent en charge des métadonnées riches; minitest/spec compile les blocs it en méthodes simples, qui ne prennent pas en charge le même type de métadonnées riches. RSpec prend en charge la spécification de comportements partagés à l'aide d'une construction de première classe (groupes d'exemples partagés) qui accepte des arguments; w/minitest vous pouvez utiliser héritage ou mixin pour réutiliser les tests , mais il n'a pas le même type de support de première classe. RSpec a une API de formateur explicite (et il existe de nombreux formateurs tiers qui l'utilisent); Je ne suis pas au courant que minitest ait le même type d'API de formateur de première classe.

En tant que personne qui effectue constamment des tests et pratique le TDD toute la journée, je trouve que la puissance que RSpec me donne est très utile. Cependant, beaucoup de gens trouvent cela excessif et il y a un coût cognitif supplémentaire pour les abstractions supplémentaires.

Voici quelques fonctionnalités spécifiques à RSpec qui, je pense, manquent au minitest:

  • before(:all) hooks (notez que c'est une fonctionnalité utilisateur expérimenté de RSpec qui devrait rarement être utilisée; je ne l'ai utilisée qu'à quelques reprises depuis de nombreuses années d'utilisation de RSpec)
  • around(:each) crochets
  • Groupes d'exemples partagés
  • Contextes partagés
  • Prise en charge de métadonnées riches qui peut être utilisée pour contrôler les exemples à exécuter, les groupes d'exemples dans lesquels les contextes partagés sont inclus, les groupes d'exemples auxquels les modules sont mélangés, etc.
  • Prise en charge intégrée d'une large gamme de fonctionnalités de simulation avec rspec-mocks; Minitest :: Mock est beaucoup plus simple et plus limité en comparaison.
  • RSpec a rspec-fire , ce qui est génial.

Avantages d'utiliser Minitest:

  • Il est intégré à la bibliothèque standard, vous n'avez donc pas besoin d'installer quoi que ce soit supplémentaire.
  • Il peut être utilisé dans def test_blah ou it 'blah' modes.
  • La base de code est très petite et simple. RSpec, en raison de son âge avancé et de ses fonctionnalités supplémentaires, est plus grand en comparaison.
  • Minitest se charge plus rapidement que RSpec (il s'agit d'environ 4 fichiers de code par rapport à RSpec ayant de nombreux fichiers répartis sur 3 gemmes) - mais notez que RSpec n'est en aucun cas lent; dans la plupart de mes projets ces jours-ci, je reçois des commentaires de test de RSpec en moins d'une seconde (et souvent en moins de 500 ms).

Dans l'ensemble, c'est un peu comme Sinatra vs Rails, et je pense que Minitest et RSpec sont tous deux de bons choix en fonction de vos besoins.

Une dernière chose: s'il y a des aspects spécifiques de Minitest que vous préférez, mais d'autres choses que vous préférez dans RSpec, ils peuvent facilement être mélangés et appariés. I a écrit un article à ce sujet , si cela vous intéresse.

74
Myron Marston

J'ai converti en Minitest de style spec à partir de Test/Unit avec shoulda, et ça rapporte. Il supprime le passe-partout et ils disent que cela améliore également la vitesse. Je n'ai jamais vraiment utilisé RSpec. Au lieu de cela, j'ai écrit mon propre cadre de test et de simulation primitif (juste pour comprendre la simulation, je l'ai abandonné lors du passage à Minitest). Je pense que le stubbing/mocking dans RSpec pourrait être plus avancé, donc si vous l'avez déjà appris, continuez à l'utiliser. Sinon, restez avec Minitest, qui vous permettra de collaborer avec des gens ignorants de RSpec, comme moi.

4
Boris Stitnicky