测试旧版PHP Spaghetti代码?

时间:2011-12-22 17:00:23

标签: php unit-testing phpunit legacy

我从开发人员那里继承了一个相当大的,自制的,php4 + MySQL,电子商务项目,他们在写作时自学了编程和html。 (我会感到不寒而栗,除非他们能够从头开始做这么多事情,这真是令人印象深刻。)我的工作是保持它并以新功能推进它。

代码的功能取决于$_SESSION数据和其他全局状态结构,这些结构会影响代码流,以及通过require语句显示站点的哪些部分。当我去年接受它时,我的第一个任务是将所有重复内容抽象为单独的文件,这些文件通过require语句包含在内,并从“显示”或输出代码中删除大部分“逻辑”代码,但是我无法将其删除。我已经将代码转移到了我可以使用的函数中,但这仍然非常有限。类和方法现在肯定是不可能的。

所有测试都是手动/视觉完成的。我想开始自动化一些测试,但我根本不知道从哪里开始。函数的单元测试非常简单,但函数中的代码很少,而且大部分都非常简单。我查看了phpUnitDbUnit,但所有关于它们的示例和讨论都集中在类和方法上。

那么,除了项目中最重要的部分之外,我还有哪些选项可以开始实施单元测试?

4 个答案:

答案 0 :(得分:20)

首先关闭 PHPUnit可以用来测试程序代码。不要让PHPUnit示例只显示类阻止你的事实。这就是PHPUnit测试的组织方式。

您可以编写测试类并从中测试您的函数而不会出现任何问题,这应该是您最小的问题:)

如果代码不能在PHP 5.2+上运行,那么你就不能使用当前的PHPUnit版本,这肯定是一个问题,我的第一个建议是找到PHP 5升级可能带来的任何问题。


开始推荐一本书以避免一些麻烦:

Working Effectively with Legacy Code

这本书将帮助你避免许多小错误,你必须自己做一次,并会让你有正确的心态。它基于Java,但这并不是一个问题,因为大多数东西都很容易适应。


测试很难,因为你甚至不知道应用程序应该首先应该是什么

让单元测试运行需要相当长的时间并且不会给你一个状态“它是否仍在工作”所以我的第一点是设置一些集成和前端测试。

Selenium之类的工具和Behat的网络测试部分可以为您提供帮助。

使用Behat的好处是,您可以为产品实际应该做的事情编写好的文档。无论如何进行项目,这些文档都将始终具有

休息读取的内容如下:“当我转到此网址并输入该数据时,应创建一个用户,当我点击那里时,我会收到一封包含我的数据导出的电子邮件”。看看这个。它可能很有用。


最重要的是如果事情仍然有效,可以获得一个快速的绿色/红色指示灯!

如果你发现尽管你的“光”是绿色的,它就会被打破,你可以从那里开始扩展测试。


当你不知道什么时候它被打破时,你永远不会有足够的信心来改变足够的东西,这样你就可以逐步改善需要修理或改变的东西。


在你普遍意识到一切如何运作并且你相信你的小测试向你展示当你打破“整件事”时我会说是时候设置一个像{{{{}}这样的小Continuous integration服务器了3}}用于PHP,允许您跟踪项目的状态。你一开始就不需要所有的QA东西(也许是为了对项目进行概述)但只是看到所有“它仍然有用”的东西返回“是”非常重要并且节省了大量的时间确保那是手动的。

<2> 2%代码覆盖率很无聊

当您处于单元测试和代码覆盖率发挥作用的位置时,您将面临平均读取0%。从来没有看到这个数字上升很多,这可能会非常烦人。

但您想确保测试新代码,因此我建议您使用Jenkins作为PHP_Change_Coverage,因此请确保您接触的所有内容都经过测试。

PHP Black Magic

function stuff() {
    if(SOME_OLD_UGLY_CONST == "SOME SETTING") {
         die("For whatever reasons");
    }
    return "useful stuff";
}

当你的脚本die()进行测试时,真的很烦人但是怎么做?

在没有测试的情况下重新编写所有脚本可能比完全不做任何事情更有害,所以也许你想要先破解以获得测试。

对于这个可怕事物的其他解决方案,有described in this blog posting扩展名。

<?php
set_exit_overload(function() { return FALSE; }
exit;
print 'We did not exit.';
unset_exit_overload();
exit;
print 'We exited and this will not be printed.';
?>

答案 1 :(得分:6)

我可能会开始使用像Watir或Selenium这样的工具进行测试。这将允许您自动对整个页面进行黑盒测试。一旦设置了这些测试,就可以开始重构PHP页面,并在进行重构时构建单元测试。

答案 2 :(得分:2)

没有单元测试的遗留代码总是很痛苦。没有真正的解决方案,因为大部分时间代码的编写方式都不是单元可测试的。在工作中,我们也必须处理大量遗留代码。我们为新编写的代码编写了单元测试(这也很痛苦,因为你需要能够设置一些测试数据和类似的东西)。通过这种方式,它不会变得更糟,您将覆盖在新代码中调用的越来越多的旧遗留代码。这样做,您每次都可以更接近单元测试所涵盖的代码。

答案 3 :(得分:2)

你面临一项重大任务。您可能无法在任何合理的时间内对所需的所有测试进行编码,如果他们认为应用程序主要起作用,您的经理将不会在意。

您应该做的是专注于为修改的应用程序代码构建测试。如果您的应用程序有生命,那将有很多,让您忙碌。

你应该 还验证您实际测试新代码。通过将新的签到(你正在使用源代码控制,如果没有,首先修复!)与旧的签到,您可以看到已更改的内容并获取有关更改位置的精确位置信息。你(你的经理应该)想要证明这些变化已经过测试。您可以使用代码覆盖工具来告知已测试的内容,并将其与新更改的位置相交;交叉点更好地包括所有修改过的代码。 我们的PHP Test Coverage可以提供覆盖率信息,并可以计算此类交叉点数据。