Dans des circonstances normales, l'approche consisterait à utiliser vos données de test pour la couverture du code, mais comme vous dites que vous avez des parties de votre code qui sont testées mais qui ne sont pas utilisées dans l'application de production, vous pourriez faire quelque chose de légèrement différent.
Par souci de clarté, tout d'abord : Ne faites pas confiance aux outils automatiques. Ils ne vous montreront que les résultats des éléments que vous testez activement, rien de plus.
Cette mise au point étant faite, je vous propose d'utiliser un outil de couverture de code (comme rcov o simplecov pour Ruby 1.9) sur votre application de production et mesurer les chemins de code réellement utilisés par vos utilisateurs. Bien que ces outils aient été conçus à l'origine pour mesurer la couverture des tests, vous pouvez également les utiliser pour la couverture de la production
Si l'on part du principe que tous les chemins de code pertinents sont visités pendant la durée du test, on peut supprimer les autres. Malheureusement, cette hypothèse ne se vérifiera probablement pas entièrement. Vous devrez donc continuer à appliquer votre connaissance de l'application et de son fonctionnement interne lorsque vous en supprimerez des parties. Ceci est d'autant plus important lors de la suppression de parties déclaratives (comme les références de modèles) car celles-ci ne sont souvent pas directement exécutées mais seulement utilisées pour configurer d'autres parties du système.
Une autre approche, qui pourrait être combinée avec la précédente, consiste à essayer de remanier votre application pour en faire des fonctions distinctes que vous pouvez activer ou désactiver. Ensuite, vous pouvez désactiver les fonctionnalités qui sont suspectées d'être inutilisées et vérifier si personne ne se plaint :)
Enfin, vous ne trouverez pas d'outil magique pour effectuer votre analyse complète. En effet, aucun outil ne peut savoir si un certain morceau de code est utilisé par des utilisateurs réels ou non. La seule chose que les outils peuvent faire est de créer (plus ou moins) des graphes d'accessibilité statiques, vous indiquant si votre code est appelé d'une manière ou d'une autre à partir d'un certain point. Avec un langage dynamique comme Ruby, même cela est assez difficile à réaliser, car l'analyse statique n'apporte pas beaucoup d'informations face à la méta-programmation ou aux appels dynamiques qui sont fortement utilisés dans un contexte de rails. C'est pourquoi certains outils exécutent votre code ou tentent d'obtenir des informations à partir de la couverture des tests. Mais il n'y a certainement pas de formule magique.
Ainsi, étant donné la grande complexité interne (le plus souvent cachée) d'une application ferroviaire, vous n'aurez pas la possibilité d'effectuer la plupart des analyses à la main. Le meilleur conseil serait probablement d'essayer de modulariser votre application et de désactiver certains modules pour tester s'ils ne sont pas utilisés. Ceci peut être soutenu par des tests d'intégration appropriés.
4 votes
Par inutilisé, voulez-vous dire : (A) qu'il n'y a aucun moyen d'appeler la méthode à partir de l'application web ou (B) qu'elle n'est pas utilisée par vos visiteurs ?
0 votes
Les deux, mais c'est le B qui a le plus de valeur à mes yeux. Merci de votre compréhension. Des suggestions pour B ?
0 votes
Si c'est ce que vous recherchez, il semble que vous cherchiez un outil d'analyse plutôt qu'une couverture de code, non ? Ou une sorte d'hybride. Je ne sais pas si quelqu'un a inventé cela, si nous ne pouvons même pas le nommer. +1 pour l'intérêt.
1 votes
C'est une excellente question. Je n'ai pas de réponse, mais je suis avec impatience cet article pour voir ce que la communauté va proposer. J'ai hérité d'une application patrimoniale et si j'avais le temps, j'aimerais commencer à la nettoyer.
0 votes
Si vous avez des spécifications de fonctionnalités/systèmes ou au moins de demandes, il pourrait déjà être très utile d'examiner la couverture des tests uniquement pour ces spécifications de haut niveau. Si le code est touché par une spécification de fonctionnalité, il est très peu probable qu'il soit mort. Tous les tests non couverts par les spécifications de fonctionnalités pourraient être inspectés : un test est-il manquant, ou est-il vraiment mort ?