蒙国造博客

单元测试原理简析

我们稍微剖析单元测试的原理,从最简单的例子剖析它的机制。

假设我们有这样一个加法函数:

/**
 * 求两个数的和
 * @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();
    }
}

这样,我们在使用的时候,就不用每次都写ifecho语句,变成:

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));

这就是单元测试的基本原理了

退出移动版