Obtenez plus d'avantages des tests unitaires avec l'analyse d'exécution
Par Kapil Bhandari
2 novembre 2018
5 min lire
Pour profiter des avantages des tests unitaires, vous pouvez observer un test unitaire pendant son exécution via une analyse d'exécution. L'analyse de l'exécution pendant l'exécution des tests unitaires est essentielle pour améliorer l'efficacité et l'efficience des tests.
Les tests unitaires sont une pratique exemplaire pour tester des unités/composants individuels d'un logiciel, mais cela peut être fastidieux et coûteux pour les développeurs Java. Il est fastidieux de tester chaque unité pour un comportement correct avec des assertions manuelles et d'isoler chaque méthode avec des moqueries, et les tests unitaires eux-mêmes sont ouverts aux bogues et aux comportements incompris. Pour améliorer cette situation, vous pouvez utiliser un outil d'analyse d'exécution pour détecter le flux de données et de contrôle, les dépendances externes et pour calculer la couverture du code de test.
Avec ces données collectées à partir de l'analyse d'exécution, une solution de niveau entreprise comme Jtest Parasoft peut inviter le développeur à améliorer les tests, en recommandant automatiquement des assertions pour un comportement correct et des méthodes de moquerie pour améliorer l'isolement des tests. Cette intégration entre la génération automatique de tests unitaires et l'analyse d'exécution réduit l'intervention manuelle requise pour les tests unitaires pour Java.
Avantages des tests unitaires
Les tests unitaires sont une pratique bien connue, mais sa mise en œuvre nécessite des améliorations dans de nombreux projets. Les tests unitaires, bien réalisés, améliorent l'agilité des processus agiles, augmentent la qualité et la sécurité et permettent des économies de coûts à long terme.
Malheureusement, quels que soient ces avantages, les développeurs peuvent encore avoir du mal avec les tests unitaires, malgré le désir d'obtenir de meilleurs résultats. Le temps et les efforts nécessaires pour la création et la maintenance des tests peuvent être trop importants pour justifier une augmentation des efforts de test. Souvent, les suites de tests sont fragiles en raison d'une mauvaise isolation des unités / objets par rapport aux dépendances. La moquerie appropriée des dépendances devient le fléau des testeurs de logiciels, tout comme la création des assertions nécessaires pour déterminer la logique de programme correcte. Même le paramétrage des tests pour les scénarios peut être fastidieux et prendre du temps.
Les équipes de développement logiciel doivent résoudre ces problèmes avec la création, l'isolement et la maintenance des tests si elles veulent profiter des avantages des tests unitaires approfondis. La réponse commence par les outils d'automatisation des tests, mais il ne suffit pas d'automatiser l'exécution des tests et de collecter les résultats. L'analyse d'exécution, le processus d'observation d'un exécutable en cours d'exécution et d'enregistrement des mesures clés, est un moyen innovant d'aider à améliorer la création, la simulation et la stabilité des tests unitaires.
L'analyse d'exécution peut améliorer les tests unitaires
Dans la plupart des cas, les développeurs ne considèrent pas l'analyse d'exécution comme importante dans les premières étapes des tests unitaires. La plupart des outils sont utilisés pour détecter les erreurs manquées par les tests unitaires ou simplement pour calculer la couverture du code. Mais si ces avantages sont importants, l'analyse d'exécution peut également observer l'exécution de la première itération d'un test unitaire pour faire des recommandations pour améliorer le test et détecter les modifications de l'environnement d'exécution de test qui interfèrent avec la stabilité du test.
Les frameworks de test tels que JUnit créent du code clairsemé qui nécessite une intervention supplémentaire du développeur. Ce travail est fastidieux, il peut donc être automatisé pour remplir davantage de détails en fonction de la logique de programme observée. Ce qui suit exemple de test unitaire java peut être généré automatiquement par Parasoft Jtest :


De même, pour les tests unitaires avec des entrées paramétrées, illustrées ci-dessous:


