迷惘的码农。
分类:
2008-03-25 10:44:13
再好的程序员也会犯错.程序员的好坏区别在于,好的程序员尽可能早地利用测试检测错误所在。越早测试,发现错误的机会越大,发现和修正的代价就越小。这解 释了为什么在软件发布前才进行测试会有那么多问题。大多数错误都未被发现,而且修正已发现错误的代价如此之大,以至于你必须有选择地进行处理,因为根本不 可能全部修复。
使用PHPUnit进行测试与你曾经的做法并非完全不同。它只是在操作方式上有所不同。区别在于测试和执行成套测试,前者检查程序行为是否符合预期,后者是可运行的代码片断,它们自动测试软件各部分(单元)的正确性。这些可运行的代码片断称为单元测试。
本章我们从简单的基于print
的测试代码开始,到完整的自动化测试(结束)。假设要我们测试PHP内建的array
。一个要测试的功能是函数sizeof()
。对于新建的数组,我们期望sizeof()
函数返回0
。假如一个元素后,sizeof()
应该返回1
。是我们要测试的(代码)。
范例 1.1: 测试数组和sizeof()
$fixture = array();
// $fixture应该为空。
$fixture[] = 'element';
// $fixture应该含有一个元素。
?>
检查我们是否得到预期结果的简单方法是在增加元素前后显示sizeof()
的结果(见)。如果先后得到0
和1
,array
和sizeof()
行为符合预期。
范例 1.2: 使用print测试数组和sizeof()
$fixture = array();
print sizeof($fixture) . "\n";
$fixture[] = 'element';
print sizeof($fixture) . "\n";
?>
0
1
现在,我们要把需要人工解释(结果)的测试变为自动运行的测试。在中,我们把预期值和实际值的比较写入测试代码,如果相同就输出ok
。一旦看到not ok
消息,我们就知道有错误。
范例 1.3: 比较预期值和实际值以测试数组和sizeof()
$fixture = array();
print sizeof($fixture) == 0 ? "ok\n" : "not ok\n";
$fixture[] = 'element';
print sizeof($fixture) == 1 ? "ok\n" : "not ok\n";
?>
ok
ok
现在我们把预期值和实际值得比较提取出来,放入一个函数,它会在存在差异时扔出一个异常。()。这有2个好处:编写测试变得更容易,而且只在出错时产生输出。
范例 1.4: 使用断言函数测试数组和sizeof()
$fixture = array();
assertTrue(sizeof($fixture) == 0);
$fixture[] = 'element';
assertTrue(sizeof($fixture) == 1);
function assertTrue($condition)
{
if (!$condition) {
throw new Exception('Assertion failed.');
}
}
?>
现在测试完全自动化了。相对于我们的第一版测试,该版已是自动化测试。
使用自动化测试的目的是少犯错。即使有了极好的测试,你的代码仍不理想,一旦开始自动化测试,你将会发现缺陷明显减少。自动化测试确保你的代码的可信性。 这种可信性使你可以在设计上做出更大胆的跨越(重构),同队友合作得更好(跨团队测试),改善同客户的关系,并且每晚安心回家,因为(事实)证明你的努力 使系统比以前更好了。