Nous développons une application; il comprend une bibliothèque développée par un autre codeur, cette bibliothèque communique avec le serveur via plusieurs connexions réseau, et cela implique plusieurs threads travaillant ensemble. Le code côté serveur est assez compliqué et nous n'avons pas accès au code source.
Récemment, j'ai découvert un mandelbug faisant parfois planter une application. Je pouvais le reproduire une fois et obtenir une trace de pile, alors j'ai ouvert un rapport de bogue. Le bogue lui-même est facile à corriger (exception Web non interceptée dans l'un des threads d'arrière-plan, ce qui oblige CLR à terminer le programme).
Le problème est que le développeur refuse de corriger le bogue, car "il n'est pas convaincu qu'il existe". Malheureusement pour moi, le patron est du côté de lui et dit que ce bogue ne peut pas être corrigé à moins que je fasse un "cas de test solide" pour prouver l'existence du bogue et pour faire un test unitaire vérifiant qu'il a disparu. Ce qui est fondamentalement impossible en raison de la nature du bogue.
Aucun conseil?
Réponses:
Si possible, il faudra peut-être un certain temps pour vérifier si ce défaut peut être reproduit en mettant un peu de sommeil ou un blocage dans votre code d'application. Mais ne passez pas trop de temps. Comme ce problème est dû à plusieurs thèmes (et aussi comme vous l'avez observé), son occurrence sera rare.
Mon conseil est de ne pas trop transpirer. Continuez votre travail. Chaque fois que vous rencontrez ce plantage, mettez à jour votre rapport de bogue avec la trace de la pile, en indiquant qu'il s'agit d'une répétition et en changeant le propriétaire en développeur de bibliothèque. Laissez la direction / responsable décider de réparer ou non en fonction de sa fréquence.
Essayez également de comprendre la mentalité du développeur. Vous avez dit "exception Web non interceptée". Le développeur à ce stade peut ne pas être entièrement sûr des autres effets de cette capture . Il / elle peut donc hésiter à toucher le code.
la source
Donc, à partir de vos commentaires plus ou moins clarifiants, je l'ai compris ainsi:
Vous êtes sûr qu'il ne manque qu'une simple gestion supplémentaire des exceptions, et vous savez déjà quelle ligne de code dans la bibliothèque pose problème et comment la bibliothèque pourrait être corrigée.
Pourquoi alors n'ajoutez-vous pas vous-même les quelques lignes de code manquantes à la bibliothèque, demandez à l'équipe de bien vouloir tester la bibliothèque avec ces modifications? Assurez-vous qu'il s'agit d'un changement à faible risque, facile à comprendre par le développeur responsable de la bibliothèque. La pire chose qui puisse arriver est que quelqu'un doit annuler ce changement dans votre VCS si votre correctif provoque un nouveau comportement inattendu.
La plupart des gens sont plus faciles à convaincre lorsque le travail est déjà terminé. En outre, ils réagissent mieux sur "voici une solution améliorée", par opposition à "ce code est erroné, corrigez-le en quelque sorte".
EDIT: lorsque le développeur refuse toujours d'ajouter ce changement, la meilleure option est d'essayer de faire fonctionner le code problématique à l'intérieur d'un faisceau de test isolé où vous simulez l'erreur réseau. Travailler efficacement avec le code hérité décrit de nombreuses techniques sur la façon de résoudre ce type de problèmes. Par exemple, vous pouvez créer une version de test de la bibliothèque, comprenant uniquement les modules et fonctions problématiques, et créer un "environnement factice" autour d'elle où vous pouvez simuler "l'exception réseau" dans des conditions contrôlées. Cela peut sembler être trop d'effort à première vue, mais une fois que vous avez un tel environnement, vous pouvez y ajouter de nombreux tests supplémentaires (et je suppose que cela aura du sens, car lorsque l'auteur de la bibliothèque refuse d'ajouter les éléments manquants) gestion des exceptions en un seul endroit,
la source
Pour un bogue comme celui-ci, les tests de fuzz automatisés (également appelés tests aléatoires) peuvent être utiles pour essayer de le reproduire. Cela automatise le processus de recherche du bogue en randomisant un ensemble fixe de paramètres (ou entrées) dans la chose que vous testez. Chaque exécution de test, les paramètres sont enregistrés dans un fichier journal, y compris les horodatages, etc. de sorte que lorsque le crash se produit, vous pouvez (théoriquement) simplement rejouer le test, en utilisant les mêmes paramètres, pour le reproduire.
Depuis son automatisation, le processus de test peut exécuter de nombreux tests en peu de temps. Souvent, il peut être exécuté pendant la nuit et le matin, vous pouvez consulter un fichier journal pour voir s'il a reproduit le crash.
la source
L'avocat du diable suggère une autre voie.
L'autre développeur a déclaré catégoriquement qu'il n'y avait pas de bogue là-bas.
Pouvez-vous trouver un moyen de souligner l'enfer de son bug prétendument inexistant et de le faire planter beaucoup plus souvent?
la source
La trace de la pile est une preuve claire que le bogue existe, ou du moins existait dans une certaine version. Ce que vous n'avez pas, c'est la preuve que le bogue a été corrigé. Ils sont stupides de l'ignorer. J'ai eu des bogues «impossibles à reproduire» après des centaines de milliers d'essais automatisés sur plusieurs systèmes qui se sont déclenchés à chaque fois sur le système d'un client.
J'obtiens quelques bugs comme ça par an, la plupart sans même le bénéfice d'une trace de pile. Dans presque tous les cas, même si je ne pouvais pas le reproduire au préalable, je pouvais assez facilement faire un test automatisé une fois corrigé.
Par exemple, il y a quelques mois, j'ai corrigé un bug qui ne se produisait que lorsque l'utilisateur tapait plus rapidement que 96 mots par minute. Avant de le corriger, tout ce que je savais, c'était que le bug se produisait "parfois". Je n'aurais jamais pensé à écrire un test unitaire pour une saisie rapide. Cependant, après avoir connu la cause profonde, faire un test était trivial.
Même dans les rares cas où un bogue ne peut pas être reproduit même après avoir été corrigé, vous pouvez le fermer par inspection de code.
la source