it-swarm-fr.com

Comment tester les tests?

Nous testons notre code pour le rendre plus correct (en fait, moins susceptible d'être incorrect). Cependant, les tests sont également des codes - ils peuvent également contenir des erreurs. Et si vos tests sont buggy, ils rendent à peine votre code.

Je peux penser à trois types d'erreurs possibles dans les tests:

  1. Erreurs logiques, lorsque le programmeur a mal compris la tâche, et les tests font ce qu'il pensait pouvoir faire, ce qui ne va pas;

  2. Erreurs dans le cadre de test sous-jacent (par exemple, une abstraction moqueuse qui fuit);

  3. Bugs dans les tests: Le test se passe légèrement différent de ce que le programmateur pense que c'est.

Type (1) Les erreurs semblent être impossibles à prévenir (à moins que le programmeur juste ... devient plus intelligent). Cependant, (2) et (3) peuvent être traitables. Comment gérez-vous ces types d'erreurs? Avez-vous des stratégies spéciales pour les éviter? Par exemple, écrivez-vous des tests spéciaux "vides", qui ne vérifiez que les présuppositions de l'auteur de test? De plus, comment approchez-vous de déboguer un cas de test cassé?

54
Ryszard Szopa

essayez de faire des tests individuels aussi petits que possible.

Cela devrait réduire les chances de créer un bogue en premier lieu. Même si vous parvenez à en créer un, il est plus facile de trouver. Les tests d'unités sont censés être petits et spécifiques, avec une faible tolérance pour l'échec et la déviation.

En fin de compte, c'est probablement juste une question d'expérience. Plus vous écrivez des tests, mieux vous le ferez, moins vous devez faire des chances de faire des tests de merde.

24
dr Hannibal Lecter

Une tactique consiste à écrire le test avant que le code ne teste et assurez-vous que le test échoue d'abord pour la bonne raison. Si vous utilisez [~ # ~ # ~] TDD [~ # ~] Vous devez obtenir au moins ce niveau de test des tests.

Un moyen plus exhaustif de tester la qualité d'une suite de tests consiste à utiliser Test de mutation .

19
Don Roby

Pour les tests d'unités n ° 1 et n ° 3: ne doit contenir aucune logique, si vous le faites, vous testez probablement plus d'une chose dans votre test de l'unité. Une meilleure pratique pour le test de l'unité est de disposer d'un seul test par test d'unité.

Regardez cette vidéo de Roy Osherove Pour en savoir plus sur la rédaction de tests de l'unité.

4
Piers Myers

En ce qui concerne # 1 - je pense que c'est une bonne idée de faire une paire/code de code de ce côté des choses. Il est facile de faire des présuppositions ou de simplement vous tromper, mais si vous devez expliquer ce que votre test fait, quel est le point, vous êtes plus susceptible de ramasser si vous visez la mauvaise cible.

3
Sam J

Il doit y avoir un point où il faut cesser d'essayer de tester un appareil. Devrait savoir quand dessiner la ligne. Devrions-nous écrire des cas de test pour tester les cas de test? Qu'en est-il des nouveaux cas de test écrits dans des cas de test de test? Comment allons-nous les tester?

if (0 > printf("Hello, world\n")) {
  printf("Printing \"Hello, world\" failed\n");
}

Edit: Mis à jour avec Explication Comme suggéré par commentaire.

2
aufather

Les tests ne devraient pas être suffisamment "intelligents" pour abriter des bugs.

Le code que vous écrivez implémente un ensemble de spécifications. (Si x puis y, sauf si z dans quel cas q, etc, etc). Tous les tests devraient essayer d'accomplir, c'est déterminer que X est vraiment Y, sauf si z dans quel cas Q. Cela signifie que tout un test doit être effectué est de définir x et vérifiant Y.

Mais cela ne couvre pas tous les cas, vous dites probablement et vous auriez raison. Mais si vous faites le test "intelligent" suffisamment pour savoir que x ne devrait être que par y, sinon z, alors vous réémayez essentiellement la logique commerciale dans le test. C'est problématique pour des raisons pour lesquelles nous allons passer à un peu plus profondément ci-dessous. Vous ne devriez pas améliorer la couverture du code en faisant votre premier test "plus intelligent", vous devez ajouter un deuxième test muet qui définit X et Z et vérifie Q. De cette façon, vous aurez deux tests qui couvre le cas général ( Parfois également appelé chemin heureux) et celui qui couvre le boîtier de bord comme test séparé.

Il y a un certain nombre de raisons pour cela, avant tout comment déterminez-vous si un test échoué est dû à un bogue dans la logique commerciale ou à un bogue dans les tests? Évidemment, la réponse est que si les tests sont aussi simples que possible, ils sont très peu susceptibles d'accueillir des bugs. Si vous pensez que vos tests nécessitent des tests, vous testez le mal.

Parmi les autres raisons, citons que vous venez de répliquer les efforts (comme je l'ai déjà mentionné, écrivez un test suffisamment intelligent pour exercer toutes les possibilités dans un seul test consiste essentiellement à reproduire la logique commerciale que vous essayez de tester en premier lieu), si les exigences changent Ensuite, les tests doivent être faciles à changer pour refléter les nouvelles exigences, les tests servir de documentation (ils sont un moyen formel de dire quelle est la spécification de l'unité à tester), etc.), etc.

