2017-01-10 3 views
0

PHPUnit이 완전히 실행을 중단하고 특정 조건 (자체 오류)이 충족되면 어떻게 종료 할 수 있습니까? 실제로 필자가 필요로하는 것은 PHPUnit이 exit()을 함정에 빠뜨리고 종료 대신 계속 실행한다는 점을 제외하면 아래와 같습니다.PHPUnit : 특정 오류시 프로그램 종료를 강제하는 방법

// PHPUnit does not alter existing but empty env vars, so test for it. 
if (strlen(getenv('APP_HOME')) < 1) { 
    $this->fail('APP_HOME set but empty.'); 
    exit(1); // <-- Does not work. 
} 

참고 : 내가 필요하지 않습니다 따라서 나의 XML 파일에 stopOnError="true" 또는 stopOnFailure="true" 설정, 기타 오류 및 고장 정상적으로 계속 실행합니다.

답변

1

난 당신이 몇 가지 재정의를 수행하고 기본 테스트 케이스 클래스에 몇 가지 사용자 정의 동작을 추가하여 이것을 달성 할 수있을 것 같아요.

편집 : 그 시점에서 테스트의 올바른 종료의 원인이됩니다 exit(1); 오히려 $result->stop()보다 호출, 아래의 코드를 실행 한 후 OP에 의해 발견

. 테스트 케이스 클래스의 다음

class MyBaseTestCase extends \PHPUnit_Framework_TestCase 
{ 
    // Test this flag at every test run, and stop if this has been set true. 
    protected $stopFlag = false; 

    // Override parent to gain access to the $result so we can call stop() 
    public function run(\PHPUnit_Framework_TestResult $result = null) 
    { 
     $result = parent::run($result); 
     if ($this->stopFlag === true) 
     { 
      //$result->stop(); // Stop the test for this special case 
      exit(1); // UPDATED: This works to terminate the process at this point 
     } 
     return $result; // return as normal 
    } 
} 

:

는 다음과 같은 시도이 실제로 시작됩니다 모든 테스트를 의미

class MyTestCase extends MyBaseTestCase 
{ 
    public function testThisStopsPhpunit() 
    { 
     if (strlen(getenv('APP_HOME')) < 1) { 
      $this->fail('APP_HOME set but empty.'); 
      $this->stopFlag = true; // Stop further processing if this occurs 
     } 
    } 
} 
+0

하지만'하면') (우리의 '실행 중지 $ stopFlag'가 맞습니다. 맞습니까? 여러 개의 파일 (클래스)을 가지고 있으며 각각은 여러 개의 테스트 케이스가 있으며, 모두 환경 변수가 올바르게 설정되어 있습니다. – CXJ

+0

위의'run()'메서드에서'$ result-> stop()'줄 대신'exit (1)'을 사용하여 원하는대로 할 수있었습니다. 흥미롭게도,'exit()'는이 문맥에서 정상적으로 작동하고,'phpunit'을 완전히 종료합니다. 테스트 내에서 호출 될 때 작동하지 않습니다. – CXJ

+0

다행이라면 잘 할 수 있습니다. 'stop()'호출을 통해 어떤 결과를 얻었습니까? 첫 번째 실패 이후 더 이상의 테스트를 종료하지 않았습니까? –

관련 문제