Étant donné que les tests créés sont exécutables dès le début, ils peuvent être observés par une analyse d'exécution pour les résultats et le flux d'exécution. Par exemple, un test peut échouer en raison d'une exception déclenchée, illustrée ci-dessous.


Détecter les dépendances et se moquer avec l'analyse d'exécution
En outre, les outils d'exécution observent le chemin d'exécution dans les dépendances et recommandent des simulations potentielles pour augmenter l'isolation du test. Bien que l'inspection visuelle d'un objet testé révèle ses dépendances, l'automatisation de la détection et de la moquerie de ces dépendances permet d'économiser beaucoup de travail fastidieux et sujet aux erreurs.
Dans l'exemple ci-dessous, Parasoft Jtest propose au développeur un choix de ce qu'il faut simuler en fonction de la trace d'exécution du test unitaire:


Dans ce cas, l'ajout d'un modèle de méthode mockable ajoute la méthode à une liste de simulations à gérer par un framework de simulation tel que PowerMock.
Des constructeurs statiques moqueurs sont également possibles, comme indiqué ci-dessous.


Amélioration de la fidélité des tests grâce à l'analyse d'exécution
Avec une connaissance complète du flux d'exécution, ainsi que des paramètres utilisés dans les appels de méthode, l'analyse d'exécution peut être utilisée pour fournir des recommandations utiles au développeur afin d'améliorer le code de test. Bien que des assertions soient fournies, statiquement, lorsqu'un test est créé, elles peuvent ne pas être activées ou correctes. Lors de l'exécution du test, les assertions échouées et manquantes déclenchent des avertissements qui conduisent ensuite à des recommandations pour remédier au problème.
Par exemple, après avoir créé un nouveau test et qu'aucune assertion recommandée n'a été décommentée, vous verrez ce qui suit:


Ou si une assertion échoue, par exemple, ce qui suit s'affiche:


Quoi qu'il arrive, c'est le retour d'information constant sur les actions correctives pour les assertions qui ferme la boucle lors de la création du test pour terminer le test unitaire. De plus, à mesure que l'unité testée change, ces changements peuvent être traités de la même manière, ce qui réduit continuellement la maintenance de test manuelle requise.
Amélioration de la stabilité des tests grâce à l'analyse d'exécution
L'analyse d'exécution peut également détecter des changements dans l'environnement de test pendant l'exécution qui affectent la capacité de recréer un environnement de test identique pour les tests suivants. Les tests qui réussissent à un moment donné et échouent plus tard peuvent être une grande cause de frustration et de perte de temps et d'efforts. Voici quelques exemples d'instabilités que vous pouvez détecter avec l'analyse d'exécution:
- Une propriété système modifiée lors d'un test qui n'a pas retrouvé son état d'origine. Un test ultérieur peut s'appuyer sur cette propriété.
- Fils d'exécution supplémentaires en arrière-plan qui peuvent interférer avec une exécution de test.
- Une nouvelle création de fichier pendant l'exécution du test qui peuvent avoir un impact sur les exécutions suivantes si elles reposent sur le fichier et son contenu.
- Champs statiques modifiés qui pourraient avoir un impact sur les futurs tests utilisant ces mêmes champs.
Il est essentiel que chaque exécution de test ait un point de départ identique pour garantir des résultats fiables. La prévention de l'instabilité des tests grâce à la détection d'exécution supprime les conjectures de la phase de débogage des tests.
Ainsi, vous pouvez voir que l'analyse d'exécution ne sert pas uniquement au calcul de la couverture du code. L'analyse du temps d'exécution pendant l'exécution des tests est essentielle pour améliorer l'efficacité et l'efficience des tests. La surveillance des chemins d'exécution fournit des informations sur les dépendances, pour améliorer la gestion des dépendances et des moqueries. Les assertions peuvent être surveillées, et recommandations automatiques peut aider à améliorer la fidélité des tests. La détection des modifications dans l'environnement de test d'exécution qui affectent la stabilité du test supprime la frustration et réduit les cycles de débogage du code de test.