Il y a un certain nombre de questions sur ce site qui donnent beaucoup d'informations sur les avantages qui peuvent être tirés des tests automatisés. Mais je n'ai rien vu qui représente l'autre côté de la médaille: quels sont les inconvénients? Tout dans la vie est un compromis et il n'y a pas de balles d'argent, donc il doit sûrement y avoir des raisons valables de ne pas faire de tests automatisés. Que sont-ils?
Voici quelques-uns que j'ai trouvé:
Modifier
Je dois dire que je suis un grand partisan des tests automatisés, et je ne cherche pas à être convaincu de le faire. Je cherche à comprendre quels sont les inconvénients, donc quand je vais dans mon entreprise pour en faire un cas, je n'ai pas l'air de lancer la prochaine balle argentée imaginaire.
Aussi, je suis explicite pas à la recherche de quelqu'un pour contester mes exemples ci-dessus. Je prends pour vrai qu'il doit avoir des inconvénients (tout a des compromis) et je veux comprendre ce que c'est.
Vous avez à peu près cloué les plus importants. J'ai quelques ajouts mineurs, plus l'inconvénient que les tests réussissent réellement - quand vous ne le voulez pas vraiment (voir ci-dessous).
Temps de développement: avec le développement piloté par les tests, cela est déjà calculé pour les tests unitaires, mais vous avez toujours besoin de tests d'intégration et de système, qui peuvent également avoir besoin de code d'automatisation. Le code écrit une fois est généralement testé à plusieurs étapes ultérieures.
Niveau de compétence: bien sûr, les outils doivent être pris en charge. Mais ce n'est pas seulement votre propre équipe. Dans un projet plus important, vous pouvez avoir une équipe de test distincte qui écrit des tests pour vérifier les interfaces entre le produit de votre équipe et les autres. Beaucoup plus de gens doivent avoir plus de connaissances.
Besoins en outillage: vous êtes sur place. Pas grand chose à ajouter à cela.
Échec des tests: c'est le vrai bugger (pour moi en tout cas). Il y a un tas de raisons différentes, chacune pouvant être considérée comme un inconvénient. Et le plus gros inconvénient est le temps nécessaire pour décider laquelle de ces raisons s'applique réellement à votre test échoué.
Tests non échoués: ils sont également un inconvénient et peuvent être assez mauvais. Cela arrive surtout lorsque vous changez les choses et que vous vous rapprochez de ce qu'Adam a répondu. Si vous modifiez quelque chose dans le code de votre produit, mais que le test n'en tient pas compte, cela vous donne ce "faux sentiment de sécurité".
Un aspect important des tests qui n'ont pas échoué est qu'un changement d'exigences peut entraîner la invalidité d'un comportement antérieur. Si vous disposez d'une traçabilité décente, la modification des exigences doit pouvoir être mise en correspondance avec votre code de test et vous savez que vous ne pouvez plus faire confiance à ce test. Bien sûr, le maintien de cette traçabilité est encore un autre inconvénient. Et si vous ne le faites pas, vous vous retrouvez avec un test qui n'échoue pas, mais vérifie en fait que votre produit fonctionne à tort. Quelque part sur la route, cela vous frappera .. généralement quand/où vous vous y attendez le moins.
Coûts de déploiement supplémentaires: vous ne faites pas que des tests unitaires en tant que développeur sur votre propre machine. Avec les tests automatisés, vous souhaitez les exécuter sur les validations des autres à un endroit central pour savoir quand quelqu'un a interrompu votre travail. C'est bien, mais il faut aussi le mettre en place et le maintenir.
Après avoir commencé à essayer des tests automatisés dans notre équipe, le plus gros inconvénient que j'ai vu est qu'il est très difficile d'appliquer un code hérité qui n'a pas été conçu avec des tests automatisés en tête. Cela améliorerait sans aucun doute notre code à long terme, mais le niveau de refactorisation nécessaire pour les tests automatisés tout en conservant notre raison est une barrière très élevée à l'entrée à court terme, ce qui signifie que nous devrons être très sélectifs sur l'introduction de l'automatisation. tests unitaires afin de respecter nos engagements à court terme. En d'autres termes, il est beaucoup plus difficile de rembourser les cartes de crédit lorsque vous êtes déjà lourdement endetté.
L'inconvénient le plus important est peut-être ... les tests sont du code de production. Chaque test que vous écrivez ajoute du code à votre base de code qui doit être maintenu et pris en charge. Ne pas le faire conduit à des tests dont vous ne croyez pas les résultats, vous n'avez donc pas d'autre choix. Ne vous méprenez pas - je suis un grand défenseur des tests automatisés. Mais tout a un coût, et c'est un gros.
Je ne dirais pas que ce sont des inconvénients entièrement applicables, mais les quelques-uns que j'ai touchés le plus sont:
Une couverture inégale peut conduire à un faux sentiment de sécurité. Si vous faites un refactoriseur et utilisez les tests pour prouver sa validité, qu'est-ce qui a prouvé que vos tests sont en mesure de le prouver?
Le temps qu'il faut pour créer le test est parfois un problème pour nous. Nos tests automatisés n'incluent pas seulement des tests unitaires, mais utilisent également des tests de cas. Celles-ci ont tendance à être plus larges et nécessitent un contexte.
Bien sûr, mon point de vue est d'une application qui est plus ancienne que ses tests unitaires.
Je dirais que le principal problème avec eux est qu'ils peuvent fournir un faux sentiment de sécurité. Tout simplement parce que vous avez des tests unitaires, cela ne signifie pas qu'ils sont réellement faire quoi que ce soit et cela inclut de tester correctement les exigences.
De plus, les tests automatisés peuvent également inclure des bogues eux-mêmes , ce qui pose la question si les tests unitaires doivent être testés eux-mêmes donc pas nécessairement réaliser quoi que ce soit.
Bien que les tests d'automatisation présentent de nombreux avantages, ils présentent également leurs propres inconvénients. Certains des inconvénients sont:
Certains des inconvénients ci-dessus soustraient souvent les avantages tirés des scripts automatisés. Bien que les tests d'automatisation aient des avantages et des inconvénients, ils sont largement adaptés dans le monde entier.
J'ai récemment demandé ne question sur les tests de développement de jeux - c'est BTW comment je connaissais celui-ci. Les réponses y indiquaient des inconvénients curieux et spécifiques:
Le 4ème point me fait penser à une de mes expériences. J'ai travaillé sur une entreprise très maigre, orientée XP et gérée par Scrum, où les tests unitaires étaient fortement recommandés. Cependant, dans sa voie vers un style plus léger et moins bureaucratique, l'entreprise a simplement négligé la construction d'une équipe d'assurance qualité - nous n'avions pas de testeurs. Si fréquemment, les clients ont trouvé des bugs triviaux en utilisant certains systèmes, même avec une couverture de test> 95%. J'ajouterais donc un autre point:
De plus, je pensais à l'époque à la documentation et j'ai cogité une hypothèse qui peut être valide (dans une moindre mesure) pour en tester deux. Je pensais simplement que le code évolue si rapidement qu'il est assez difficile de créer une documentation qui suit une telle vitesse, il est donc plus utile de passer du temps à rendre le code lisible que d'écrire une documentation lourde et facilement obsolète. (Bien sûr, cela ne s'applique pas aux API, mais uniquement à l'implémentation interne.) Le test souffre un peu du même problème: il peut l'être aussi lent à écrire par rapport au code testé. OTOH, c'est un problème moindre car les tests avertissent qu'ils sont obsolètes, tandis que votre documentation restera silencieuse tant que vous ne la relirez pas très, très attentivement .
Enfin, un problème que je trouve parfois: les tests automatisés peuvent dépendre d'outils et ces outils peuvent être mal écrits. J'ai commencé un projet en utilisant XUL il y a quelque temps et, mec, c'est juste pénible d'écrire des tests unitaires pour une telle plateforme. J'ai démarré une autre application en utilisant Objective-C, Cocoa et Xcode 3 et le modèle de test dessus était essentiellement un tas de solutions de contournement.
J'ai d'autres expériences sur les inconvénients des tests automatisés, mais la plupart d'entre eux sont répertoriés dans d'autres réponses. Néanmoins, je suis un ardent défenseur des tests automatisés. Cela a sauvé énormément de travail et de maux de tête et je le recommande toujours par défaut. Je pense que ces inconvénients ne sont que de simples détails par rapport aux avantages des tests automatisés. (Il est important de toujours proclamer votre foi après avoir commenté les hérésies pour éviter l'auto da fé.)
Deux qui ne sont pas mentionnés sont:
J'ai fait partie des efforts automatisés d'AQ où il a fallu une demi-journée pour exécuter les tests, car les tests étaient lents. Si vous ne faites pas attention à l'écriture de vos tests, votre suite de tests pourrait également se révéler ainsi. Cela ne semble pas être un gros problème jusqu'à ce que vous gériez maintenant ce temps, "Oh, je viens de commettre un correctif, mais cela va prendre 4 heures pour prouver l'exactitude".
Certaines méthodes de test (telles que l'automatisation de l'interface utilisateur) semblent se casser à chaque fois que vous vous retournez. Particulièrement douloureux si votre script, par exemple, bloque le processus de test car il attend qu'un bouton apparaisse - mais le bouton a été renommé.
Ce sont deux choses que vous pouvez contourner, avec de bonnes pratiques de test: trouvez des moyens de garder votre suite de tests rapide (même si vous devez faire des astuces comme la distribution de tests sur des machines/CPU). De même, on peut prendre soin d'éviter les méthodes fragiles de rédaction des tests.
Je veux en ajouter un de plus, un faux sentiment de sécurité.
Au-delà de très petits ensembles de problèmes bien définis, il n'est pas possible de créer des tests complets. Il peut y avoir et il y aura souvent des bogues dans notre logiciel que les tests automatisés ne testent tout simplement pas. Lorsque les tests automatisés réussissent, nous supposons trop souvent qu'il n'y a pas de bogues dans le code.
Il est difficile de convaincre le gestionnaire/capital-risqueur
voir Market Driven Unit Testing pour plus de détails.