在Rails应用程序中查找未使用的代码

oma*_*oma 65 ruby refactoring code-coverage ruby-on-rails

如何找到生产中正在运行的代码?

该应用程序经过了充分测试,但有很多测试可以测试未使用的代码.因此,他们在运行测试时得到报道......我想重构和清理这个烂摊子,它不断浪费我的时间.我有很多背景工作,这就是为什么我想要制作环境来指导我.在heroku运行我可以旋转dynos以补偿探查器对性能的影响.

相关问题如何在Ruby应用程序中找到未使用的方法?没有用.

额外奖励:用于显示运行代码行的频率的指标.不知道为什么我想要它,但我做到了!:)

Hol*_*ust 34

在正常情况下,方法是使用您的测试数据进行代码覆盖,但正如您所说,您的部分代码经过测试但未在生产应用程序中使用,您可以做一些稍微不同的事情.

首先要明确:不要相信自动工具.它们只会显示您主动测试的结果,仅此而已.

随着我们后面的免责声明,我建议你使用一个代码覆盖工具(如rcovsimplecov您的生产应用为Ruby 1.9),并衡量实际使用的用户的代码路径.虽然这些工具最初是为测量测试覆盖率而设计的,但您也可以将它们用于生产范围

假设在测试时间范围内访问了所有相关的代码路径,您可以删除其余的代码路径.不幸的是,这种假设很可能不会完全成立.因此,在删除部件时,您仍然需要应用您对应用程序及其内部工作的了解.这在删除声明性部分(如模型引用)时更为重要,因为它们通常不直接运行,而仅用于配置系统的其他部分.

可以与上述方法结合使用的另一种方法是尝试将您的应用重构为可以打开和关闭的显着功能.然后你可以关闭怀疑未使用的功能并检查是否有人抱怨:)

最后一点:你找不到一个神奇的工具来进行全面的分析.那是因为没有工具可以知道实际用户是否使用了某段代码.工具可以做的唯一事情就是创建(或多或少)静态可达性图,告诉您代码是否以某种方式从某个点调用.使用像Ruby这样的动态语言,即使这很难实现,因为静态分析在面向元数据编程或在rails上下文中大量使用的动态调用时并没有带来太多洞察力.因此,有些工具实际运行您的代码或尝试从测试覆盖中获取洞察力.但绝对没有魔法咒语.

因此,考虑到rails应用程序的高内部(主要是隐藏)复杂性,您无需手动完成大部分分析.最好的建议可能是尝试模块化您的应用程序并关闭某些模块以测试它们是否未被使用.这可以通过适当的集成测试来支持.

  • 此外,如果您有一个非常好的测试套件,您可能会通过单元测试看到100%的代码使用情况,但其中很多可能不再用于生产.我之前遇到过这方面的问题,因为你最终在重构期间维护代码以使其与api更改兼容,而实际上代码可能只是被删除.我对这个问题没有一个好的答案,只是想加入并同情. (6认同)

big*_*cle 21

也许您可以尝试使用rails_best_practices来检查未使用的方法和类.

这里是github:https://github.com/railsbp/rails_best_practices.

在您的Gemfile中放入'gem"rails_best_practices"',然后运行rails_best_practices .以生成配置文件


Dmi*_*kin 15

检查封面宝石,它完成你正在搜索的内容.


kat*_*tan 13

我遇到了同样的问题,在探索了一些替代方案之后,我意识到我已经开箱即用了所有信息 - 日志文件.我们的日志格式如下

Dec 18 03:10:41 ip-xx-xx-xx-xx appname-p[7776]:   Processing by MyController#show as HTML
Run Code Online (Sandbox Code Playgroud)

所以我创建了一个简单的脚本来解析这个信息

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

sort  ~/tmp/action | uniq -c |sort -g -r > ~/tmp/histogram
Run Code Online (Sandbox Code Playgroud)

这产生了访问给定控制器#动作的频率的结果.

4394886 MyController#index
3237203 MyController#show
1644765 MyController#edit
Run Code Online (Sandbox Code Playgroud)

下一步是将它与应用程序中所有控制器#操作对的列表进行比较(使用rake路由输出或可以为测试套件执行相同的脚本)


knu*_*nut 5

您已经有了将可疑方法标记为私有的想法(这可能会破坏您的应用程序)。

我过去做的一个小变化:在所有可疑方法中添加一小段代码以记录它。在我的情况下,它是一个用户弹出窗口“您调用了一个过时的功能 - 如果您确实需要,请联系 IT”。一年后,我们对真正使用的东西有了一个很好的概述(它是一个业务应用程序,那里的功能每年只需要一次)。

在您的情况下,您应该只记录使用情况。合理期限后未记录的所有内容均未使用。