70 votes

Trouver du code inutilisé dans une application Rails

Comment savoir quel code est ou n'est pas exécuté ? en production ?

L'application est bien testée, mais il y a beaucoup de tests qui testent inutilisé code. Ils sont donc couverts lors de l'exécution des tests... J'aimerais refactoriser et nettoyer ce désordre, qui me fait perdre mon temps. J'ai beaucoup de tâches en arrière-plan, c'est pourquoi j'aimerais que l'environnement de production me guide. En tournant sur heroku, je peux faire tourner des dynos pour compenser les impacts de performance du profiler.

Question connexe Comment trouver les méthodes inutilisées dans une application Ruby ? n'est pas utile.

Bonus : des mesures pour montrer la fréquence d'exécution d'une ligne de code. Je ne sais pas pourquoi je le veux, mais je le veux ! :)

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.

38voto

Holger Just Points 17345

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.

8 votes

En outre, si vous disposez d'une très bonne suite de tests, vous pouvez constater une utilisation à 100 % du code par le biais des tests unitaires, mais une grande partie de ce code peut ne plus être utilisée en production. J'ai déjà eu des problèmes avec cela, parce que vous vous retrouvez à maintenir du code pendant la refonte pour le rendre compatible avec les changements d'api, alors qu'en réalité le code pourrait simplement être supprimé. Je n'ai pas de bonne réponse à ce problème, je voulais juste apporter mon grain de sel et compatir.

0 votes

Merci Scott. DRY, SRP, loi de Demeter et ainsi de suite - la suppression du code est essentielle. Bon article Holger.

0 votes

Quelqu'un a-t-il de l'expérience dans la mise en place de rcov/simplecov en production ? Nous utilisons la version 1.9.2. Oh, il fonctionne sur heroku, ce qui ajoute le problème de la lecture seule...

21voto

big-circle Points 447

Vous pouvez peut-être essayer d'utiliser rails_best_practices pour vérifier les méthodes et les classes inutilisées.

Le voici dans le github : https://github.com/railsbp/rails_best_practices .

Mettez 'gem "rails_best_practices" ' dans votre Gemfile et exécutez ensuite rails_best_practices . pour générer un fichier de configuration

19voto

Dmitry Polushkin Points 920

Consultez le site bande de recouvrement gem, il fait ce que vous cherchez exactement.

0 votes

@Dimitry, ça a l'air TRES prometteur, je vais l'essayer sur quelques applications et je ferai un rapport.

0 votes

Si vous avez besoin de nettoyer les locales I18n, vous pouvez utiliser cette gemme : github.com/livingsocial/humperdink

0 votes

@oma Des résultats à rapporter avec le Coverband gem ? Je vous prie d'agréer, Madame, Monsieur, l'expression de mes salutations distinguées :)

14voto

katzmopolitan Points 575

J'ai eu le même problème et après avoir exploré quelques alternatives, j'ai réalisé que j'avais toutes les informations disponibles dans la boîte - les fichiers journaux. Le format de notre journal est le suivant

Dec 18 03:10:41 ip-xx-xx-xx-xx appname-p[7776]:   Processing by MyController#show as HTML

J'ai donc créé un simple script pour analyser cette information

zfgrep Processing production.log*.gz |awk '{print $8}' > ~/tmp/action

sort  ~/tmp/action | uniq -c |sort -g -r > ~/tmp/histogram

Ce qui a permis d'obtenir des résultats sur la fréquence d'accès à une action d'un contrôleur donné.

4394886 MyController#index
3237203 MyController#show
1644765 MyController#edit

L'étape suivante consiste à le comparer à la liste de toutes les paires contrôleur#action dans l'application (en utilisant rake routes output ou en faisant la même chose script pour la suite de tests).

4voto

aleksey.berezan Points 2696

Je ne suis pas très familier avec Ruby et RoR, mais ce que je suggérerais, c'est une supposition farfelue :

  • ajouter :after_filter méthode qui enregistre dans un fichier le nom de la méthode appelée précédemment (à partir de la pile d'appels)
  • déployer en production
  • attendre un peu
  • supprimer toutes les méthodes qui ne figurent pas dans le journal.

p.s. La solution avec Alt+F7 dans NetBeans ou RubyMine est probablement bien meilleure :)

1 votes

Ni RubyMine ni NetBeans ne comprennent la métaprogrammation. Le fait de dire "no usage found" ne signifie pas nécessairement qu'il n'y a pas d'usage. Il s'agit d'une application importante, je cherche une approche plus robuste et éprouvée, et non pas à écrire mon propre outil de couverture de la production.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X