TL: DR: Si vos tests ont besoin de tests, vous le faites mal. Écrivez des tests muettes.

2
GordonM

Hey.
[.____] Vous avez des applications:

  • Ton produit
  • Votre test pour ce produit.

Lorsque vous exécutez des tests contre votre produit, vous n'êtes réellement pas intéressé en test lui-même, mais dans interaction entre votre produit et vos tests. Si le test échoue, il ne dis pas que l'application a un bug. Il dit que interaction entre le produit et le test n'a pas été réussi . Maintenant, c'est votre travail de déterminer ce qui s'est mal passé. Il peut être soit:

  • l'application ne se comporte pas comme prévu (cette attente est exprimée dans votre test)
  • l'application se comporte correctement, vous n'avez tout simplement pas documenté ce comportement correctement (dans vos tests).

Pour moi, les tests échouent ne sont pas des commentaires simples, que Ceci et c'est faux. Il est indicateur qu'il y a une incohérence et je dois examiner les deux pour vérifier que vous avez mal tourné. À la fin, je suis responsable de la vérification de cette application, les tests ne sont qu'un outil pour mettre en évidence des domaines pouvant être vérifiés.

Les tests ne vérifient que certaines parties de l'application. Je teste l'application, je teste les tests.

2
yoosiba

Pas une réponse (je n'ai pas le privilège de commenter), mais je me demandais si vous avez oublié d'autres raisons de développer des cas de test ...
[.____] Une fois que vous avez compris tous les bugs des tests, vous pouvez régler votre application facilement. Les suites de test automatisées vous aideraient à trouver des problèmes plus tôt, avant l'intégration. Les modifications apportées aux exigences sont relativement plus faciles à tester, car les changements peuvent devenir plus récents, la version modifiée des espaces de test plus anciens qui passent et les cas plus anciens restent pour ramasser les échecs.

0
CMR

Réponse courte: Le code de production teste les tests.

Comparez ceci au modèle de crédit/de débit utilisé en économie. Les mécaniciens sont très simples - si le crédit diffère du débit, il y a quelque chose qui ne va pas.

il va de même pour les tests d'unité - si un test échoue, cela indique que quelque chose est faux. C'est peut-être le code de production, mais cela pourrait être le code de test! Cette dernière partie si importante.

Notez que vos bugs de type (1) ne peuvent pas être trouvés par des tests unitaires. Pour éviter ces types de bugs, vous avez besoin d'autres outils.

0
vidstige