有没有办法预处理ruby代码并找到运行时会发生的错误?

时间:2016-07-08 15:14:38

标签: ruby-on-rails ruby rubygems

我们拥有庞大的代码库,并且我们正在生成在编译时以Java等类型语言捕获的问题,但我们直到Ruby中的运行时才会捕获它们。这很糟糕,因为我们生成的错误大部分时间都是错别字或重构会留下一些无效的代码。

示例:

def mysuperfunc
    # some code goes here

    # this was a valid call but not anymore since enforcesecurity
    # signature changed
    @system.enforcesecurity
end

我的意思是,IDE可以做到但有些人使用ATOM或崇高,所以我们需要一些东西来编译"并报告此类问题,以便他们无法实现部署。你一直在用什么?

这产生了我们的错误报告的一小部分,但由于我们被迫以荒谬的速度生产,我们没有100%的代码覆盖率。如果没有工具可以提供帮助,我只需确保每个人都使用IDE并使用Rubymine等工具运行报告。

我们的堆栈包括rspec,minitest,SimpleCov。我们强制执行代码审查,多包部署(dev,qa,pre-prod,sandbox,prod)。还有一些问题正在达到更高的水平,并使我们的程序员看起来很糟糕。我不是在寻找魔法,只是一点自动化可能会有所帮助。

4 个答案:

答案 0 :(得分:4)

不幸的是,Halting问题,Rice的定理以及所有其他Undecidability和Uncomputability Results告诉我们,在一般情况下,根本不可能静态地确定关于运行时行为的任何“有趣”属性一个程序。我们甚至无法静态地确定像“它会停止”这样简单的事情,那么我们如何确定“没有错误”?

某些可以静态确定的东西,并且某些受限制的程序可以静态地确定一些有趣的属性,但在很大程度上,这是不可能的。即使在很小的范围内 可能,它通常要求语言专门设计为易于静态分析(Ruby不是)。

话虽如此,有些工具包含某些启发式来指出可能有问题的代码。某些编码标准可能有助于避免错误,并且有一些工具可以强制执行这些编码标准。要搜索的关键字是“代码质量工具”,“linter”,“静态分析器”等。您已经在其他答案和评论中给出了示例,并且给出了这些示例和这些关键字,您可能会发现更多。

但是,我也想讨论你写的东西:

  

我们被迫以荒谬的速度制作,我们没有100%的代码覆盖率

这是一个问题,必须从两个方面来解决:

  1. 练习,练习,练习。您需要练习测试并编写高质量的代码,直到所以自然而然地这样做实际上最终变得更难和更慢。它应该成为你的第二天性,当你的思绪空白时,在压力下,你知道的唯一的事情是编写测试并编写设计良好,考虑周全的高质量代码。注意:我说的是故意练习,这意味着将时间放在真正的练习上......练习是练习,它不起作用,它是没有趣,这不是业余爱好,如果你没有删除你写完后立即写的代码,你没有练习,你就是在工作。
  2. 可持续发展。你应该从不发展得比你无限期保持的速度更快,同时仍然生产经过充分测试,精心设计,精心设计,高质量的代码,拥有充实的社交生活,没有压力,充足的空闲时间等。管理层必须支持和理解这一点。

答案 1 :(得分:2)

我没有意识到你想要的任何东西。但是,有一些宝石将分析代码并警告您一些错误和/或不良做法。试试这些:

答案 2 :(得分:2)

<强>去皮

https://rubygems.org/gems/flay

通过回购https://github.com/seattlerb/flay

  

描述:

     

Flay分析结构相似性的代码。字面上的差异   值,变量,类,方法名称,空格,编程风格,   大括号vs do / end等都被忽略了。完全做到这一点。

     

[特性:

     
      
  • 报告任何级别代码的差异。
  •   
  • 为相同的节点添加分数乘数。
  •   
  • 忽略文字值,变量,类和方法名称的差异。
  •   
  • 忽略空格,编程风格,大括号与do / end等的差异。
  •   
  • 跨文件工作。      
        
    • 添加flay-persistent插件以适应大型/多个项目。
    •   
  •   
  • 运行--diff以查看代码的N路差异。
  •   
  • 提供保守(默认)和--liberal修剪选项。
  •   
  • 提供--fuzzy重复检测。
  •   
  • 语言无关:插件系统允许其他语言被剥离。      
        
    • 使用.rb.erb发货。
    •   
    • javascript和其他人会   单独提供。
    •   
  •   
  • 为Rakefiles包含FlayTask
  •   
  • 使用path_expander,您可以使用:      
        
    • dir_arg - 自动展开目录
    •   
    • @file_of_args - 在文件中保留参数
    •   
    • -path_to_subtract - 忽略相交的子集   文件/目录
    •   
  •   
  • 跳过通过.flayignore中的模式匹配的文件(.gitignore的子集格式)。
  •   
  • Totally rad。
  •   

<强> FLOG

https://rubygems.org/gems/flog

通过回购https://github.com/seattlerb/flog

  

描述:

     

Flog在易于阅读的痛苦报告中报告最受折磨的代码。   分数越高,代码就越痛苦。

     

[特性:

     
      
  • 易于阅读报告复杂性/痛苦。
  •   
  • 使用path_expander,您可以使用:      
        
    • dir_arg - 自动展开目录
    •   
    • @file_of_args - 在文件中保留参数
    •   
    • -path_to_subtract - 忽略文件/目录的交叉子集
    •   
  •   
     

概要:

% ./bin/flog -g lib
Total Flog = 1097.2 (17.4 flog / method)

   323.8: Flog total
    85.3: Flog#output_details
    61.9: Flog#process_iter
    53.7: Flog#parse_options
...

答案 3 :(得分:1)

有一种名为Guard的红宝石宝石可以进行自动化测试。您可以设置自己的自定义规则。

例如,您可以随时修改某些文件,测试框架将自动运行。

以下是guard

的链接