Le code procédural des tests unitaires est-il efficace?

13

Sur un projet en cours, les pouvoirs en place veulent avoir des tests unitaires intégrés dans notre cycle de développement pour éviter la quantité constante de bogues qui semblent s'infiltrer dans notre code. Le problème est que le code spaghetti est procédural à 95%, avec lequel je n'ai jamais fait de tests unitaires (toute mon expérience avec les tests unitaires a été avec le code POO)

Donc, ma question en bref est-il judicieux de procéder à des tests unitaires avec notre base de code actuelle, ou de suggérer qu'il soit reporté jusqu'à ce que l'application ait été migrée vers un cadre OOP approprié?

PS: Bien que j'aie essayé de définir cette question comme indépendante du langage, je pense que le fait d'indiquer que l'application en question utilise PHP et javascript aidera à fournir des réponses plus spécifiques qui pourraient répondre à cette question car, par expérience, cet événement se produit le plus avec de telles applications.

canadiancreed
la source
13
Les tests unitaires n'empêchent pas les nouveaux bogues, ils empêchent les régressions.
Daenyth
2
doublon possible de Les générateurs de tests unitaires vous ont-ils aidé lors de l'utilisation du code hérité? et une douzaine d'autres questions. Recherche de "test unitaire hérité"
mattnz
4
Votre problème est que le code est spaghetti / Big Ball Of Mud, pas qu'il soit "procédural" (un bon code procédural est très bien testable - BTDTGTTS). Vos pouvoirs en place préfèrent obtenir (plus) de testeurs et organiser une assurance qualité professionnelle approfondie dans le projet s'ils veulent vraiment "éviter la quantité constante de bugs".
moucher
@ l0b0 oui je l'ai fait. Mes excuses, mettront à jour le test pour être plus clair
canadiancreed
@mattnz Ya J'ai recherché le test unitaire procédural, mais pas l'héritage. J'ai compris cette procédure! = Héritée car il y a encore du nouveau code en cours de création dans ce format
canadiancreed

Réponses:

14

Les tests unitaires fonctionnent bien avec les objets, d'autant plus qu'ils offrent de nombreuses fonctionnalités fantaisistes, comme des objets fantaisie, ce qui permet de créer de meilleurs tests plus rapidement.

Cela étant dit, rien n'interdit de faire des tests unitaires sur une base de code procédurale . Dans la POO, la plupart des tests unitaires testent des méthodes en leur transmettant certains paramètres et en attendant soit un résultat, soit une exception d'un type spécifique. Cela peut être fait aussi loin avec le code procédural; juste qu'au lieu de tester les méthodes, vous testerez les fonctions .

Notez que vous devrez:

  • Isolez les fonctions que vous devez tester et celles dont vous n'avez pas besoin. En POO, c'est simple: les méthodes privées n'ont pas à être testées car les appelants ne pourront jamais y accéder directement. Il y a des chances, dans votre code procédural, que certaines fonctions soient comme ça et n'aient pas besoin de tests.

  • Pensez à la portée mondiale . Le problème existe également dans la POO, mais si vous dites que vous devez tester le code de spaghetti, les chances sont que les personnes qui ont écrit ce code ont de mauvaises habitudes, comme utiliser trop la portée globale et faire des choses folles comme changer $_GETou $_POSTcréer des tableaux à l' intérieur les fonctions.

  • Traitez le code en dehors des fonctions. C'est un cas plus compliqué, mais toujours possible. Soit vous require_onceune page pour voir ce qui se passe et intercepter la sortie via ob_start/ob_get_clean , soit vous faites une requête HTTP à partir de la suite de tests et analysez la réponse en analysant le code HTML. Ce n'est pas vraiment un test d'interface utilisateur: ici, peu importe si un bouton sur une page apparaît à gauche ou à droite ou si un lien est en grosses majuscules rouges ou en petites bleues. Ce qui vous importe, c'est de trouver certains éléments HTML via DOM et de comparer leur contenu à celui attendu.

  • Testez les codes de réponse . require_onceavec la mise en mémoire tampon de sortie, c'est bien, mais vous devez également tester comment l'application Web gère les erreurs. Par exemple, si le résultat attendu d'un test est 404 Introuvable, vous devez effectuer une requête HTTP afin de connaître la réponse.

