Comment démarrer sur TDD avec Ruby on Rails? [fermé]

167

Je connais bien les concepts (j'ai suivi des cours de test à l'université), mais je ne sais pas encore comment les utiliser vraiment car je n'ai jamais travaillé sur un "vrai" projet TDD.

Je suis sur le point de commencer le développement d'un projet en utilisant Ruby on Rails (probablement en utilisant 2.3). Cette application sera utilisée pour gérer les données, les utilisateurs et certains fichiers. Ce ne sera pas trop compliqué au début, mais pourrait évoluer beaucoup dans les 6 prochains mois, donc je pense que c'est le bon moment pour se lancer davantage dans le TDD.

J'ai une idée de base sur la façon de le faire, mais j'ai encore besoin de quelques pointeurs et conseils:

  • Quel article de Ruby on Rails TDD 101 dois-je lire?

  • Que dois-je tester?

  • Quel gem / plugin dois-je utiliser?

  • Dois-je utiliser rspec ? Autre chose?

  • Une fois que j'ai toutes mes classes de test, comment puis-je les déployer? (par exemple: intégration continue)

  • Combien de temps le TDD prend-il vraiment?

  • Dois-je lire un livre à ce sujet ou puis-je tout obtenir simplement en jouant avec et en lisant des didacticiels en ligne? Si j'ai besoin de lire un livre, quel livre?


J'aime apprendre avec des exemples, alors quelqu'un pourrait-il me dire comment j'irais et adopter une approche TDD pour résoudre ce problème:

J'ai des entreprises. J'ai des contacts. Un contact peut être lié à 1 entreprise. Une entreprise peut avoir plusieurs contacts. Je veux créer des moyens de créer des contacts, des entreprises et lier des contacts à des entreprises.

Vous n'êtes pas obligé d'utiliser cet exemple dans votre réponse mais cela aiderait :)

Marcgg
la source

Réponses:

202

Quel article de Ruby on Rails TDD 101 dois-je lire?

Je commencerai par un guide pour tester les applications de rails .

Aussi Railscast a d'excellents screencasts sur la façon d'utiliser différents outils de test.

Que dois-je tester?

Je vais commencer par les modèles, car ils sont faciles à tester. La règle simple est que vous devez couvrir chaque instruction if de votre test.

Vous devez tester le but de la méthode (pour vous assurer qu'elle fonctionne comme prévu) ainsi que tous les cas extrêmes.

Assurez-vous également de ne pas trop tester.

Quel gem / plugin dois-je utiliser? Dois-je utiliser rspec? Autre chose?

Lorsque vous commencez, utilisez simplement Test Unit. Vous pouvez utiliser rspecou cucumberaprès vous être familiarisé avec les bases.

Autotestest un bon outil à avoir si vous voulez vraiment être testé. Mais c'est un «bon avoir» pas obligatoire.

Une fois que j'ai toutes mes classes de test, comment puis-je les déployer?

Pas sûr de la question. Vous ne déployez généralement pas les tests. Une fois que vous avez toutes vos classes de test, tapez simplement «rake test» pour exécuter tous vos tests.

Combien de temps le TDD prend-il vraiment?

Cela fait vraiment gagner du temps. Si vous aimez le labyrinthe, vous savez qu'il est presque toujours plus facile de le résoudre si vous passez de la fin au début. Idem avec TDD. Sans Test Driven, vous pensez constamment «que dois-je faire ensuite». Avec Test Driven, le test vous dira quoi faire ensuite (il casse si la logique n'est pas là, il vous suffit donc de réparer la pièce cassée). De plus, vous avez moins de bogues, ce qui vous fera gagner beaucoup de temps à long terme.

Dois-je lire un livre à ce sujet ou puis-je tout obtenir simplement en jouant avec et en lisant des didacticiels en ligne? Si j'ai besoin de lire un livre, quel livre?

Vous n'avez pas besoin d'un livre. La façon la plus efficace d'apprendre quoi que ce soit est: faites-le. Revenez au livre ou aux ressources en ligne une fois que vous rencontrez une question ou un problème. C'est aussi agile.

Dans votre exemple, les éléments à tester sont les suivants: un contact peut être lié à une entreprise, une entreprise peut avoir plusieurs contacts, créer des moyens de créer des contacts et lier des contacts à des entreprises.

class CompanyTest <Test::Unit
    def test_relationship # test associations/relationships
        c = companies(:some_company)
        assert_equal [a list of contacts], c.contacts # make sure a company can have multiple contacts
    end
end

class ContactTest<Test::Unit
   def  test_relationships
        c = contact(:some_contact)
        assert_equal some_company, c.company # make sure the contact link to 1 company
   end

   def  test_create/add
        # test create contacts, here you need to make sure the contact is created correctly, and linked to company correctly
   end
end
ez.
la source
3
Le lien vers l'article est cassé, mais il l'a trouvé ici: web.archive.org/web/20100325215651/http://bloritsch.d-haven.net/…
fivetwentysix
13

J'ai produit une série vidéo de 6 épisodes qui a été enseignée en classe publique à San Francisco à l'été 2010. Le matériel couvre les tests et l'efficacité des développeurs dans Rails 2.3 en utilisant RSpec 1.3. Légèrement daté, mais les principaux concepts s'appliquent à Rails 3 avec Rspec 2.x

http://www.rubyfocus.biz/class_video/2010/07/19/rails_tdd_class_1.html

Wolfram Arnold
la source
5

TDD consiste d'abord à écrire des tests. Cela vous oblige essentiellement à écrire votre propre client avant d'écrire votre code d'application. Le cycle consiste généralement à écrire un test pour une API qui n'existe pas, à exécuter le test en s'attendant à ce qu'il échoue, à écrire votre code API, à réexécuter votre test et à vous assurer qu'il réussit. Ensuite, écrivez votre prochain test ... et ainsi de suite.

Vous pourriez également être intéressé par ce guide Rails .

Andy Gaskell
la source
3

Quel gem / plugin dois-je utiliser?

J'ai toujours apprécié shoulda .

Combien de temps le TDD prend-il vraiment?

La raison pour laquelle j'ai toujours favorisé le développement TDD est qu'il se concentre sur la façon dont je vais implémenter un morceau de code spécifique. J'ai le sentiment anecdotique que chaque fois que j'adhère plus fortement aux principes TDD, je passe moins de temps à retravailler plus tard. Le temps passé dépend de la façon dont vous écrivez des tests unitaires. Si les tests unitaires ne capturent pas le comportement attendu, tout le temps passé sur eux est perdu.

Patrick Robertson
la source