草根也讲品味 高山仰止,虽不能至,然心向往之

订阅

  • phpunit手册—第一章 自动化测试

    优秀的程序员也会犯错误。优秀程序员与普通程序员之间的区别在于,优秀的程序员会尽可能用测试检测自己的代码的bug。你越早测试程序中的问题,你发现它的机会越大,你花费去寻找和修正的时间越少。这就说明在软件发布之前如果缺少有效的测试,软件的问题会很多。大多数错误都没检测到,并且光修复你找到的bug花费的时间是如此的多,以至你不得不对bug进行筛选进行修复,因为你对所有的bug修复不过来。

    使用phpunit进行单元测试与你应该做的测试并不是完全不同的活动。它不过是用另一种方法而已。测试方法之间的区别是,使用phpUnit进行测试的话,它会检测你的代码是不是按期望的执行,执行一组测试,自动测试软件代码的每一部分的正确性。这些可执行的代码片段称为单元测试。

    在这节中,我们将介绍从简单以打印输出为基础的测试到一个完全自动化的测试。思考一下,如果我们被要求去测试php内置的array数组,我们将怎么做?一个简单的测试方法就是使用sizeof()函数。对于一个新建的array数组,我们期望 sizeof()函数返回0.当我们添加一个元素到数组后,sizeof()应该返回1。例1.1,就是我们想测试的。

    例1.1

    $fixture = array();
    // $fixture is expected to be empty.
    // $fixture应该是空的

    $fixture[] = 'element';
    // $fixture is expected to contain one element.
    // $fixture应该只有一个元素
    ?>

    怎么判断是不是我们期望的结果,一个简单的方法就是在数组添加元素前后

    分别打印出sizeof()的结果。如果输出是0和1,那么和我们期望的一样。

    例1.2

    $fixture = array();
    print sizeof($fixture) . "\n";

    $fixture[] = 'element';
    print sizeof($fixture) . "\n";
    ?>

    0

    1

    现在我们想用从手动测试转到自动测试。在例1.3,我们通过比较我们期望的和实际输出的,在代码中我们将添加用于比较的代码,如果两者值一样将输出OK。如果我们看不见OK,那么肯定哪里出问题了。

    例1.3

    $fixture = array();
    print sizeof($fixture) == 0 ? "ok\n" : "not ok\n";

    $fixture[] = 'element';
    print sizeof($fixture) == 1 ? "ok\n" : "not ok\n";
    ?>

    ok

    ok

    现在我们将把比较期望值和实际值的代码整合到一个函数例,如果两者值不一样,这个函数将抛出异常。例1.4, 利用断言函数测试数组,这样有两个好处,一是我们写的测试代码变得容易简单,二是只有出错时才我们才得到异常输出。

    例1.4

    $

    fixture = array();

    assertTrue(sizeof($fixture) == 0);

    $fixture[] = 'element';

    assertTrue(sizeof($fixture) == 1);

    function assertTrue($condition)
    {
    if (!$condition) {
    throw new Exception('Assertion failed.');
    }
    }
    ?>

    这个测试现在完全自动化。我们的第一个版本的测试不是简简单单普通测试,而是一个自动化测试。

    自动化测试的目的是减少代码的bug。当你代码还不是很完美无缺的时候,利用优秀的测试,一旦你开始习惯使用自动化测试你将发现你代码的bug在减少。自动化测试可以表明你的代码你经过测试可信的,增加你对自己代码可信性的信心。有了可信性保证,你可以对你的代码进行大胆的重构,和你的同事和睦相处,和你的客户加强沟通,并且可以每天都可以正常下班回家。因为你的功劳,经过单元测试的系统比当天早晨的要好。

    Published on 七月 12, 2009 · Filed under: UnitTest;
    No Comments

Leave a Reply