【问题标题】:How to Achieve Code Coverage for If/Else in PHPUnit?如何在 PHPUnit 中实现 If/Else 的代码覆盖?
【发布时间】:2012-03-10 11:12:33
【问题描述】:

免责声明:我是单元测试的新手,刚刚开始涉足。话虽如此,我知道 100% 并不总是可能的,但我很好奇是否有解决方案来使用 if/else 语句来解决代码覆盖率问题,或者它们是否只是不可测试。 p>

功能:

public function getAll() 
{

    // Query table for all rows sorted by name
    $select = $this->select();
    $select->order('name ASC');
    $rowset = $this->fetchAll($select);

    // Validate and return row
    if($rowset->current())
    {   
        // Return rowset
        return $rowset;
    }
    else { return false; }

}

单元测试

public function testCanGetAll()
{
    // Try to get all states
    $result = $this->model->getAll();
    $this->assertNotNull($result);
    $this->assertNotEquals(false,$result);
}

结果

如您所见,我无法覆盖return false; 行。我能想到的测试它的唯一方法是重命名我的数据库表或类似的东西。

是否有另一种使用 if/else 语句编写函数的方法(这是一种相当普遍的做法),可以更轻松地覆盖代码?

[编辑] 也许最好不要在函数中检查结果,而只返回它?无论调用什么这个函数都必须自己检查?

public function getAll() 
{

    // Query table for all rows sorted by name
    $select = $this->select();
    $select->order('name ASC');
    $rowset = $this->fetchAll($select);

    // Return rowset whether valid or not
    return $rowset; 

}

【问题讨论】:

    标签: php zend-framework phpunit code-coverage


    【解决方案1】:

    创建一个结果将不返回任何行的数据库上下文,然后在您的第二个测试方法中在该数据库上下文中创建一个行。

    针对实际应用程序的数据库进行测试通常不是一个好主意

    您应该为您的测试克隆它,以便您可以操纵数据来测试应用程序将如何响应不同的数据上下文。

    --编辑----

    遵循本指南可能会有所帮助:http://framework.zend.com/manual/ru/zend.test.phpunit.db.html

    【讨论】:

    • 这对于我的 getByID() 或 getByName() 等函数很容易,我可以传入一个错误的值并以这种方式断言。但这不带参数,只返回所有行。在那种情况下,我没有要修改的上下文。此外,我的应用程序是只读的,不进行任何插入/更新,所以我认为不需要克隆。
    • 您可能需要稍微重构代码以使其更易于测试。你如何保存你的数据库配置?如果您使用单例或静态接口,则可以换出要使用的数据库。在理想情况下,您会转储结构并创建一个新数据库,然后使用预定义的测试记录为该数据库播种,并通过添加或删除行轻松地对其进行测试。
    • 在本例中,我使用的是 Zend Framework (PDO/MySQL)。我的模型扩展了 Zend_Db_Table_Abstract 对象,因此它们的工作方式类似于 ORM。无论如何,这太具体和无关紧要了。我怎样才能将其重构为可测试
    • 如何配置应用程序应该使用的数据库?
    • 我知道那不是问题,我是说您不应该使用您的生产/开发数据库进行测试。您应该有一个空数据库或克隆数据库,您可以在其上进行操作以进行测试。您应该删除代码测试表中的所有行,运行测试,然后添加一行,然后运行测试。这将允许您测试示例函数的两种状态。
    猜你喜欢
    • 2017-05-31
    • 2021-05-19
    • 2012-05-04
    • 2012-11-21
    • 2013-05-07
    • 2012-08-04
    • 2016-10-22
    • 2018-05-29
    • 2015-02-09
    相关资源
    最近更新 更多