Arseni Mourzenko
la source
5

suggérer qu'il soit reporté jusqu'à ce que l'application ait été migrée vers un cadre OOP approprié

Mettez en place des tests automatiques avant de migrer vers une autre plate-forme, pas après. Ajoutez d'autres tests pendant la migration, pas après. Si ces tests sont des "tests d'intégration" ou des tests unitaires, vous devez décider vous-même, mais vous pouvez généralement utiliser votre framework de test xUnit préféré pour les deux types.

Doc Brown
la source
5

Le moyen le plus efficace pour démarrer les tests unitaires consiste à identifier la classe d'erreurs les plus fréquentes ou les plus coûteuses. Créez ensuite des tests qui ciblent ces erreurs.

La façon dont ces tests seront mis en œuvre différera entre les paradigmes et les langues. La plus grande chose qui affectera votre capacité à effectuer des tests unitaires est la qualité du code; moins le paradigme utilisé. N'oubliez pas que les tests unitaires consistent à tester une "unité" de code de manière isolée. Tout ce qui affecte votre capacité à isoler des "unités" de code rendra les tests plus difficiles.

  • utilisation des globaux
  • Effets secondaires
  • code étroitement couplé
  • code mal couplé
  • un grand nombre de conditionnels
  • "unités" mal conçues

Tous ces éléments auront un impact plus élevé sur la difficulté des tests que le paradigme linguistique.

Dietbuddha
la source
4

Chaque fois que vous avez une situation où vous pouvez tester des parties de votre code automatiquement, les tests unitaires peuvent être efficaces. Ainsi, la question n'est pas de savoir si le code procédural peut être testé de manière efficace, la question est de savoir si CE code peut être testé de manière unitaire. Cela dépendra de la quantité d'états qu'il lit et de la quantité d'états qu'il définit. Idéalement, la réponse aux deux est zéro, mais si ce n'est pas le cas, vous pouvez toujours la tester.

Comme toujours, vous devez peser la confiance que le code est correct par rapport au coût d'acquisition de cette confiance. Gardez à l'esprit qu'une partie du gain pour les tests unitaires identifie explicitement les dépendances, et en ce sens, il est encore plus efficace de tester le code procédural unitaire par rapport au code OOP.

jmoreno
la source
-4

Je ne pense pas qu'il soit possible de faire de vrais tests unitaires contre du code procédural. Le problème principal étant que chaque procédure aura probablement de nombreuses dépendances qui ne peuvent pas être éliminées. Au mieux, les tests seront des tests d'intégration. J'ai fait une chose similaire il y a plusieurs lunes avec les modules VB6 et les modules VBA dans MS Access.

Cela dit, si vous pouvez mettre un échafaudage de test autour des méthodes qui causent le plus de douleur, cela doit être utile, non?

Rob Gray
la source
5
-1: La mauvaise conception et implémentation est le problème, pas le code procédural. Tout comme vous pouvez écrire un OP terrible, vous pouvez écrire un excellent code de procédure.
mattnz
@mattnz - Je ne sais pas comment votre commentaire se rapporte à ce que j'ai dit à propos du fait de ne pas pouvoir tester le code de procédure unitaire.
Rob Gray
7
Le code procédural n'égale pas les spaghettis. Il est tout à fait possible d'écrire un code bien conçu, modulaire, bien séparé, à forte cohésion / faible couplage d'une manière procédurale.
Marjan Venema
2
Une bonne conception introduit la testabilité unitaire dans n'importe quel code, procédural ou non.
Doc Brown