2015-07-15 2 views
10

Cela m'a rendu fou ces derniers temps ...Comment refactoriser les tests unitaires?

Qu'est-ce que le refactoring?

code refactoring est le processus de restructuration code informatique existant - changer l'affacturage - sans changer son comportement extérieur.

Et comment pouvons-nous assurer que nous ne brisons pas quoi que ce soit pendant la refactorisation?

Avant de refactoriser une section de code, un ensemble solide de tests unitaires automatiques est nécessaire. Les tests sont utilisés pour démontrer que le comportement du module est correct avant le refactoring.

Très bien. Mais comment procéder si je trouve une odeur de code dans les tests unitaires eux-mêmes? Dites, une méthode de test qui en fait trop? Comment puis-je m'assurer que je ne casse rien pendant la refonte des tests unitaires?

Ai-je besoin de méta-tests? Est-ce que ce sont des tests unitaires tout le long?

Ou bien les tests unitaires ne répondent-ils tout simplement pas aux règles normales du refactoring?

Répondre

5

Dans mon expérience, il y a two reasons to trust tests:

  • Review
  • Vous avez vu échouer

Les deux sont des activités qui se produisent lors de l'écriture d'un test. Si vous maintenez les tests immuables, vous pouvez continuer à leur faire confiance.

Chaque fois que vous modifiez un test, il devient moins fiable. Vous pouvez résoudre ce problème en répétant le processus ci-dessus: passez en revue les modifications apportées aux tests et modifiez temporairement le System Under Test (SUT) pour que les tests échouent comme prévu.

Lors de la modification des tests, laissez le SUT inchangé. Les tests et le code de production se contrôlent les uns les autres, donc en variant un tout en gardant l'autre est le plus sûr.

3

Comment puis-je m'assurer que je ne casse rien pendant la refonte des tests unitaires? Conserver les anciens tests comme référence.

Conserver les anciens tests comme référence.


Elaborer: tests unitaires avec une bonne couverture valent leur poids dans les résultats . Vous ne les gardez pas pour la structure étonnante du programme ou le manque de duplication; ils sont essentiellement un ensemble de données de paires d'entrées/sorties utiles. Ainsi, lors des tests de "refactoring", il est vraiment important que le programme testé avec le nouvel ensemble présente le même comportement. Chaque différence doit être soigneusement inspectée manuellement car de nouveaux bogues ont pu être détectés.

Vous pouvez également accidentellement réduire la couverture lors du refactoring. C'est plus difficile à trouver et nécessite des outils d'analyse de couverture spécialisés.

+0

Peut-être que la prochaine présentation de Rich Hickey s'appellera "Tests as values"? :) – fredoverflow

+0

@fredoverflow Incidemment, voir mon édition. –

+0

"Vous pourriez aussi accidentellement réduire la couverture lors du refactoring" est exactement ce que j'ai peur de ... – fredoverflow

0

vous ne savez pas que vous ne casserez rien. pour éviter le problème de 'qui va tester nos tests?' vous devriez garder les tests aussi simples que possible pour réduire la possibilité de faire une erreur.

lorsque vous effectuez un refactoring tests que vous pouvez toujours utiliser refactoring automatique ou autre « de confiance » des méthodes telles que l'extraction de la méthode, etc.

vous utilisez souvent des frameworks de tests existants. ils sont testés par leurs créateurs.donc quand vous commencez à construire votre propre (même simple) cadre, les méthodes d'aide complexes, etc., vous pouvez toujours tester

4

En ce qui concerne c'est un post plus ancien, il a été référencé in a comment sur mon post sur TDD in practice. Donc, après examen, je voudrais jeter mes deux cents.

Principalement parce que je me sens le accepted answer fait la déclaration glissante:

Chaque fois que vous modifiez un test, il devient moins digne de confiance.

Je ne suis pas d'accord avec le mot modifier. En ce qui concerne refactoring tels mots comme changement, modifier, etc sont souvent évités car ils portent des implications contre le refactoring.

Si vous modifiez un test dans le sens traditionnel il existe un risque que vous a apporté un changement qui a fait le test moins digne de confiance.

Cependant, si vous modifiez un test dans le sens refactor le test doit être pas moins digne de confiance.

Cela me ramène à la question initiale:

Comment puis-je Refactor des tests unitaires?

Tout simplement, identique à n'importe quel autre code - isolé. Donc, si vous voulez refactoriser vos tests, ne changez pas le code, changez simplement vos tests.

Ai-je besoin d'un test pour mes tests?

No. En fait, Kent Beck aborde cette question dans son exacte Full Stack Radio interview, en disant:

Votre code est le test pour vos tests

Mark Seemann note également cette dans his answer:

Tests et code de production tenez-vous l'un l'autre en contrôle, alors varier l'un tout en gardant l'autre verrouillé est le plus sûr.

En fin de compte, ce n'est pas tant sur la façon de factoriser des tests autant qu'il est refactoring en général. Les mêmes principes s'appliquent, à savoir le refactoring restructure le code sans changer son comportement externe. Si vous ne changez pas le comportement externe, aucune confiance n'est perdue.