【PHPUnit】特定の条件下でテストをスキップする方法

「ドライバが入っていない環境ではこのテストはしたくない!」なんてときに、いちいち手動で切り替えるのは手間ですよね。そんなときに使える便利な markTestSkipped() メソッドをご紹介します!

また、 Laravel で PHPUnit を使っている方も多いかと思いますので Laravel 特有の情報についても少し付け加えてみました:)

環境

この記事の検証に使用した PHPUnit は v10.0.7 です。

少なくとも v9.5 以降には makeTestSkipped() メソッドが存在することを確認済みです。

Laravel は v10.0.3 を使用しました。

概要

makeTestSkipped() メソッドは、テストを実行せずにスキップするメソッドです。

スキップされたテスト結果は次のように「 S 」で表現され、「 Skipped: 」欄へカウントされます。

コマンド
$ phpunit tests/Feature/SampleTest.php
PHPUnit 10.0.7 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.3
Configuration: /var/www/html/phpunit.xml

S                                                                   1 / 1 (100%)

Time: 00:02.641, Memory: 32.50 MB

OK, but some tests were skipped!
Tests: 1, Assertions: 0, Skipped: 1.

Laravel の artisan コマンドを利用した場合は「 – skip 」と表示されます。

コマンド
$ php artisan test tests/Feature/SampleTest.php

   WARN  Tests\Feature\SampleTest
  - skip                                                                                                                                                                            

  Tests:    1 skipped (0 assertions)
  Duration: 0.21s

使い方

基本

テストクラスの中でこのメソッドを呼び出すとそのテストはスキップされます。

tests/Feature/SampleTest.php
class SampleTest extends TestCase
{
    public function test_skip(): void
    {
        $this->markTestSkipped();
    }
}

メッセージを出力

テスト実行時にメッセージを出力したいときは、第一引数に渡してあげます。

どんな理由でスキップされたのかを書いておくのがオススメです。

tests/Feature/SampleTest.php
class SampleTest extends TestCase
{
    public function test_skip(): void
    {
        if (! Features::enabled(Features::registration()) {
            $this->markTestSkipped('ユーザ登録機能が無効なためスキップしました');
        }
    }
}

もし普通に phpunit コマンドを実行しただけだとメッセージが表示されない場合は、 –display-skipped オプションをつけて実行してみてください。

コマンド
$ phpunit --display-skipped tests/Feature/SampleTest.php
PHPUnit 10.0.7 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.3
Configuration: /var/www/html/phpunit.xml

S                                                                   1 / 1 (100%)

Time: 00:00.207, Memory: 24.00 MB

There was 1 skipped test:

1) Tests\Feature\SampleTest::test_skip
ユーザ登録機能が無効なためスキップしました

OK, but some tests were skipped!
Tests: 1, Assertions: 0, Skipped: 1.

Laravel の artisan コマンド使用時はオプションなしでこんな感じに表示されます。

コマンド
$ php artisan test tests/Feature/SampleTest.php

   WARN  Tests\Feature\SampleTest
  - skip → ユーザ登録機能が無効なためスキップしました                                                                                                                                                      0.15s

  Tests:    1 skipped (0 assertions)
  Duration: 0.21s

サンプルコードがほしい方

私は Laravel の Jetstream のテストコードを読んで学びました。

特に対象機能が有効であるかどうかという振り分け方でたくさん使われています。

https://github.com/laravel/jetstream/tree/3.x/stubs/tests/livewire

チラッと覗いてみると面白いかもしれません:)

MEMO

PHPUnit の makeTestSkipped() に関する公式ドキュメント

https://docs.phpunit.de/en/9.5/incomplete-and-skipped-tests.html

Laravel のテストに関する公式ドキュメント

https://laravel.com/docs/10.x/testing

この他、 PHPUnit には「テストの枠だけ作ったけどちょっとまだ中身書いてなくて……後で書く」なんて時に便利な markTestIncomplete() メソッドなどもあります!気軽にテスト書いていきたいですね!