Php 如何使代码覆盖率达到100%

Php 如何使代码覆盖率达到100%,php,phpunit,Php,Phpunit,最近我开始编写PHPUnit测试。这是我的模型代码。(我使用了CodeIgniter 3) Account\u model.php class Account_model extends CI_Model { ... public function select_by_seq($seq = '', $select_columns = []) { try { $bind = [':a_seq' => $seq];

最近我开始编写PHPUnit测试。这是我的模型代码。(我使用了CodeIgniter 3)

Account\u model.php

class Account_model extends CI_Model
{
    ...

    public function select_by_seq($seq = '', $select_columns = [])
    {
        try {
            $bind = [':a_seq' => $seq];

            // check $select_colums is exist in table
            if ($this->check_column($select_columns) === false)
            {
                throw new Exception('columns illegal', 201);
            }        

            ...

            $sql = "select ....
                    from {$this->db->dbprefix('account')}
                    where a_seq = :a_seq";

            $query = $this->db->query($sql, $bind);

            // ===== this always not runing. =====
            if ($query === false)
            {
                // ===== this always not runing. =====
                throw new Exception('sql errors', 301); 
            }
            else
            {
                return $query->result_array();
            }
        }
        catch (Exception $error)
        {
            // set error log
            $this->set_error_log($error->getCode() . $error->getMessage());
        }

        return false;
    }
}
class Account_model_test extends TestCase
{
    public static function setUpBeforeClass()
    {
        parent::setUpBeforeClass();

        $CI =& get_instance();

    }

    public function setUp()
    {
        $this->resetInstance();

        loader('model', 'account_model');

        $this->obj = $this->CI->account_model;
    }

    public function test_select_by_seq()
    {
        $result = $this->obj->select_by_seq(
            $seq = '20160830'
        );

        $this->assertCount(1, $result);
    }

    public function test_select_by_seq_with_illegal_column()
    {
        $result = $this->obj->select_by_seq(
            $seq = '20160830',
            $select_columns = ['illegal']
        );

        $this->assertFalse($result);
    }

    ...
}
这是我的测试Account\u model\u test.php

class Account_model extends CI_Model
{
    ...

    public function select_by_seq($seq = '', $select_columns = [])
    {
        try {
            $bind = [':a_seq' => $seq];

            // check $select_colums is exist in table
            if ($this->check_column($select_columns) === false)
            {
                throw new Exception('columns illegal', 201);
            }        

            ...

            $sql = "select ....
                    from {$this->db->dbprefix('account')}
                    where a_seq = :a_seq";

            $query = $this->db->query($sql, $bind);

            // ===== this always not runing. =====
            if ($query === false)
            {
                // ===== this always not runing. =====
                throw new Exception('sql errors', 301); 
            }
            else
            {
                return $query->result_array();
            }
        }
        catch (Exception $error)
        {
            // set error log
            $this->set_error_log($error->getCode() . $error->getMessage());
        }

        return false;
    }
}
class Account_model_test extends TestCase
{
    public static function setUpBeforeClass()
    {
        parent::setUpBeforeClass();

        $CI =& get_instance();

    }

    public function setUp()
    {
        $this->resetInstance();

        loader('model', 'account_model');

        $this->obj = $this->CI->account_model;
    }

    public function test_select_by_seq()
    {
        $result = $this->obj->select_by_seq(
            $seq = '20160830'
        );

        $this->assertCount(1, $result);
    }

    public function test_select_by_seq_with_illegal_column()
    {
        $result = $this->obj->select_by_seq(
            $seq = '20160830',
            $select_columns = ['illegal']
        );

        $this->assertFalse($result);
    }

    ...
}

因为我自己写SQL。如果($query==false),我发现我的PHPUnit测试不能覆盖这个
。然后我的代码覆盖率没有达到100%。这个问题让我觉得100%对于单元测试非常重要?或者我必须修改我的模型代码?谢谢你的帮助

始终保持100%的代码覆盖率是件好事。但正如你所说,在某些情况下,这是很难实现的。因此,对于大多数项目来说,代码覆盖率大于70%是非常好的。有关项目中要求的最低代码覆盖率,请参见。但您应该尝试将业务逻辑提取到它自己的类(存储库)中,并对其进行单元测试

如果您也向我们展示您的测试文件,那就太好了,这样我们就可以更清楚地了解您已有的测试文件。 在不知道的情况下,我可以建议使用Mock of query函数,这样它就可以返回
false
。你可以找到更多关于mock的信息

同样如前所述:您不应该关注100%的代码覆盖率

@codeCoverageIgnore
@codecoverageignorest
@codecoverageignorend
注释可用于从覆盖率分析中排除代码行。-

PHPUnit中有一些例子

简而言之,将要被代码覆盖率忽略的代码包装在
*开始
*结束
注释中:

if (false) {
    // @codeCoverageIgnoreStart
    print '*';
    // @codeCoverageIgnoreEnd
}

另请参见。

如果你的目标是100%覆盖率,那么你就错过了编写测试的目的。嗨,我已经想到了(使用mock)。但我只是没有使用mock并实现100%。我认为你是对的。我不应该专注于100%的代码覆盖率。我修改了我的文章,添加了我的模型测试。