Rapports de couverture de code séparés pour les tests unitaires et d'intégration, ou un rapport pour les deux?


10

Devrait-il y avoir un rapport de couverture de code distinct pour les tests unitaires et d'intégration, ou un rapport de couverture de code pour les deux?

L'idée derrière cela est que la couverture du code nous permet de nous assurer que notre code a été couvert par des tests autant que possible (autant qu'une machine peut maintenant de toute façon).

Il est plus pratique d'avoir un rapport séparé pour savoir ce qui n'a pas été couvert par les tests unitaires et ce qui n'a pas été couvert par les tests d'intégration. Mais de cette façon, nous ne pouvons pas voir le pourcentage de couverture totale.


1
Je vais dodu pour séparé. Je ne pense pas qu'il soit suffisant de dire "que le code a été testé" sans savoir comment il a été testé. Le test unitaire et le test d'intégration utilisent le même code, mais de différentes manières, par exemple, le test unitaire peut utiliser des valeurs de cas de bord tandis que l'intégration utilise des valeurs moyennes ("réalistes"). Même code, tests très différents.
Mawg dit réintégrer Monica

Nous conservons les tests unitaires et les tests d'intégration dans des bibliothèques distinctes pour exactement cette raison.
Robbie Dee

Cela dépend des exigences du client.
mouviciel

Réponses:


12

Surtout, vous devez avoir et analyser une couverture combinée (totale). Si vous y pensez, c'est le moyen le plus naturel de hiérarchiser correctement vos risques et de concentrer vos efforts de développement de tests.

Couverture combinée vous montre ce que le code ne sont pas couverts par des tests à tous , à savoir est la plus risquée et la nécessité d'étudier en premier. Des rapports de couverture séparés ne seront pas utiles ici, car ils ne vous permettent pas de savoir si le code est testé d'une autre manière ou pas testé du tout.


Une analyse de couverture distincte peut également être utile, mais elle serait préférable de procéder après l' analyse combinée et impliquerait de préférence également les résultats de l'analyse de la couverture combinée.

Le but de l'analyse de couverture distincte diffère de l'analyse combinée. Une analyse de couverture séparée permet d'améliorer la conception de votre suite de tests, par opposition à l'analyse de couverture combinée qui est destinée à décider des tests à développer quoi qu'il arrive.

"Oh, cet écart n'est pas couvert simplement parce que nous avons oublié d'ajouter ce test unitaire simple (intégration) dans notre suite unitaire (intégration), ajoutons-le" - une couverture et une analyse séparées sont plus utiles ici, car combinées, on pourrait masquer les lacunes que vous voudriez couvrir dans une suite particulière.

Du point de vue ci-dessus, il est néanmoins souhaitable de disposer également des résultats d'une analyse de couverture combinée afin d'analyser les cas les plus délicats. Pensez-y, avec ces résultats, vos décisions de développement de test pourraient être plus efficaces grâce à des informations sur les suites de tests «partenaires».

«Il y a une lacune ici, mais développer un test unitaire (d'intégration) pour le couvrir serait vraiment lourd, quelles sont nos options? Vérifions la couverture combinée ... t extrêmement important. "



5

Vous ne mentionnez pas votre outil de test. Beaucoup ont des fonctions de «combinaison» qui vous permettent d'agréger les résultats de plusieurs exécutions ou suites. Si vous souhaitez une mesure de couverture agrégée, explorez la fonction de combinaison dans votre outil de couverture.


Maintenant, pouvons-nous parler de l'éléphant dans la pièce?

Il n'y a pas de cuillère. Et il n'y a pas de "pourcentage de couverture totale". Du moins, pas simple.

Le pourcentage de couverture est une mesure facilement compréhensible présentée pour aider à comprendre la portée, la profondeur et la gamme des suites de tests. Mais comme tout benchmark simple, il est très facile de devenir un objectif fixé sur cette valeur comme une sorte de talisman magique de «tests complets».

Disons que vous avez atteint la gloire de la «couverture de test à 100%». Yay! Mais qu'est ce que ça veut dire? 100% des lignes de code sont testées, non? Alors qu'en est-il de cette ligne?

launch_missile = launch_authorized and launch_cmd_given else previous_launch_status

«Couvrir» cette ligne signifie quelque chose - mais pas beaucoup, car il existe une variété de conditions qui sont Trueou Falseavec une certaine probabilité, mais il est peu probable que vous ayez testé toutes les combinaisons de ces conditions. Même si cette ligne est couverte une douzaine de fois, si l'une des conditions est relativement rare, vous n'êtes pas près de tester tous les résultats réels qui pourraient se produire dans la pratique. Pour rendre cela plus clair, un exemple plus synthétique:

engage_laser = (laser_armed and safety_disengaged) or random.random() < 0.0000003

Combien de fois auriez-vous à couvrir cette ligne pour la tester vraiment de manière exhaustive? Combien de fois devriez-vous le couvrir pour le tester en combinaison avec toutes les autres variables du programme (avec leurs propres probabilités, peut-être aussi rares)?

Je ne dis pas que les mesures de couverture sont inutiles. Ils sont vraiment super . Ils se concentrent sur l'un des problèmes clés: dans quelle mesure mon système logiciel est-il testé? Ils aident à passer de «nous avons des tests» à «nous avons testé de manière approfondie».

Mais pendant que vous travaillez sur des «scores combinés», la réalité est que votre score sera généralement pour la «couverture de déclaration» plutôt que la «condition», le «prédicat» ou la «trajectoire» . Donc, quel que soit le nombre que vos scores globaux vous donnent, il est peu probable que cela vous donne une image réelle de la quantité d'états potentiels et de combinaisons d'états de votre programme qui sont testés. Pendant que vous travaillez à augmenter votre pourcentage de couverture, pensez également à mesurer votre couverture de prédicat. Cela vous donnera une vue plus réaliste - et presque invariablement, plus sobre - de l'étendue des tests.


Le type de mesures de couverture utilisées semble être complètement orthogonal à la question, toute mesure peut être calculée pour le test unitaire ou le test d'intégration ou les deux
jk.

Sûr. De la même manière, vous pouvez calculer des "miles par gallon" (de carburant consommé) indépendamment du type de véhicule utilisé et orthogonal à celui-ci. Je dirais que la fusion des résultats des fusées élévatrices lourdes, des camions long-courriers et des voitures économiques donne une métrique combinée trompeuse. J'imagine que vous pourriez toujours utiliser un chiffre «à travers la flotte» à certaines fins.
Jonathan Eunice

Réponse intéressante, mais légèrement hors sujet .... voté quand même!
HDave
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.