2010-03-17 2 views
10

PHPUnit 테스트가 실패하면 실제 값과 예상 값이 표시됩니다.
그러나 테스트가 통과되면이 정보가 표시되지 않습니다.PHPUnit : 어설 션 된 값 표시 강제

PHPUnit이 예상 및 실제 어설 션 결과를 항상 표시하도록하는 방법은 무엇입니까?

+3

명백한 질문 ... 왜? –

+1

이것은 비정상적인 요청입니다. 대부분의 사람들은 이것을 원하지 않을 것입니다. 이러한 이유 때문에 PHPUnit에서는 이와 같은 기능을 구현할 수 없습니다. 너 혼자해야 해. – ryeguy

+1

관련없는 질문이지만 왜 그게 필요합니까? "일반적으로", 테스트 중에 출력을 생성하지 않아야합니다. 왜냐하면 목적이 자동으로 실행되기 때문입니다 (모든 것이 잘되면 인간은 출력을 읽지 않아야합니다). –

답변

3

$ this-> assert ...()으로 어설 션을 호출 할 가능성이 높으므로 테스트 케이스에서 해당 메소드를 덮어 쓸 수 있습니다. 빠른 예 :

물론
class YourTestCase extends PHPUnit_Framework_TestCase { 
    ... 
    static private $messages = array(); 
    ... 
    static public function assertSame($var1, $var2, $message = '') { 
     parent::assertSame($var1, $var2, $message); 
     // assertSame() throws an exception if not true, so the following 
     // won't occur unless the messages actually are the same 
     $success = print_r($var1, true) . ' is the same as ' 
       . print_r($var2, true); 
     self::$messages = array_merge(self::$messages, array($success)); 
    } 

    static public function tearDownAfterClass() { 
     echo implode("\n", self::$messages); 
    } 
} 

, tearDownAfterClass() 원하는대로 충분히 늦게하지 않을 수 있습니다. 주장이 실패하는 것과 같지 않습니다.

+0

예, 이것에 대해서도 생각해 봤지만 모든 주장에 대한 기본 방법을 찾지 못했습니다. – takeshin

+0

오! 내가 참조. 그러나 나는 궁금해한다. (존재한다면) 그것은 합리적인 것이겠습니까? 서로 다른 어설 션은 다른 의미와 다른 매개 변수를가집니다. 당신이 원하는 피드백의 효과를 희석시키지 않고 (또는 더 나쁜) 한 가지 방법으로 그들을 전부 끓일려고하지 않겠습니까? – pinkgothic

+0

내가 원하는 것은 명령 줄 스위치뿐입니다. 이것이 조금 더 번거롭다면 구현하십시오. – takeshin

11

각 테스트의 이름이 표시됩니다

phpunit --testdox 

를 실행. 따라서 임시 해결책으로, 예상 이름과 실제 값을 테스트 이름에 포함시킬 수 있습니다 ... 아직 해결 방법 일뿐입니다 ...

2

create your own Assertion class 중 하나 일 뿐이며 실제 어설 션 클래스에 대한 프록시처럼 동작합니다 실제의 assertion에 위양하기 전의 값.

$this->assertWithLogging('assertion', $expected, $actual, $message); 

또는 CLI를 통해 실행 때 출력을 망치 때문에, 꽤 중 하나 아니에요 (I 매우 까다로운 일이 될 것이라 생각합니다) 또는 단순히

$this->assertSame($expected, $actual, $message); 
echo "$expected is $actual"; 

을 phpunit을 자신의 클래스를 재정의합니다. Zend Studio를 사용하면 Debug Output 탭에 결과가 표시됩니다.

다른 경로는 TestListeners 일 수 있습니다. 그러나 세부 정보를 알려주는 경로는 충분하지 않습니다. 테스트 프로세스에 연결할 수있는 것처럼 보입니다.

+0

이것을 달성하기 위해, 나는 단지'PHPUnit_Assert'를 수정할 수 있지만, 명령 줄 스위치가 필요할 때마다이 기능을 사용하기를 바랬습니다 ... – takeshin

+0

@takehin modifications core libraries is ** 항상 ** 나쁜 생각. 다음 번에 PHPUnit을 업데이트하면 모든 모드가 사라집니다. 그래서 확장 또는 사용자 지정 어설 ​​션을 대신 사용하는 것이 좋습니다. – Gordon

+0

당신은 바로 Gordon입니다. 그러나 이것은 단지 가설적인 아이디어 일뿐입니다. 나는 PHPUnit을 다시 쓰거나 var_dumps를 사방에 넣을 생각은 없습니다. 잠시 디버그를보고 싶을 때 :) – takeshin

0

실제로 assert에서 $ message 값을 사용할 수 있습니까 ??? 방법을 선택하고 그 분야에서 원하는 것을 넣으십시오. 필자는 보통이 값을 사용하여 예상 값과 실제 값이 무엇인지, 그리고 어설 션의 고유 한 이름 (주어진 테스트에서 둘 이상 있다고 가정)을 보여줍니다.

+0

그 메시지는 어설 션이 실패하더라도 표시됩니다. – pinkgothic

0

또 다른 것은 독자적인 Listener를 작성하는 것일 수 있습니다. 이렇게하면 원하는 출력을주고 phpunit에 어설 션을 남길 수 있습니다. 이것은 내가 생각하기에 가장 쉽고 사용자 정의가 용이 한 방법 일 수 있습니다.

3

나는이 게시물에 비슷한 것을 찾고 있습니다. 나는이 테스트 케이스가 :

/** 
* test routing logic (numbers method returns an array of numbers and expected outputs to test) 
* @dataProvider numbers 
*/ 
function testRoute($input,$expected) 
{ 
    $route = new Route($input,'',false); 
    $route->route(); 
    $this->assertEquals($expected,$route->routingResult); 
} 

을 내 번호 방법은 이것이다 :

/** 
* read pairs of numbers (input <tab> expected) from tests.input separater by tab 
* return an array like this: array(array(number1,expected1), array(number2,expected2), ...) 
* provide this array to my tests by returning it 
*/ 
function numbers() 
{ 
    $testcases = file('tests.input'); 
    $tests = array(); 
    foreach($testcases as $test_case) 
    { 
     list($input,$output) = explode("\t",$test_case,2); 
     $tests[] = array(trim($input),trim($output)); 
    } 
    return $tests; 
} 

어떤 일이 것은 당신이 phpunit을에서 다음과 같은 출력을 얻을 수 있습니다 :

Starting test 'RouteTest::testRoute with data set #0 ('8596000000', 'rejected (dp not found)x')'. 
F 
Starting test 'RouteTest::testRoute with data set #1 ('8596000001', 'rejected (rejected by scheme)')'. 
. 
Starting test 'RouteTest::testRoute with data set #2 ('8596000003', '1599000003')'. 
. 

그것은하지 않습니다 테스트가 실패하지 않는 한 테스트 된 함수의 실제 결과를 알려주지 만 적어도 어설 션 된 모든 값을 보게됩니다.