技术开发 频道

利用单元测试检查PHP代码

    这组测试覆盖了从表中删除作者、向表中插入作者以及在验证作者是否存在的同时插入作者等功能。这是一个累加的测试,我发现对于寻找错误来说这非常有用。观察一下哪些测试可以正常工作,而哪些测试不能正常工作,就可以快速地找出哪些地方出错了,然后就可以进一步理解它们之间的区别。

    最初产生失败的 dblib.php PHP 数据库访问代码版本如下所示。

    清单 7. dblib.php          <?php

        require_once('DB.php');
        class Authors
        {
            public static function get_db()
        {
            $dsn = 'mysql://root:password@localhost/unitdb';
            $db =& DB::Connect( $dsn, array() );
            if (PEAR::isError($db))
             {
                 die($db->getMessage());
             }
            return $db;
        }
            public static function delete_all()
            {
                return false;
            }
            public static function insert( $name )
            {
                return false;
            }
            public static function get_all()
            {
                return null;
            }
        }
        ?>


    对清单 8 中的代码执行单元测试会显示这 3 个测试全部失败了:

     清单 8. dblib.php

         % phpunit TestAuthors.php
        PHPUnit 2.2.1 by Sebastian Bergmann.
        FFF
        Time: 0.007500171661377
        There were 3 failures:
        1) test_delete_all(TestAuthors)
        2) test_insert(TestAuthors)
        3) test_insert_and_get(TestAuthors)
        FAILURES!!!
        Tests run: 3, Failures: 3, Errors: 0, Incomplete Tests: 0.
        %


    现在我们可以开始添加正确访问数据库的代码 —— 一个方法一个方法地添加 —— 直到所有这 3 个测试都可以通过。最终版本的 dblib.php 代码如下所示。


    清单 9. 完整的 dblib.php          <?php

        require_once('DB.php');
        class Authors
        {
            public static function get_db()
                {
                    $dsn = 'mysql://root:password@localhost/unitdb';
                    $db =& DB::Connect( $dsn, array() );
                    if (PEAR::isError($db))
                     {
                          die($db->getMessage());
                     }
                    return $db;
                }
            public static function delete_all()
                {
                    $db = Authors::get_db();
                    $sth = $db->prepare( 'DELETE FROM authors' );
                    $db->execute( $sth );
                    return true;
                }
            public static function insert( $name )
                {
                    $db = Authors::get_db();
                    $sth = $db->prepare( 'INSERT INTO authors VALUES (null,?)' );
                    $db->execute( $sth, array( $name ) );
                    return true;
                }
            public static function get_all()
                {
                    $db = Authors::get_db();
                    $res = $db->query( "SELECT * FROM authors" );
                    $rows = array();
                    while( $res->fetchInto( $row ) )
                     {
                         $rows []= $row;
                     }
                        return $rows;
                }
        }
        ?>


    在对这段代码运行测试时,所有的测试都可以没有问题地运行,这样我们就可以知道自己的代码可以正确工作了。

0
相关文章