Tests unitaires
Pour réaliser des tests unitaires il nous
faut :
–des jeux de données (fictives, de
production, ancien jeux de tests)
–des ressources (documents de
spécifications, scénarios, fiches de
tests, tests précédents)
–Une démarche
Les différentes démarches :
*Analyse dynamique structurelle
*Analyse dynamique fonctionnelle
*Analyse statique
*Boite noire
*Boite blanche
Couverture de code
! La couverture de code est une métrique qui peut vous
aider à comprendre quelle quantité de votre code source
est testée.
! C’est une métrique très utile qui peut vous aider à évaluer
la qualité de votre suite de tests et par conséquence la
qualité de votre code.
! Les outils de couverture de code utiliseront un ou
plusieurs critères pour déterminer comment votre code a
été testé ou pas, lors de l’exécution de votre suite de tests.
– JACOCO
– JCov
– OpenClover
– Cobertura
– Serenity
Comment la couverture de
code est-elle calculée ?
! Ces métriques sont généralement représentées par le nombre
d’éléments réellement testés, les éléments trouvés dans votre
code et un pourcentage de couverture (éléments testés /
éléments trouvés)
Les mesures courantes des rapports de couverture incluent :
– Couverture de fonction :
combien de fonctions définies ont été
appelées.
– Couverture des instructions :
combien d’instructions du
programme ont été exécutées.
– Couverture des branches :
combien de branches des structures de
contrôle (instructions if par exemple) ont été exécutées.
– Couverture des conditions :
combien de sous-expressions
booléennes ont été testées pour une valeur vraie et une valeur
fausse.
– Couverture des lignes :
combien de lignes de code source ont été
testées.
Etape préliminaire
Transformer le programme en un graphe de flux de contrôle:
Couverture des
instructions
! chaque instruction est
exécutée au moins une
fois
Couverture des branches
chaque branche (vrai/faux)
d’une décision (test ou
condition de boucle) est
parcourue au moins une
fois
Couverture des conditions
! Dans le cas où une décision
comprend plusieurs
conditions, une condition
peut en cacher une autre
! S’assurer que chaque
condition est évaluée au
moins une fois
! S’assurer que chaque
combinaison possible de
conditions est évaluée au
moins une fois
Comment définir l’ensemble
minimal des cas de tests?
arcs - # sommets + 2
Calculer le nombre de circuits indépendants (=base)
= nombre de tests à définir pour avoir la couverture complète
Toute exécution du programme est une combinaison de ceux-là
Nombre de cas de tests à trouver =
Choisir un cas de test qui représente une exécution quelconque
En ajouter un avec au moins un nouvel arc (non encore parcouru
par un cas de test précédent
Déterminer les Résultats
attendus
! Pour chaque cas de test, déterminer le résultat
attendu à partir de la spécification
– Exemple:
! Spec=”Lire deux entiers, afficher combien parmi eux sont
positifs.”
– Résultats:
! 1. 2 est affiché
! 2. 1 est affiché
! 3. 0 est affiché
Exécuter les tests
! Exécuter le test et comparer le résultat obtenu avec le résultat
attendu
Stratégies de développement
des tests unitaires
Stratégies de développement
des tests unitaires
! Right-BICEP Guidelines
Stratégies de développement
des tests unitaires
! RIGHT
Stratégies de développement
des tests unitaires
! Boundary check - CORRECT
Stratégies de développement
des tests unitaires
! Inverse Check
* Vérifier une méthode en appliquant son inverse logique
* Par exemple, vérifiez une méthode qui calcule une racine carrée en
élevant un nombre au carré et vérifiez qu’elle est assez proche du nombre
d’origine
! Cross-check
* S’il y a plus d’une façon de calculer une valeur, le résultat peut être
recoupé par une méthode différente.
* Cette technique est applicable au système de test lorsqu’il existe un
moyen éprouvé et connu qui est n’est pas flexible ou trop lent.
! Force error conditions
* Des objets fictifs (Mock objects) peuvent être utilisés pour simuler des erreurs du monde réel telles que la coupure de la connexion réseau, la
charge du système et un disque avec un espace libre limité.
! Performance characteristics
* S’assurer que le code atteint les objectifs de performance
* Réalisez le test de temps réponse avec des performances limitées
* Par exemple, un système d’indexation de pages Web avec leur URL
fonctionne bien pour une petite liste d’URL, il est nécessaire de tester s’il
fonctionne toujours bien pour une grande liste d’URL