LoginSignup
1
1

More than 3 years have passed since last update.

Laravel 6.x環境でparatestを使ってテストを実行した話

Last updated at Posted at 2020-09-01

はじめに

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

paratestの導入

composerで一発!かんたん!
と思うのですが、PHPUnitのバージョンと合わない場合普通にエラーになるので、
エラった場合はPHPUnitのバージョンも合わせて確認したほうがよいです。

$ composer require --dev brianium/paratest

RefreshDatabasを取り除く

RefreshDatabaseはメチャクチャ便利だとは思うのですが、テストごとに処理走らせてしまうので実行時間が長くなり、
並行テストを行う際に問題が発生するので利用されている場合は DatabaseTransactionsに置き換えます。
DB自体のマイグレーションは後述。

テストランナーの作成

独自のテストランナーを作成して、初期処理などを行わせます。

実行内容

今回、主に実行している内容は下記ですが、お好みで調整。

  • 強制的に実行環境を testing として取り扱う
  • キャッシュ系のクリア
  • DBのマイグレーション
  • DBのシーディング
/path/to/laravel-project/tests/TestRunner.php
<?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'; を入れずに実行して通常の開発環境のデータをふっとばしたりしたので皆様もお気をつけください。

1
1
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
1
1