【Laravel】特定のテストを繰り返し実行してログを確認したい...!

どーも!

たかぽんです!

今回はlaravelの特定のテストを繰り返し実行したい場面がありましたので、それについて解説していきます...!

やりたいこと

Laravelではテストをつくることができますよね!

そのテストを繰り返し実行して、そのログを集積したい場面がありました。

具体的にはなぜかたまにデプロイ時のテストがこけてしまうテストが存在していて、その原因をさぐるためにlocalで繰り返し実行して確認をしたかったんですね。

Laravelで特定のテストを実行する

さて、それでは特定のテストを繰り返し実行する前に、まずは狙ったテストのみ実行することについて考えていきます。

例えば以下の様なテストがあったとします。

class ExampleTest extends TestCase
{
    public function test_a_1()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }


    public function test_a_2()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }

    public function test_b_1()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

このうち、"test_b_1"のテストが行いたい場合を想定していきます。

特定のテストを実行したい場合、"@group 実行時のグループ名"をメソッドのすぐ上にコメントで指定する必要があります。

    /**
     * @group B
     */
    public function test_b_1()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }

例えば上記の様に設定したとしましょう。

では試しに実行します。

筆者の場合、docker環境で実行しているのですが、ExampleTest.phpのテストを実行しているだけです。

すると...

taka@Taka docker-laravel % docker-compose exec app ./laravel/vendor/bin/phpunit ./laravel/tests/Feature/ExampleTest.php --debug

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
PHPUnit 9.5.25 #StandWithUkraine

Test 'Tests\Feature\ExampleTest::test_a_1' started
Test 'Tests\Feature\ExampleTest::test_a_1' ended
Test 'Tests\Feature\ExampleTest::test_a_2' started
Test 'Tests\Feature\ExampleTest::test_a_2' ended
Test 'Tests\Feature\ExampleTest::test_b_1' started
Test 'Tests\Feature\ExampleTest::test_b_1' ended


Time: 00:00.615, Memory: 10.00 MB

OK (3 tests, 3 assertions)

特に制限をもうけず、ExampleTest.phpを実行すると上記の様になります。ログをみると全てが実行されているのがわかりますね。(同様のログを出したい場合は--debugをつけてください)

では、本題のグループを指定してあげると...

taka@Taka docker-laravel % docker-compose exec app ./laravel/vendor/bin/phpunit ./laravel/tests/Feature/ExampleTest.php --group=B --debug

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
PHPUnit 9.5.25 #StandWithUkraine

Test 'Tests\Feature\ExampleTest::test_b_1' started
Test 'Tests\Feature\ExampleTest::test_b_1' ended


Time: 00:00.563, Memory: 8.00 MB

OK (1 test, 1 assertion)

"--group=B"とオプションを指定することでBのグループのみ...といった制限をつけることができているのがわかるかと思います。

ちなみに、Aのグループは二件ありましたね。

同様にAで試すと...

taka@Taka docker-laravel % docker-compose exec app ./laravel/vendor/bin/phpunit ./laravel/tests/Feature/ExampleTest.php --group=A --debug

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
PHPUnit 9.5.25 #StandWithUkraine

Test 'Tests\Feature\ExampleTest::test_a_1' started
Test 'Tests\Feature\ExampleTest::test_a_1' ended
Test 'Tests\Feature\ExampleTest::test_a_2' started
Test 'Tests\Feature\ExampleTest::test_a_2' ended


Time: 00:00.627, Memory: 8.00 MB

OK (2 tests, 2 assertions)

もちろん、Aだけ実行されます。

これで任意のテストのみ〜といった形で実行ができそうです。

ちなみにこのオプションはphpunitのもので、以下で確認ができます。

また、上記のオプションは"php artisan test"コマンドの場合でも利用できます。

詳細は下記にて確認ができるかと思います。

先ほどのコマンドを繰り返し実行する

さて、それでは今度は先ほどのコマンドを繰り返し実行することについて考えていきましょう!

実は別の記事にて紹介している方法を応用する形で考えます。

では実際のコマンドは以下です。

watch -n 1 "docker-compose exec app ./laravel/vendor/bin/phpunit ./laravel/tests/Feature/ExampleTest.php --group=A --debug >> TestLog.txt"

これで、TestLog.txtに以下の様に毎秒テストを実行した結果が蓄積されていきます。


Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
PHPUnit 9.5.25 #StandWithUkraine

Test 'Tests\Feature\ExampleTest::test_a_1' started
Test 'Tests\Feature\ExampleTest::test_a_1' ended
Test 'Tests\Feature\ExampleTest::test_a_2' started
Test 'Tests\Feature\ExampleTest::test_a_2' ended


Time: 00:00.598, Memory: 8.00 MB

OK (2 tests, 2 assertions)

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
PHPUnit 9.5.25 #StandWithUkraine

Test 'Tests\Feature\ExampleTest::test_a_1' started
Test 'Tests\Feature\ExampleTest::test_a_1' ended
Test 'Tests\Feature\ExampleTest::test_a_2' started
Test 'Tests\Feature\ExampleTest::test_a_2' ended


Time: 00:00.577, Memory: 8.00 MB

OK (2 tests, 2 assertions)
...
...

多少テスト実行コマンドに差分はあるかもしれませんが...

watch -n 1 " ここにlaravelのテスト実行コマンドを貼る >> TestLog.txt"

上記のようにしてあげることでTestLog.txtに毎秒Testのログが吐き出されます。

-nが実行感覚なので、頻度が多すぎる場合は2秒や5秒等で調節すればOKです...!

まとめ

今回はLaravelのテストを繰り返し実行する方法について調べていきました...!

その過程でwatchコマンドを知りましたが、めっちゃ楽に繰り返し実行できる...!

と...感激でした...!

是非みなさんも試してみてくださいね...!

それでわ!

おすすめの記事