【问题标题】:Functionality testing with Test database/data for PHPUnit使用 PHPUnit 的测试数据库/数据进行功能测试
【发布时间】:2014-08-02 06:03:12
【问题描述】:

我是 PHPUnit 测试的新手,非常感谢您的帮助,看看我是否采用了正确的方法。

我正在尝试测试我的方法;我有两个问题

1) 如何让我的测试数据库包含虚拟数据?现在我在 pdo_connect 类中拥有所有数据库设置,并且在该类的构造函数中,我正在执行所有数据库初始化,包括 dbname、host、...;我已经包含了我想在这里测试的方法以及我的测试用例;我的问题是根据不同的环境更改我的数据库进行测试是否是一种好习惯;例如,如果我的设置中的“环境”变量是“测试”,我使用具有虚拟数据的“测试”数据库,并且...

2) 如果您确认下面提到的示例测试用例是对我的方法进行功能测试的正确方法,我也非常感谢!

static public function get_images($id) {
    try {
        $conn = new pdo_connect();
        $query = "  SELECT ....";
        $result = $conn->prepare($query);
        $result->bindParam(':id', $id);
        $result->execute();
        $array_result = $result->fetchAll(PDO::FETCH_OBJ);        
        $result_Set = array($paginate_result, TRUE);
    }
    catch (Exception $e) {
        $result_Set = array($e->getMessage(), FALSE);
    }
    return $result_Set;
}

和我的测试:

class SomeTest extends PHPUnit_Framework_TestCase {
    public function __construct() {
        require_once('../includes/model.php');
    }
    public function test_id_not_exist() {
        $con = $this->getMock('conn');  
        $dao = new Model($con);
        $result = MODEL::get_images(555);
        $expected = array(array(), True);
        self::assertEquals($expected, $result);
    }
}

如果您需要更多说明,请告诉我...再次感谢您...

【问题讨论】:

    标签: php unit-testing testing phpunit


    【解决方案1】:

    作为一般规则:测试静态函数可能会很棘手,但在您的情况下它可能会起作用。

    如果这是您的实际代码,则无法切换到测试数据库,因为您在 get_images 中使用 $conn = new pdo_connect() 进行连接。

    您需要的是某种依赖注入方式来插入连接。您不需要模拟它,您只需使用与测试数据库的真实连接即可。

    你可以这样做:

    class Model {
        private static $_conn;
    
        public static function setDb($conn) {
            self::$_conn = $conn;
        }
    
    
        static public function get_images($id) {
            try {
                $conn   = self::$_conn;
                ...
            } catch (Exception $e) {
                $result_Set = array($e->getMessage(), false);
            }
    
            return $result_Set;
        }
    }
    

    你的测试会变成这样(我还删除了一些其他问题):

    public function test_id_not_exist() {
        $con = new pdo_connect();
        Model::setDb($con);
        $result = Model::get_images(555);
        $expected = array(array(), True);
        $this->assertEquals($expected, $result);
    }
    

    要正确地为您的测试数据库播种,您需要在您的测试类中实现一个 setUp 函数,然后它可以插入一些虚拟数据。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2011-05-08
      • 2015-01-27
      • 2011-05-14
      • 2019-04-18
      • 2012-03-20
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多