[phpunit] Skip Test with message

PHPunit을 사용해 테스트를 하다보면 추후 기능 구현을 위해 남겨 두었다가 개발을 위해 잠시 테스트를 스킵하고 싶은데,
이에 대한 걸 단순히 주석 처리나, ignore시켜서 하기에는 나중에 나 스스로를 못믿기도 하고(…)
테스트 할때마다 이를 표시하고 싶은데, risk 상태로 두자니 찝찝하고 여러모로 어떻게 처리해야할지 모르는 상황에서 markTestSkipped메소드를 찾게 되었다.

Mark Test Skipped

이 메소드는 이름 그대로 해당 test를 넘겨주는 역할을 한다. 다만, 테스트를 아에 건너 뛰는것이 아닌 해당 테스트가 스킵되었고 어떤 내용으로 스킵되었는지를 표시해준다.

// Test codes ...
    public function testSomeThing(): void
    {
        $this->markTestSkipped('this test skipped because i want');
        // ...
    }
// Test codes ...

위처럼 markTestSkipped는 문자열을 인수로 받는다. skip의 s 로 표시된다.

PHPUnit 8.5.4 by Sebastian Bergmann and contributors.

.S                                                  2 / 2 (100%)

Time: 37.1 seconds, Memory: 28.00 MB

OK, but incomplete, skipped, or risky tests!
Tests: 2, Assertions: 1, Skipped: 1.

markTestIncomplete 와의 차이점

또한 phpunit에는 markTestIncomplete메소드가 있어 해당 테스트가 완료되지 않았다는 것을 표기해 줄 수 있다. 위에 상황을 봣을 땐 이 메소드가 더 어울리는 것같지만, markTestSkippedartisan test를 이용할 때 다른 결과를 보여준다.

위처럼 markTestSkipped는 해당 인수는 아래와 같이 테스트 결과와 함께 표시되며, 인자로 전달된 메시지를 출력해준다. 이를 이용해 왜 해당 테스트가 skip되었는지를 명확하게 표시 해 줄 수 있다.

silnex@localhost:~/test$ artisan test

   WARN  Tests\Feature\MyTest
  ✓ others
  s some thing → this test skipped because i want

  Tests:  1 skipped, 1 passed
  Time:   0.10s
silnex@localhost:~/test$ artisan test

   WARN  Tests\Feature\MyTest
  ✓ others
  i some thing

  Tests:  1 incompleted, 1 passed
  Time:   0.11s

예를 들어 config(‘range’) 의 값이 10 미만일 때 만 skip하고 싶고 왜 스킵되었는 표시해주고 싶을때 사용할수 있다.

PHPUnit에서 Laravel 에러 메시지 출력 패키지(Collision) 사용

원글 Collision PHPUnit Listener With Laravel

Collision‘는 Laravel에서 아래 이미지처럼 상세한 오류 내역을 출력해주는 패키지이다.

View image on Twitter
[사진] Nuno maduro 트위터

Laravel로 개발하면서 정말 좋은 기능임을 알고있었지만, phpunit과 같은 외부 테스트 도구들을 통해 테스트할 때 오류가 발생해도 아래 이미치 처럼 단순히 Exception stack만 보여줘 ‘Collision’ 처럼 자세한 내용을 제공 받지 못해 아쉬웠던 적이 더러 있었다.

하지만 작년 12월 31일 Collision 패키지 개발자가 트위터를 통해 PHPUnit adapter를 언급하면서 간단한 설정만으로 phpunit에서도 Collision 화면을 볼 수 있게 되었다.

기존 phpunit은 아래 이미지처럼 Exception이 일어나면 단순히 Exception stack만을 표시 했지만,

[laravel-new] phpunit 에러 메시지

phpunit.xml파일에 Collision 리스너를 추가한다.

<listeners>
    <listener class="NunoMaduro\Collision\Adapters\Phpunit\Listener" />
</listeners>
[laravel-new] Listener 추가 후 phpunit 에러 메시지

그러면 위와 같이 phpnuit에서도 깔끔하게 출력되며 좀 더 나은 디버깅 환경을 제공해준다.