8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel テストを実行する前にキャッシュをクリアする

Posted at

Laravelあるある。ローカルでキャッシュしたままテストを実行してしまう。
誰もが一度はハマるであろう由々しき問題です。

ローカルでキャッシュしなきゃいいってのはありますが、
一応キャッシュした時にエラーが起きないかの動作確認などはしたいので、テスト前にキャッシュファイルを削除できればなと色々考えてみました。

公式ドキュメントでも テストを実行する前は必ずconfig:clear Artisanコマンドを使用して設定のキャッシュをクリアしてください。 とあります。
https://readouble.com/laravel/9.x/ja/testing.html

ということで良さそうな方法を3つ考えました。

方法1. Composer Scriptsを使用する

composer.json
{
    "scripts": {
        "test": [
            "@php artisan config:clear",
            "@php artisan test"
        ]
    },
}
$ composer test

とてもお手軽な方法です。

@php とすると実行中のphpプロセスに自動的に解決されるとか。
https://getcomposer.org/doc/articles/scripts.md#executing-php-scripts

方法2. Makefileを使用する

Makefile
test:
	php artisan config:clear
	php artisan test
$ make test

こちらもお手軽な方法です。
composer の半分の文字数で実行できます笑

Makefileのインデントは半角スペースではなくTabにする必要があります。

方法3. キャッシュクリアするテストを作る

方法1, 方法2の場合は php artisan test./vendor/bin/phpunit と直接実行されたら当たり前ですがキャッシュクリアされない訳です。
phpunitの設定で実行前にスクリプトを流すようなことはできなさそうなのでキャッシュをクリアするだけのテストを作ってみます。
(これがやって良いのか悪いのかは分かりません...)

FeatureやUnitのテストとは分けたいので、 tests/SetupConfigClearTest.php と配置します。

tests/Setup/ConfigClearTest.php
<?php

declare(strict_types=1);

namespace Tests\Setup;

use Tests\TestCase;

final class ConfigClearTest extends TestCase
{
    /**
     * @return void
     */
    public function testConfigClear(): void
    {
        $this->artisan('config:clear');
        $this->assertFalse(file_exists(base_path('bootstrap/cache/config.php')));
    }
}

phpunit.xml のUnitとFeatureの上にSetupのテストを追加します。

phpunit.xml
    <testsuites>
        <testsuite name="Setup">
            <directory suffix="Test.php">./tests/Setup</directory>
        </testsuite>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
$ php artisan test

   PASS  Tests\Setup\ConfigClearTest
  ✓ config clear

...

最初に ConfigClearTest が実行されていればOKです。
オプションを指定しないとキャッシュクリアできなかったときにそのままテストが続きます(まずないと思いますが...)

$ php artisan test --stop-on-failure

   PASS  Tests\Setup\ConfigClearTest
  ✓ config clear

...

`--stop-on-failure` オプションを指定すればエラー出たらテストが即終了するようにできます。

まとめ

方法3が個人的には一番良いのかなーと思います。
本当はテストクラスとして書きたくない気持ちはあるのですが、Setupとディレクトリ分けてれば良い気もしてきました。

どの方法でもそうですがファイルを指定してテストを実行した場合はキャッシュクリアはされませんのでご注意ください。

$ php artisan test tests/Feature/ExampleTest.php

関連記事

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?