はじめに
paratestを導入してみたかった & 導入したので備忘録。
ほぼ Laravelで並列テストを導入するための道のり を参考にさせていただきました。
paratest 5.0.0以降ではこの方法が利用出来ないので4.2.0限定です。
環境
- PHP
PHP 7.4.3 (cli) (built: Feb 20 2020 21:53:46) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans
- Laravel Framework 6.18.35
- PHPUnit 9.3.7
- paratest 4.2.0
- テスト実行用に
.env.testing
を作成してあります。 - プロジェクトのpathは
/path/to/laravel-project
としています。
paratestの導入
composerで一発!かんたん!
と思うのですが、PHPUnitのバージョンと合わない場合普通にエラーになるので、
エラった場合はPHPUnitのバージョンも合わせて確認したほうがよいです。
$ composer require --dev brianium/paratest
RefreshDatabasを取り除く
RefreshDatabaseはメチャクチャ便利だとは思うのですが、テストごとに処理走らせてしまうので実行時間が長くなり、
並行テストを行う際に問題が発生するので利用されている場合は DatabaseTransactions
に置き換えます。
DB自体のマイグレーションは後述。
テストランナーの作成
独自のテストランナーを作成して、初期処理などを行わせます。
実行内容
今回、主に実行している内容は下記ですが、お好みで調整。
- 強制的に実行環境を
testing
として取り扱う - キャッシュ系のクリア
- DBのマイグレーション
- DBのシーディング
<?php
namespace Tests;
use Illuminate\Contracts\Console\Kernel;
use ParaTest\Runners\PHPUnit\WrapperRunner;
use ExampleDatabaseSeeder;
class TestRunner extends WrapperRunner
{
use CreatesApplication;
public function run(): void
{
$_ENV['APP_ENV'] = 'testing';
$console = $this->createApplication()->make(Kernel::class);
$commands = [
['command' => 'cache:clear', 'parameters' => []],
['command' => 'config:clear', 'parameters' => []],
['command' => 'optimize:clear', 'parameters' => []],
['command' => 'route:clear', 'parameters' => []],
['command' => 'migrate:fresh', 'parameters' => []],
[
'command' => 'db:seed',
'parameters' => ['--class' => ExampleDatabaseSeeder::class, '--no-interaction' => true]
],
];
foreach ($commands as $command) {
$console->call($command['command'], $command['parameters']);
}
parent::run();
}
}
paratestの実行
独自のテストランナーを指定して実行.
$ cd /path/to/laravel-project
$ php vendor/bin/paratest --runner \\Tests\\TestRunner
Running phpunit in 4 processes with /src/vendor/phpunit/phpunit/phpunit
Configuration read from /src/phpunit.xml
.................
Time: 00:05.117, Memory: 24.00 MB
OK (17 tests, 30 assertions)
おわりに
現状のテストコード自体はまだそこまで重くないので速度の比較は行っていませんが、上記のようにすることで無事、paratestを実行できました。
$_ENV['APP_ENV'] = 'testing';
を入れずに実行して通常の開発環境のデータをふっとばしたりしたので皆様もお気をつけください。