2017-10-18 9 views
1

PHP 클래스를 사용하는 명령 줄 도구를 개발 중입니다. 나는 나의 수업에 대해 시험을 치렀다.PHPUnit 테스트 적용 범위가있는 명령 줄 스크립트

이제 커맨드 라인에서 사용한 PHP 스크립트를 테스트하고 싶습니다. 내가 명령 줄 스크립트 실행 라인을 커버 할 수있는 방법을 알고 싶습니다 How do I test a command-line program with PHPUnit?

:

나는 다음과 같은 스레드와 명령 줄을 유발하는 방법을 발견했다.

나는 등 테스트를 만들려고 :

class CommandTest extends \PHPUnit_Framework_TestCase 
{ 
    protected static $command = './src/Command.php '; 
    protected static $testWorkingDir = 'tests/Command'; 

    public function testCLIInstall() 
    { 
     $command = self::$command . ' --help'; 
     $output = `$command`; 
    } 
} 

실행이 성공적으로 수행하지만 아무것도 파일 'Command.php'에서 커버하지 않습니다.

먼저 가능합니까? 그렇다면, 어떻게하면 커맨드 라인 스크립트 커버를 할 수 있습니까?

감사합니다.

최고 감사인,

Neoblaster.

업데이트 : GitHub의에서 문제를 엽니 다 https://github.com/sebastianbergmann/phpunit/issues/2817

답변

0

당신은 당신이 현재 테스트 '스크립트를 처리하는 PHP 인터프리터의 인스턴스를 가지고 테스트를 시작합니다.

테스트 스크립트는 PHP 인터프리터의 두 번째 인스턴스를 호출하는 명령 줄을 호출합니다. 권리?

이제는 두 개의 인터프리터가 실행 중이며 서로 완전히 분리되어 있으며 다른 통역사가 현재 무엇을하고 있는지 알기 위해 어떤 낌새도 없습니다.

테스트에서 xdebug는 명령 행에서 사용 된 코드 행과 사용되지 않은 코드 행을 알지 못합니다.

//Command.php 
class Command 
{ 
} 

및 명령의 인덱스 스크립트 :

나는 당신을위한 최고의 솔루션이 명령의 클래스를 분리하는 것입니다 생각

//command_index.php 
(new Command($argv))->run(); 

그래서 당신은 당신의 테스트 스위트에 명령의 클래스를 테스트 할 수 있으며, 적용에서 command_index.php를 제외하십시오.

+0

안녕하세요 Marv255, 내 커맨드 라인 스크립트는 PHP 클래스가 아니지만 PHP 클래스를 사용합니다. 해당 스크립트를 찾으십시오 : [Command.php] (https://github.com/neooblaster/SYSLang/blob/master/src/Command.php?ts=3) 끝나지 않았지만 아마도 명령 줄 인터페이스를 만드는 잘못된 방법? 다음 줄을 어떻게 읽는 지 모르겠습니다. '(new Command ($ argv)) -> run()' – Neoblaster

+0

또한, 내가 본 적이있는 PHP 용 명령 줄 스크립트를 만드는 가장 좋은 방법은 [symfony 콘솔] (https : // symfony.com/doc/current/components/console.html). 그것에 대해 더 자세히 알고 싶으시면 링크를 클릭하십시오. – marv255