「ドライバが入っていない環境ではこのテストはしたくない!」なんてときに、いちいち手動で切り替えるのは手間ですよね。そんなときに使える便利な 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
使い方
基本
テストクラスの中でこのメソッドを呼び出すとそのテストはスキップされます。
class SampleTest extends TestCase
{
public function test_skip(): void
{
$this->markTestSkipped();
}
}
メッセージを出力
テスト実行時にメッセージを出力したいときは、第一引数に渡してあげます。
どんな理由でスキップされたのかを書いておくのがオススメです。
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
チラッと覗いてみると面白いかもしれません:)
PHPUnit の makeTestSkipped() に関する公式ドキュメント
https://docs.phpunit.de/en/9.5/incomplete-and-skipped-tests.html
Laravel のテストに関する公式ドキュメント
この他、 PHPUnit には「テストの枠だけ作ったけどちょっとまだ中身書いてなくて……後で書く」なんて時に便利な markTestIncomplete() メソッドなどもあります!気軽にテスト書いていきたいですね!