Testing: Getting Started
Table of Contents
Introduction
Laravel は testing を念頭に置いて構築されています。実際、Pest とPHPUnit による testing のサポートは、最初から含まれており、phpunit.xmlファイルはすでにあなたの application のために設定されています。また、フレームワークはアプリケーションを直感的にテストできる便利な helpermethods も提供しています。
デフォルトでは、アプリケーションの tests ディレクトリには Feature と Unit の 2 つのディレクトリが含まれています。ユニットテストは、コードの非常に小さな、孤立した部分に焦点を当てたテストです。実際、ほとんどのユニットテストは単一の method に焦点を当てています。"Unit" テストディレクトリ内のテストは、Laravel アプリケーションを boot しないため、アプリケーションの database や他のフレームワーク services にアクセスすることはできません。
Feature テストには、複数のオブジェクトが互いにどのように対話するか、または全体的な HTTP request を JSON エンドポイントに送信するなど、あなたの code の大部分をテストすることが含まれているかもしれません。一般的に、テストの大部分は feature テストであるべきです。この種類のテストは、システム全体が意図した通りに機能していることに最も確信を与えてくれます。
Feature および Unit テストディレクトリの両方に ExampleTest.php ファイルが提供されています。新しい Laravel application をインストールした後、vendor/bin/pest 、vendor/bin/phpunit 、または php artisan test コマンドを実行してテストを実行します。
Environment
テストを実行すると、Laravel は phpunit.xml ファイルに定義されている environment 変数のために configuration environment を testing に自動的に設定します。また、Laravel はテスト中に session や cache data が保持されないように、session と cache を array driver に自動的に設定します。
他の testing environment 設定の values を必要に応じて自由に定義できます。 testing environment 変数は、アプリケーションの phpunit.xml ファイルで設定できますが、テストを実行する前に config:clear Artisan command を使用して設定の cache をクリアしてください!
.env.testing Environment ファイル
また、 .env.testingファイルを project の root に作成することもできます。このファイルは、 .envファイルの代わりに、 Pest と PHPUnit の tests を実行するか、--env=testingoption を使用して Artisan commands を実行する際に使用されます。
Creating Tests
新しいテストケースを作成するには、make:test Artisan command を使用します。 default では、テストはtests/Featureディレクトリに配置されます:
php artisan make:test UserTest
tests/Unitディレクトリ内にテストを作成したい場合、make:testの command を実行する際に--unitオプションを使用することができます。
php artisan make:test UserTest --unit
NOTE
テストスタブはスタブ公開を使用してカスタマイズすることができます。
テストが生成されたら、通常どおりに Pest や PHPUnit を使ってテストを定義することができます。テストを実行するには、ターミナルからvendor/bin/pest、vendor/bin/phpunit、またはphp artisan test command を実行します。
<?php
test('basic', function () {
expect(true)->toBeTrue();
});
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_basic_test(): void
{
$this->assertTrue(true);
}
}
WARNING
test の class 内に独自の
setUp/tearDownメソッドを定義する場合は、親の class のparent::setUp()/parent::tearDown()メソッドを必ず呼び出すようにしてください。典 types 的には、独自のsetUpmethod の開始時にparent::setUp()を、tearDownmethod の終了時にparent::tearDown()を呼び出すべきです。
Running Tests
前述の通り、一度テストを作成したら、pestまたはphpunitを使用してそれらを実行することができます:
./vendor/bin/pest
./vendor/bin/phpunit
pestまたはphpunitコマンドに加えて、test を実行するためにtest Artisan コマンドを使用することもできます。Artisan test ランナーは、development と debugging を容易にするために詳細な test レポートを提供します:
php artisan test
pestまたはphpunitコマンドに渡すことができる任意の引数は、 Artisan test command にも渡すことができます:
php artisan test --testsuite=Feature --stop-on-failure
テストの並列実行
デフォルトでは、Laravel および Pest / PHPUnit は、single process 内でテストを順番に実行します。しかし、複数のプロセスで同時にテストを実行することで、テストを実行する時間を大幅に reduce することができます。まず、brianium/paratest Composer パッケージを "dev" dependency としてインストールします。その後、test Artisan command を実行するときに --parallel オプションを含めます。
composer require brianium/paratest --dev
php artisan test --parallel
default で、 Laravel は、あなたのマシンに利用可能な CPU コアの数だけプロセスを作成します。ただし、--processesオプションを使用してプロセスの数を調整することができます。
php artisan test --parallel --processes=4
WARNING
テストを並行して実行するとき、一部の Pest / PHPUnit options (
--do-not-cache-resultのような)は利用できないかもしれません。
パラレル Testing とデータベース
primary database connection を設定している限り、 Laravel はテスト database の作成と移行を自動的に行い、それぞれの並列 process ごとにテストを実行します。テストデータベースは、 process token を用いて接尾辞が付けられ、それは各 process ごとに unique です。例えば、並列テストプロセスが 2 つある場合、 Laravel は your_db_test_1 と your_db_test_2 テストデータベースを作成し使用します。
default では、test databases はtestの Artisan command を呼び出すたびに維持され、次のtestの呼び出しでも再利用できます。ただし、--recreate-databases option を使用して再作成することもできます:
php artisan test --parallel --recreate-databases
パラレル Testing フック
たまに、アプリケーションのテストで使用される特定の resources を準備する必要があるかもしれません。これにより、複数のテストプロセスで安全に使用できます。
ParallelTestingの facade を使用すると、setUpとtearDownの process または test ケースで実行されるコードを指定できます。与えられたクロージャは、プロセス token と現在の test ケースをそれぞれ含む$tokenと$testCasevariables を受け取ります。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;
use PHPUnit\Framework\TestCase;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
ParallelTesting::setUpProcess(function (int $token) {
// ...
});
ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
// ...
});
// Executed when a test database is created...
ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
Artisan::call('db:seed');
});
ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
// ...
});
ParallelTesting::tearDownProcess(function (int $token) {
// ...
});
}
}
パラレルの Testing Token へのアクセス
あなたの application の testcode のどの位置からでも、現在の並列 process "token"にアクセスしたい場合は、token method を使用できます。この token は、個々の testprocess のための unique かつ string な識別子であり、並列 testprocess を通じて resources をセグメント化するために使用することができます。たとえば、Laravel は、各並列 testing process によって作成された testdatabases の末尾に自動的にこの token を appends します:
$token = ParallelTesting::token();
テストカバレッジの報告
WARNING
あなたの application のテストを実行する際に、あなたのテストケースが実際に application code をカバーしているかどうか、そしてテストを実行するときにどれだけの application code が使用されているかを判断したいかもしれません。これを達成するために、test command を呼び出すときに--coverageオプションを提供できます。
php artisan test --coverage
最小カバレッジしきい値の強制
あなたは --min オプションを使用して、ご自身の application の最小テストカバレッジ閾値を定義することができます。この閾値が満たされない場合、テストスイートは失敗します:
php artisan test --coverage --min=80.3
プロファイリングテスト
Artisan テストランナーには、アプリケーションの最も遅いテストを一覧表示する便利な機能も含まれています。 test command を --profile オプションと共に呼び出すと、最も遅いテストの上位 10 件が表示されます。これにより、テストスイートの速度を向上させるためにどのテストを改善できるかを簡単に調査することができます。
php artisan test --profile