コマンドのテスト
自分で作った Artisan コマンドを、テストで動かして、終わりの番号・質問への答え・画面に出る文字を確かめる方法を説明します。
Artisan コマンドとは、ターミナル(文字でコマンドを打ちこむ画面)で php artisan ... と打って動かす Laravel のコマンドです。自分で作ったコマンドも、テストで確かめられます。テストの中でコマンドを動かし、「正しく終わったか」「質問にこう答えたら、こう表示されるか」を調べます。コマンドの作り方は Artisan コマンドを、テストの基本はテストのはじめかたを見てください。
成功と失敗を確かめる#
まず、コマンドの終了コード(終わったときに返す番号)を確かめます。テストの中で artisan メソッドを使ってコマンドを動かし、assertExitCode で番号を調べます。
Pest で書くとき:
test('console command', function () {
$this->artisan('inspire')->assertExitCode(0);
});
PHPUnit で書くとき:
/**
* Test a console command.
*/
public function test_console_command(): void
{
$this->artisan('inspire')->assertExitCode(0);
}
「この番号ではないこと」は assertNotExitCode で確かめます。
$this->artisan('inspire')->assertNotExitCode(1);
ターミナルのコマンドは、うまくいくと 0 で終わり、失敗すると 0 以外の番号で終わるのがふつうです。そこで、成功か失敗かだけを確かめる assertSuccessful と assertFailed も使えます。
$this->artisan('inspire')->assertSuccessful();
$this->artisan('inspire')->assertFailed();
| 命令 | 説明 |
|---|---|
assertExitCode |
終了コードが、渡した番号である |
assertNotExitCode |
終了コードが、渡した番号ではない |
assertSuccessful |
成功(0)で終わった |
assertFailed |
失敗(0 以外)で終わった |
入力と出力を確かめる#
コマンドは、ユーザーに質問して答えを入力してもらうことがあります。テストでは、expectsQuestion で「この質問が出たら、こう答える」というにせの入力(モック)を用意できます。さらに assertExitCode で終了コードを、expectsOutput で画面に出るはずの文字を確かめます。
たとえば、次のコマンドがあるとします。
Artisan::command('question', function () {
$name = $this->ask('What is your name?');
$language = $this->choice('Which language do you prefer?', [
'PHP',
'Ruby',
'Python',
]);
$this->line('Your name is '.$name.' and you prefer '.$language.'.');
});
このコマンドは、次のようにテストできます。
Pest で書くとき:
test('console command', function () {
$this->artisan('question')
->expectsQuestion('What is your name?', 'Taylor Otwell')
->expectsQuestion('Which language do you prefer?', 'PHP')
->expectsOutput('Your name is Taylor Otwell and you prefer PHP.')
->doesntExpectOutput('Your name is Taylor Otwell and you prefer Ruby.')
->assertExitCode(0);
});
PHPUnit で書くとき:
/**
* Test a console command.
*/
public function test_console_command(): void
{
$this->artisan('question')
->expectsQuestion('What is your name?', 'Taylor Otwell')
->expectsQuestion('Which language do you prefer?', 'PHP')
->expectsOutput('Your name is Taylor Otwell and you prefer PHP.')
->doesntExpectOutput('Your name is Taylor Otwell and you prefer Ruby.')
->assertExitCode(0);
}
Laravel Prompts(見た目のよい入力欄を作る部品)の search や multisearch を使っているコマンドは、expectsSearch で、入力した文字・出てくる候補・選んだ答えをまとめてにせものにできます。
Pest で書くとき:
test('console command', function () {
$this->artisan('example')
->expectsSearch('What is your name?', search: 'Tay', answers: [
'Taylor Otwell',
'Taylor Swift',
'Darian Taylor'
], answer: 'Taylor Otwell')
->assertExitCode(0);
});
PHPUnit で書くとき:
/**
* Test a console command.
*/
public function test_console_command(): void
{
$this->artisan('example')
->expectsSearch('What is your name?', search: 'Tay', answers: [
'Taylor Otwell',
'Taylor Swift',
'Darian Taylor'
], answer: 'Taylor Otwell')
->assertExitCode(0);
}
doesntExpectOutput に文字を渡さずに呼ぶと、「何も出力しない」ことを確かめられます。
Pest で書くとき:
test('console command', function () {
$this->artisan('example')
->doesntExpectOutput()
->assertExitCode(0);
});
PHPUnit で書くとき:
/**
* Test a console command.
*/
public function test_console_command(): void
{
$this->artisan('example')
->doesntExpectOutput()
->assertExitCode(0);
}
出力の一部だけを確かめたいときは、expectsOutputToContain と doesntExpectOutputToContain を使います。
Pest で書くとき:
test('console command', function () {
$this->artisan('example')
->expectsOutputToContain('Taylor')
->assertExitCode(0);
});
PHPUnit で書くとき:
/**
* Test a console command.
*/
public function test_console_command(): void
{
$this->artisan('example')
->expectsOutputToContain('Taylor')
->assertExitCode(0);
}
「はい・いいえ」の確認#
「はい」か「いいえ」で答える確認を出すコマンドは、expectsConfirmation で答えを決められます。
$this->artisan('module:import')
->expectsConfirmation('Do you really wish to run this command?', 'no')
->assertExitCode(1);
表の表示#
コマンドが table メソッドで表を出すとき、表全体の出力を1行ずつ書くのは大変です。代わりに expectsTable を使います。1つ目の引数に見出し、2つ目の引数にデータを渡します。
$this->artisan('users:all')
->expectsTable([
'ID',
'Email',
], [
[1, 'taylor@example.com'],
[2, 'abigail@example.com'],
]);
入力と出力を確かめる命令のまとめです。
| 命令 | 説明 |
|---|---|
expectsQuestion |
質問が出たら、決めた答えを返す |
expectsSearch |
検索の入力欄に、決めた入力・候補・答えを使う |
expectsConfirmation |
「はい・いいえ」の確認に、決めた答えを返す |
expectsOutput |
決めた文字が出力される |
doesntExpectOutput |
決めた文字が出力されない。文字を渡さなければ、何も出力されない |
expectsOutputToContain |
出力の中に、決めた文字が含まれる |
doesntExpectOutputToContain |
出力の中に、決めた文字が含まれない |
expectsTable |
決めた見出しとデータの表が出力される |
コンソールのイベント#
テストを動かすあいだは、Illuminate\Console\Events\CommandStarting と Illuminate\Console\Events\CommandFinished の2つのイベント(「〜が起きた」という知らせ)は、ふつう出ません。出したいときは、テストのクラスに Illuminate\Foundation\Testing\WithConsoleEvents トレイト(クラスに部品を足すしくみ)を足します。
Pest で書くとき:
<?php
use Illuminate\Foundation\Testing\WithConsoleEvents;
pest()->use(WithConsoleEvents::class);
// ...
PHPUnit で書くとき:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\WithConsoleEvents;
use Tests\TestCase;
class ConsoleEventTest extends TestCase
{
use WithConsoleEvents;
// ...
}
| イベント | 説明 |
|---|---|
CommandStarting |
コマンドが始まるときに出る知らせ |
CommandFinished |
コマンドが終わったときに出る知らせ |
関連するページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。