Laravelあるある。ローカルでキャッシュしたままテストを実行してしまう。
誰もが一度はハマるであろう由々しき問題です。
ローカルでキャッシュしなきゃいいってのはありますが、
一応キャッシュした時にエラーが起きないかの動作確認などはしたいので、テスト前にキャッシュファイルを削除できればなと色々考えてみました。
公式ドキュメントでも テストを実行する前は必ずconfig:clear Artisanコマンドを使用して設定のキャッシュをクリアしてください。
とあります。
https://readouble.com/laravel/9.x/ja/testing.html
ということで良さそうな方法を3つ考えました。
方法1. Composer Scriptsを使用する
{
"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を使用する
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
と配置します。
<?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のテストを追加します。
<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
関連記事