2016-08-30 2 views
1

는 최근에 나는 phpunit을 테스트를 작성하기 시작했다. 그리고 이것은 내 모델 코드입니다 (CodeIgniter 3를 사용했습니다). 나 자신에 의해 SQL을 쓰기 때문에은 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); 
    } 

    ... 
} 

내 테스트 입니다. 내 PHPUnit 테스트를 설립하여 이것을 if ($query === false)에 적용 할 수 없습니다. 그리고 나서 제 코드 범위는 100 %를 달성하지 못했습니다. 이 문제는 100 %가 단위 테스트에서 매우 중요하다고 생각하게합니까? 또는 모델 코드를 수정해야합니까? 고마워.

+0

당신은 필기 시험의 목적을 놓쳤다. – axiac

답변

2

항상 코드 커버리지 100 %를하는 것이 좋다. 그러나 당신이 말했듯이, 이것이 성취하기가 매우 어려운 상황이 있습니다. 따라서 70 % 이상의 코드 커버리지를 갖는 것이 대부분의 프로젝트에 유용합니다. 프로젝트에 필요한 최소 코드 적용 범위는 this link을 참조하십시오. 하지만 비즈니스 논리를 자체 클래스 (리포지토리)에 추출하고 단위 테스트를 시도해야합니다.

0

당신은 또한 우리에게 당신의 테스트 파일을 보여 있다면 그것은 좋은 것입니다, 그래서 우리는 당신이 이미이 일에 대해 더 명확 할 수있다. 모르는 사이에 내가 제안 할 수있는 것은 쿼리 함수의 Mock을 사용하는 것이므로 false을 결과로 반환 할 수 있습니다. 100 %의 코드 커버리지에 초점을 안 : 이전에 작성된대로 모의 객체 또한 here

에 대한 자세한 내용을 확인할 수 있습니다.

+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)?를 참조하십시오. 100 % 적용을 목표로하는 경우

관련 문제