2016-08-30 23 views
1

最近我开始编写PHPUnit测试。这是我的模型代码(我使用了CodeIgniter 3)。如何使代码覆盖率达到100%

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%对单元测试非常重要?或者我不得不修改我的模型代码?谢谢你的帮助。

+0

如果您的目标是100%覆盖,那么您错过了编写测试的目的。 – axiac

回答

2

总是有100%的代码覆盖率是很好的。但正如你所说的,在这种情况下很难实现。因此,大部分项目的代码覆盖率都超过70%。有关项目中所需的最低代码覆盖范围,请参阅this link。但是你应该尝试将你的业务逻辑提取到它自己的类(Repository)并且对它进行单元测试。

0

如果您还向我们展示您的测试文件,那将是一件好事,因此我们可以更清楚地了解您已经拥有的内容。 不知道,我可以建议使用查询功能的模拟,所以它可以返回false作为结果。你可以找到更多关于Mocks的内容here

同样如前所述:你不应该专注于100%的代码覆盖率。

+0

嗨,我想到了(使用模拟)。但我只是没有使用模拟并达到100%。我认为你的权利。我不应该专注于100%的代码覆盖率。 – lighter

+0

我修改我的文章,我添加了我的模型测试。 – lighter