PHP中的死代码检测

PHP中的死代码检测,php,refactoring,code-coverage,legacy-code,Php,Refactoring,Code Coverage,Legacy Code,我有一个项目,代码非常混乱——到处都是重复和死代码 不久前,单元测试的代码覆盖率为零,但现在我们正试图以T.D.D.的方式编写所有新代码,并通过单元测试覆盖“旧”代码(最后测试技术)来降低技术债务 业务逻辑的复杂性相当高,有时没有人能够回答是否使用了某些方法 如何找到这种死代码方法?大量的日志记录?更高的测试覆盖率?(这不是很容易,因为客户希望推出新功能)的代码覆盖率工具允许您测试实际执行的代码行,而无需在所有函数/方法中放入跟踪语句 例如: <?php xdebug_start_

我有一个项目,代码非常混乱——到处都是重复和死代码

不久前,单元测试的代码覆盖率为零,但现在我们正试图以T.D.D.的方式编写所有新代码,并通过单元测试覆盖“旧”代码(最后测试技术)来降低技术债务

业务逻辑的复杂性相当高,有时没有人能够回答是否使用了某些方法

如何找到这种死代码方法?大量的日志记录?更高的测试覆盖率?(这不是很容易,因为客户希望推出新功能)

的代码覆盖率工具允许您测试实际执行的代码行,而无需在所有函数/方法中放入跟踪语句

例如:

<?php
    xdebug_start_code_coverage();

    function a($a) {
        echo $a * 2.5;
    }

    function b($count) {
        for ($i = 0; $i < $count; $i++) {
            a($i + 0.17);
        }
    }

    b(6);
    b(10);

    var_dump(xdebug_get_code_coverage());  // array '/path/file.php' => array line_number => int 1 or 0.
?>  

我不知道如何检测完全未使用的代码,这可能超出了所有工具的能力。但在工具方面,请点击查看它们的详细信息

  • 到目前为止,我最喜欢的phploc之一就是从面向对象的角度分解代码,并提供关于多少类、多少函数、多少测试、每个函数的平均loc和圈复杂度的详细信息

  • 我下一个最喜欢的是phpcpd,它是“PHP复制粘贴检测器”。它标记整个代码库,查找公共签名,并提供带有行号的文件列表

  • 该页面上还有很多其他工具,请选择对您有用的工具


自从我们从dotProject分支以来的两年中,我们一直在积极使用这些工具,我们已经从重构中减少了大约35%的代码库,消除了重复(最初是12%,现在大约是2.5%),并且总体上结构更好。这还包括我们的15k+行单元测试

我建议使用xdebug profiler()运行整个系统


在系统中运行,查看日志,并实际查看调用的内容

关于评测工具,如果您决定这样做,您可以查看
xhprof


它有更小的输出文件和web界面,您可以将其嵌入到应用程序中进行连续跟踪。它能够生成调用树的可视化表示。为此,我建议将其置于xdebug之上。

我相信有人实现了一种使用xdebug数据的风格-s101随后将检测任何未使用的集群,即相互使用但与主代码库断开连接的文件

请参阅。您可以按自己喜欢的方式运行代码,包括(或不)按自己喜欢的方式运行测试套件。在执行结束时,您可以看到所执行代码的显示(网站上有截图)。未执行的代码可能已经死了,需要对其进行更多的分析,但如果您很好地运行系统,则未执行的代码要么是错误处理程序,要么是真正的死代码。PHP测试覆盖率工具不需要对PHP服务器进行任何更改


该工具在非常大的源代码库中查找重复代码。它是语言敏感的(覆盖C、C++、爪哇、C、艾达、FORTRAN以及PHP4和PHP5),因此它不会被格式化、空白或注释的存在或不存在的改变所欺骗。它将检测精确拷贝克隆和未遂克隆。该网站展示了几种语言的克隆报告示例。

现在有点晚了,但声称可以静态执行,这应该比使用xprof/xdebug分析实际代码执行情况提供更多信息。

Ben,我可以将它用于单元测试未涵盖的代码吗?xdebug意义上的“代码覆盖率”并不意味着测试覆盖率。这两者不相关,因此您可以使用它来查看执行了哪些行,是否对它们进行了测试。您只需在运行所有测试之前启用代码覆盖率数据收集,然后立即将其关闭,即可在测试期间获取代码覆盖率数据。它可以静态工作,所以它不适用于匿名的东西,比如变量方法($object->$method)或调用用户函数()。它有帮助,但还远远不够完美。是的,不幸的是,没有任何静态工具能够可靠地处理这些问题,因为实际行为只在运行时确定。
phpdcd.phar——排除供应商——递归。
对我有效。此项目不再维护,其存储库仅用于存档目的。