簡體   English   中英

如何使代碼覆蓋率達到100%

[英]How to made the code coverage to 100%

最近我開始寫PHPUnit測試。 這是我的模型代碼。(我使用了CodeIgniter 3)。

Account_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;
    }
}

這是我的測試Account_model_test.php

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。 我建立了PHPUnit測試, if ($query === false)不能解決這個問題。 然后我的代碼覆蓋率沒有達到100%。 這個問題讓我認為100%對於單元測試非常重要嗎? 還是我必須修改我的模型代碼? 感謝您的幫助。

始終保持100%的代碼覆蓋率是很好的。 但是就像您說的那樣,在某些情況下很難做到這一點。 因此,對於大多數項目而言,代碼覆蓋率大於70%相當不錯。 有關項目所需的最小代碼覆蓋率,請參見此鏈接 但是,您應該嘗試將業務邏輯提取到其自己的類(存儲庫)並對其進行單元測試。

如果您也向我們展示您的測試文件,那將是很好的,因此我們可以更清楚地了解您已經擁有的文件。 不知不覺中,我建議使用查詢功能的Mock,因此它可以返回false作為結果。 您可以在此處找到有關Mocks的更多信息

同樣如前所述:您不應專注於100%的代碼覆蓋率。

@codeCoverageIgnore@codeCoverageIgnoreStart@codeCoverageIgnoreEnd批注可用於從覆蓋率分析中排除代碼行。 -PHPUnit手冊

PHPUnit 文檔中有示例。

簡而言之,在*Start *End批注中包裝要被代碼覆蓋率忽略的代碼:

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

另請參閱什么是單元測試的合理代碼覆蓋率百分比(以及原因)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM