我有一个代码非常混乱的项目——到处都是重复和死代码。
前段时间,单元测试的代码覆盖率为零,但现在我们正尝试以 TDD 方式编写所有新代码,并通过单元测试覆盖“旧”代码来降低技术债务(最后测试技术)。
业务逻辑的复杂度相当高,有时没有人可以回答是否使用了某些方法。
如何找到这种死代码方法?广泛的日志记录?更高的测试覆盖率?(这不是很容易,因为客户希望新功能出来)
我有一个代码非常混乱的项目——到处都是重复和死代码。
前段时间,单元测试的代码覆盖率为零,但现在我们正尝试以 TDD 方式编写所有新代码,并通过单元测试覆盖“旧”代码来降低技术债务(最后测试技术)。
业务逻辑的复杂度相当高,有时没有人可以回答是否使用了某些方法。
如何找到这种死代码方法?广泛的日志记录?更高的测试覆盖率?(这不是很容易,因为客户希望新功能出来)
xdebug的代码覆盖工具允许您测试实际执行了哪些代码行,而无需在所有函数/方法中放置跟踪语句。
例子:
<?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.
?>
现在有点晚了,但是PHPDCD声称可以静态地执行此操作,这应该比使用 xprof / xdebug 分析实际代码执行提供更多信息。
我不知道有一种方法可以检测完全未使用的代码,这可能超出了所有工具的能力。但就那里的工具而言,请点击https://phpqa.io/以了解它们。
到目前为止,我最喜欢的 phploc 之一是从面向对象的角度拆解您的代码,并为您提供有关有多少类、多少函数、多少测试、每个函数的平均 loc 和 Cyclomatic Complexity 的详细信息。
我的下一个最爱是 phpcpd,它是“PHP 复制粘贴检测器”。它标记您的整个代码库,查找通用签名,并为您提供带有行号的文件列表。
该页面上还有很多其他工具,请选择对您有用的工具。
我们在 web2project 中积极使用这些工具,在我们从 dotProject 分叉后的两年中,我们已经从重构、消除重复(最初为 12%,现在约为 2.5%)和总体结构化事物中删除了大约 35% 的代码库更好的。这还包括我们的15k + 行单元测试。:)
我建议使用 xdebug profiler ( http://xdebug.org/docs/profiler ) 在系统中运行。
通过系统运行,使用http://code.google.com/p/webgrind/查看日志,并实际查看调用的内容。
请参阅SD PHP 测试覆盖工具。你可以以任何你喜欢的方式运行你的代码,包括(或不)以你喜欢的任何方式运行测试套件。在执行结束时,您可以看到执行了哪些代码(网站上有截图)。未执行的代码可能已经死了,需要您进行更多分析,但是如果您很好地运行系统,未执行的代码要么是错误处理程序,要么是真正的死代码。PHP Test Coverage 工具不需要对您的 PHP 服务器进行任何更改。
SD CloneDR工具可在非常大的源代码库中查找重复代码。它是语言敏感的(涵盖 C、C++、Java、C#、Ada、Fortran 以及 PHP4 和 PHP5),因此它不会被格式、空格或注释的存在或不存在的变化所迷惑。它将检测精确的复制克隆和未命中的克隆。该网站显示了几种语言的示例克隆报告。
关于分析工具,如果您决定采用这种方式,您可以查看xhprof
http://developers.facebook.com/xhprof/
它具有较小的输出文件和 Web 界面,您可以将其嵌入到您的应用程序中以进行持续跟踪. 它能够生成调用树的可视化表示。xdebug
为此,我推荐它。
我相信有人已经实现了使用 xdebug 数据的Structure101g风格 - 然后 s101 将检测任何未使用的集群,即相互使用但与主代码库断开连接的文件。