2016-08-30 10 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; 
    } 
} 

私は自分でSQLを書くので、これは私のテスト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); 
    } 

    ... 
} 

です。私は私のPHPUnitテストを設立したのはこれをカバーすることができませんif ($query === false)。そして、私のコードカバレッジは100%に達しませんでした。この問題は、100%が単体テストにとって非常に重要だと私に考えさせてくれましたか?それともモデルコードを修正する必要がありましたか?ありがとうございます。

+0

あなたが100%のカバレッジを目指す場合、テストを書く目的を忘れてしまいました。 – axiac

答えて

2

コードカバレッジを常に100%にするとよいです。しかし、あなたが言うように、これは達成が非常に難しい状況があります。したがって、70%を超えるコードカバレッジを持つことは、ほとんどのプロジェクトにとって非常に良いことです。プロジェクトで必要な最小コードカバレッジについては、this linkを参照してください。しかし、ビジネスロジックを独自のクラス(リポジトリ)に抽出して単体テストしようとする必要があります。

0

テストファイルも表示していただければよいので、既にそこにあるものをより明確にすることができます。 それを知らずに、私が提案できるのは、クエリ関数のMockを使用することです。その結果、結果としてfalseを返すことができます。 Mockの詳細はこちらhere

また、100%のコードカバレッジには集中しないでください。

+0

こんにちは、私はそれを考えました(モックを使う)。しかし、私はちょうどモックを使用せず、100%達成しました。そして私はあなたの権利を考えます。 100%のコードカバレッジに集中すべきではありません。 – lighter

+0

私の記事を変更し、モデルテストを追加しました。 – lighter

0

@codeCoverageIgnore@codeCoverageIgnoreStart@codeCoverageIgnoreEnd注釈は、カバレッジ解析からコードの行を除外するために使用することができます。 - PHPUnit Manual

PHPUnit documentationに例があります。一言で言えば

*Start*End注釈にコードカバレッジによって無視されるようにコードをラップ:

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

What is a reasonable code coverage % for unit tests (and why)?を参照してください。

関連する問題