Réponses à vos questions
Existe-t-il trop de tests unitaires?
Bien sûr ... Vous pouvez, par exemple, avoir plusieurs tests qui semblent être différents à première vue mais qui testent réellement la même chose (dépendent logiquement des mêmes lignes de code d'application "intéressant" à tester).
Vous pouvez également tester les éléments internes de votre code qui ne font jamais surface (c’est-à-dire qui ne font pas partie d’un contrat d’interface), où l’on pourrait se demander si cela a un sens ou non. Par exemple, la formulation exacte des messages du journal interne ou autre.
J'ai été chargé d'écrire des tests unitaires pour une application existante. Après avoir terminé mon premier fichier, j'ai 717 lignes de code de test pour 419 lignes de code original.
Cela me semble tout à fait normal. Vos tests passent beaucoup de lignes de code sur la configuration et le démontage en plus des tests réels. Le rapport peut améliorer ou ne pas améliorer. Je suis moi-même assez expérimenté dans les tests et j'investis souvent plus de temps que de code dans les tests.
Ce ratio va-t-il devenir ingérable si nous augmentons la couverture de notre code?
Le ratio ne prend pas en compte autant. Il existe d’autres qualités d’essais qui ont tendance à les rendre ingérables. Si vous devez régulièrement refactoriser tout un tas de tests lorsque vous apportez des modifications assez simples à votre code, vous devriez examiner de près les raisons. Et ce ne sont pas le nombre de lignes que vous avez, mais comment vous abordez le codage des tests.
Ma compréhension des tests unitaires consistait à tester chaque méthode de la classe pour s'assurer que chaque méthode fonctionnait comme prévu.
Ceci est correct pour les tests "unitaires" au sens strict. Ici, "unité" est quelque chose comme une méthode ou une classe. Le but du test "d'unité" est de ne tester qu'une unité de code spécifique, et non l'ensemble du système. Idéalement, vous supprimeriez tout le reste du système (en utilisant des doubles ou autres).
Cependant, dans la demande d'attraction, mon responsable technique a indiqué que je devrais me concentrer sur des tests de niveau supérieur.
Ensuite, vous êtes tombé dans le piège de supposer que les gens signifiaient en fait des tests unitaires quand ils disaient des tests unitaires. J'ai rencontré beaucoup de programmeurs qui disent "test unitaire" mais veulent dire quelque chose de très différent.
Il a suggéré de tester 4-5 cas d'utilisation les plus couramment utilisés avec la classe en question, plutôt que de tester chaque fonction de manière exhaustive.
Bien sûr, se concentrer uniquement sur les 80% de code les plus importants réduit également la charge. J'apprécie que vous accordiez une grande importance à votre patron, mais cela ne me semble pas être le choix optimal.
Pour moi, une couverture de 100% des tests unitaires est un objectif ambitieux, mais même si nous n'atteignions que 50%, nous saurions que 100% de ces 50% étaient couverts.
Je ne sais pas ce que "couverture de test unitaire" est. Je suppose que vous voulez dire "couverture de code", c'est-à-dire qu'après l'exécution de la suite de tests, chaque ligne de code (= 100%) a été exécutée au moins une fois.
Il s’agit d’une métrique approximative, mais de loin pas la meilleure norme pour laquelle on puisse tirer. Le simple fait d’exécuter des lignes de code n’est pas une image complète; Cela ne représente pas, par exemple, différents chemins à travers des branches compliquées et imbriquées. Il s’agit plutôt d’une mesure qui pointe du doigt des morceaux de code trop peu testés (évidemment, si une classe a une couverture de code de 10% ou 5%, alors quelque chose ne va pas); Par contre, une couverture de 100% ne vous dira pas si vous avez suffisamment testé ou correctement.
Test d'intégration
Cela m'agace énormément lorsque , par défaut, les gens parlent constamment de tests unitaires . À mon avis (et mon expérience), le test unitaire est excellent pour les bibliothèques / API; Dans les domaines plus orientés vers les entreprises (où nous parlons de cas d'utilisation comme dans la question à traiter), ils ne sont pas nécessairement la meilleure option.
Pour le code général des applications et dans l’entreprise moyenne (gagner de l’argent, respecter les délais et satisfaire la satisfaction de la clientèle sont importants, et vous voulez principalement éviter les bogues qui se présentent directement à l’utilisateur, ou qui pourraient entraîner de véritables catastrophes - nous ne sommes pas parler de lancements de fusées de la NASA ici), les tests d’intégration ou de fonctionnalité sont beaucoup plus utiles.
Ceux-ci vont de pair avec le développement basé sur le comportement ou le développement basé sur les fonctionnalités; ceux-ci ne fonctionnent pas avec des tests unitaires (stricts), par définition.
Pour faire court (ish), un test d’intégration / fonctionnalité applique toute la pile d’applications. Dans une application basée sur le Web, il agirait comme un navigateur en cliquant par l'application (et non, évidemment il n'a pas a être que simpliste, il existe des cadres très puissants là - bas pour le faire - visitez http: // concombre. io pour un exemple).
Oh, pour répondre à vos dernières questions: vous obtenez une couverture de test élevée pour toute votre équipe en vous assurant qu'une nouvelle fonctionnalité n'est programmée que lorsque son test de fonctionnalité a été mis en œuvre et qu'il a échoué. Et oui, cela signifie toutes les fonctionnalités. Cela vous garantit une couverture de 100% (positive) des fonctionnalités. Il garantit par définition qu’une fonctionnalité de votre application ne «disparaîtra jamais». Il ne garantit pas une couverture de code à 100% (par exemple, sauf si vous programmez activement des fonctions négatives, vous n'exercerez pas votre traitement des erreurs / traitement des exceptions).
Cela ne vous garantit pas une application sans bug; vous voudrez bien sûr rédiger des tests de fonctionnalité pour les situations de bogue évidentes ou très dangereuses, les erreurs de saisie de l'utilisateur, le piratage (par exemple, la gestion de session, la sécurité, etc.); Toutefois, même la programmation des tests positifs présente un avantage considérable et est tout à fait réalisable avec des cadres modernes et puissants.
Les tests de fonctionnalités / d'intégration ont évidemment leur propre boîte de dialogue (par exemple, les performances; les tests redondants des frameworks tiers; puisque vous n'utilisez généralement pas les doublons, ils ont également tendance à être plus difficile à écrire, selon mon expérience ...), mais je ' d prenez une application testée à 100% avec des fonctionnalités positives sur une application testée à 100% par unités de couverture de code (pas de bibliothèque!) tous les jours.