测试旧版PHP Spaghetti代码?

Cla*_*ton 17 php legacy phpunit unit-testing

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

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

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

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

edo*_*ian 20

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

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

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


开始一本书的建议,以节省一些麻烦:

Working Effectively with Legacy Code

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


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

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

Selenium这样的工具和Behat的网络测试部分可以帮到你很多.

使用Behat的好处是你可以编写很好的文档来说明产品应该做什么.无论如何进行项目,这些文档总是对您有价值.

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


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

如果你发现尽管你的"光"是绿色的,它仍然被打破,你可以从那里开始扩展测试.


当你不知道它何时被打破时,你永远不会有足够的信心改变足够的东西,以便你可以逐步改进需要修复或改变的东西.


在你对一切工作方式有一般意识并且你相信你的小测试向你展示当你打破"整件事"时我会说是时候设置一个像Jenkins for PHP这样的小型持续集成服务器,让你跟踪项目的状态随着时间的推移.你一开始就不需要所有的QA东西(也许是为了对项目进行概述)但只是看到所有"它仍然有用"的东西返回"是"非常重要并且节省了大量的时间确保那个手动.

2%的代码覆盖率很无聊

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

但是你想确保你测试新代码所以我建议使用PHP_Change_Coverage,described in this blog posting因此请确保你接触的所有内容都有测试结果.

PHP Black Magic

function stuff() {
    if(SOME_OLD_UGLY_CONST == "SOME SETTING") {
         die("For whatever reasons");
    }
    return "useful stuff";
}
Run Code Online (Sandbox Code Playgroud)

测试时,你的脚本真的很烦人,die()但该怎么办?

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

对于这个可怕的东西的其他解决方案有php test helpers扩展.

<?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.';
?>
Run Code Online (Sandbox Code Playgroud)


Bri*_*ver 6

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