J'ai récemment terminé une refactorisation de la boîte noire. Je ne parviens pas à l'enregistrer car je ne sais pas comment le tester.
A un niveau élevé, j'ai une classe dont l'initialisation implique de récupérer des valeurs d'une classe B. Si la classe B est "vide", elle génère des valeurs par défaut sensibles. J'ai extrait cette partie à une méthode qui initialise la classe B avec ces mêmes valeurs par défaut.
Je n'ai pas encore déterminé le but / contexte de l'une ou l'autre classe, ni la manière dont ils seraient utilisés. Je ne peux donc pas initialiser l'objet à partir d'une classe B vide et vérifier qu'il a les bonnes valeurs / qu'il fait les choses correctement.
Ma meilleure idée est d'exécuter le code d'origine, de coder en dur dans les résultats des méthodes publiques en fonction des membres initialisés, et de tester le nouveau code par rapport à celui-ci. Je n'arrive pas à expliquer pourquoi je me sens vaguement mal à l'aise avec cette idée.
Y a-t-il une meilleure attaque ici?
la source
Réponses:
Vous le faites très bien!
La création de tests de régression automatisés est souvent la meilleure chose à faire pour rendre un composant refactorable. Cela peut paraître surprenant, mais de tels tests peuvent souvent être écrits sans une compréhension complète de ce que le composant fait en interne, pour autant que vous compreniez les "interfaces" d'entrée et de sortie (au sens général de ce mot). Nous avons fait cela plusieurs fois dans le passé pour des applications complètes, pas seulement pour des cours, mais cela nous a souvent permis d'éviter de casser des choses que nous ne comprenions pas bien.
Cependant, vous devez disposer de suffisamment de données de test et vous assurer de bien comprendre ce que le logiciel fait du point de vue de l'utilisateur de ce composant, sinon vous risqueriez d'omettre des cas de test importants.
C'est à mon humble avis une bonne idée d'implémenter vos tests automatisés avant de commencer la refactorisation, pas après. Vous pouvez donc effectuer la refactorisation par petites étapes et vérifier chaque étape. La refactorisation elle-même devrait rendre le code plus lisible, vous aidant ainsi à mieux comprendre les éléments internes peu à peu. Donc, les étapes de commande dans ce processus sont
la source
L'une des principales raisons d'écrire des tests unitaires est qu'ils documentent l'API de composant d'une manière ou d'une autre. Ne pas comprendre le but du code testé est vraiment un problème ici. La couverture de code est un autre objectif important, difficile à atteindre sans savoir quelles branches d'exécution existent et comment elles sont déclenchées.
Cependant, s'il est possible de réinitialiser l'état proprement (ou de construire le nouvel objet de test à chaque fois), il est possible d'écrire un test de type "corbeille in-corbeille" qui alimente simplement le système principalement en entrée aléatoire et en observe la sortie.
Ces tests sont difficiles à maintenir car, s’ils échouent, il peut être complexe de dire pourquoi et comment il est grave. La couverture peut être discutable. Cependant, ils sont toujours beaucoup mieux que rien. Lorsqu'un tel test échoue, le développeur peut réviser les dernières modifications avec plus d'attention et, espérons-le, y détecter le bogue.
la source