我们稍微剖析单元测试的原理,从最简单的例子剖析它的机制。
假设我们有这样一个加法函数:
/** * 求两个数的和 * @param $a int 输入值 * @param $b int 输入值 */ function add($a, $b) { return $a + $b; }
在上线之前,我们要测试该函数功能是否达到期望。
没有用单元测试前,我们会写类似这样的测试代码:
// 测试代码,如果输出3说明函数功能OK echo add(1, 2); // 为了更确切些,我们可能多写几个测试 echo add(0, 5); echo add(100, -99);
有时候为了查看实际值和期望值,我们会把两个值都打印出来,
$expect = 3; $result = add(1, 2); if ($result != $expect) { echo '期望输出:’, $expect, ’,实际输出:', $result; }
我们发现,这种判断方式其实可以重用。
于是,我们把它写成一个函数:
/** * 判断两个值是否相等 * 如果不相等,输出提示信息并中断执行 * 如果相等,不输出任何信息 * @param $expect mixed 期望的值 * @param $real mixed 实际的值 */ function isEquals($expect, $real) { if ($expect != $real) { echo '期望输出:', $expect, ',实际输出:', $real; exit(); } }
这样,我们在使用的时候,就不用每次都写if
和echo
语句,变成:
isEquals(3, add(1, 2)); isEquals(5, add(0, 5)); isEquals(1, add(100, -99));
这就是单元测试的原理。
判断一个方法的输出是否为预期结果,如果是,则继续执行其他判断;如果不是,输出预期值和实际值。
PHPUnit里面有大量这种判断方法,并起了个专用名词:断言(英文assert)。
断言其实就是判断,判断某个方法的输出是否等于(或者不等于)期望的值。
如果是,则不输出任何信息;
如果不是,说明给定方法没有实现预期的功能,PHPUnit就会输出提示信息。
PHPUnit中的assertEquals()
就和我们上面实现的isEquals()
一样,判断两个值是否相等。
在PHPUnit这样用:
assertEquals(3, add(1, 2));
这就是单元测试的基本原理了