イントロダクションIntroduction
Laravelはユニットテストも考慮して構築されています。実際、PHPUnitをサポートしており、最初から含まれています。アプリケーションのためにphpunit.xml
ファイルも最初から準備されています。さらにフレームワークはアプリケーションを記述的にテストするために便利なヘルパメソッドも用意しています。Laravel is built with testing in
mind. In fact, support for testing with PHPUnit is
included out of the box and a
phpunit.xml
file is already set up for
your application. The framework also ships with
convenient helper methods that allow you to
expressively test your applications.
デフォルトでは、アプリケーションのtests
ディレクトリには、Feature
とUnit
の2つのディレクトリを用意しています。単体テストは、コードの非常に小さな孤立した部分に焦点を当てたテストです。実際、ほとんどの単体テストはおそらく単一のメソッドに焦点を合わせています。「ユニット」テストディレクトリ内のテストはLaravelアプリケーションを起動しないため、アプリケーションのデータベースやその他のフレームワークサービスにアクセスできません。By default, your application's
tests
directory contains two
directories: Feature
and
Unit
. Unit tests are tests that focus
on a very small, isolated portion of your code. In
fact, most unit tests probably focus on a single
method. Tests within your "Unit" test
directory do not boot your Laravel application and
therefore are unable to access your application's
database or other framework services.
機能テストでは、複数のオブジェクトが相互作用する方法や、JSONエンドポイントへの完全なHTTPリクエストなど、コードの広い部分をテストします。一般的に、ほとんどのテストは機能テストである必要があります。これらのタイプのテストは、システム全体が意図したとおりに機能しているという信頼性を一番提供します。Feature tests may test a larger portion of your code, including how several objects interact with each other or even a full HTTP request to a JSON endpoint. Generally, most of your tests should be feature tests. These types of tests provide the most confidence that your system as a whole is functioning as intended.
ExampleTest.php
ファイルはFeature
とUnit
の両方のテストディレクトリで提供されます。新しいLaravelアプリケーションをインストールした後なら、vendor/bin/phpunit
またはphp
artisan test
コマンドを実行してテストを実行できます。An ExampleTest.php
file is provided in both the Feature
and Unit
test directories. After
installing a new Laravel application, execute the
vendor/bin/phpunit
or php artisan
test
commands to run your
tests.
環境Environment
テストを実行すると、Laravelはphpunit.xml
ファイルで定義してある設定環境により、設定環境を自動的にtesting
に設定します。Laravelはまた、テスト中にセッションとキャッシュをarray
ドライバに自動的に設定します。つまり、テスト中のセッションまたはキャッシュデータが保持されることはありません。When running tests, Laravel will
automatically set the configuration
environment[/docs/{{version}}/configuration#environment-configuration]
to testing
because of the environment
variables defined in the phpunit.xml
file. Laravel also automatically configures the
session and cache to the array
driver
while testing, meaning no session or cache data will
be persisted while testing.
必要に応じて、他のテスト環境設定値を自由に定義できます。testing
環境変数はアプリケーションのphpunit.xml
ファイルで設定していますが、テストを実行する前は必ずconfig:clear
Artisanコマンドを使用して設定のキャッシュをクリアしてください。You are free to define other
testing environment configuration values as
necessary. The testing
environment
variables may be configured in your application's
phpunit.xml
file, but make sure to
clear your configuration cache using the
config:clear
Artisan command before
running your tests!
.env.testing
環境ファイルThe .env.testing
Environment File
さらに、プロジェクトのルートに.env.testing
ファイルを作成することもできます。このファイルは、PHPUnitテストを実行するとき、または--env=testing
オプションを指定してArtisanコマンドを実行するときに、.env
ファイルの代わりに使用されます。In addition, you may create a
.env.testing
file in the root of your
project. This file will be used instead of the
.env
file when running PHPUnit tests or
executing Artisan commands with the
--env=testing
option.
CreatesApplication
トレイトThe
CreatesApplication
Trait
Laravelには、アプリケーションのベースTestCase
クラスに適用されているCreatesApplication
トレイトがあります。このトレイトは、テストを実行する前に、LaravelアプリケーションをブートストラップするcreateApplication
メソッドを持っています。Laravelの並列テスト機能など、いくつかの機能がこのトレイトへ依存しているため、このtraitを元の場所へ残しておくことは重要です。Laravel includes a
CreatesApplication
trait that is
applied to your application's base
TestCase
class. This trait contains a
createApplication
method that
bootstraps the Laravel application before running
your tests. It's important that you leave this trait
at its original location as some features, such as
Laravel's parallel testing feature, depend on
it.
テストの作成Creating Tests
新しいテストケースを作成するには、make:test
Artisanコマンドを使用します。デフォルトでは、テストはtests/Feature
ディレクトリへ配置されます。To create a new test case, use
the make:test
Artisan command. By
default, tests will be placed in the
tests/Feature
directory:
php artisan make:test UserTest
tests/Unit
ディレクトリ内にテストを作成したい場合は、make:test
コマンドを実行するときに--unit
オプションを使用します。If you would like to create a
test within the tests/Unit
directory,
you may use the --unit
option when
executing the make:test
command:
php artisan make:test UserTest --unit
Pest
PHPテストを作成したい場合は、make:test
コマンドに--pest
オプションを指定してください。If you would like to create a
Pest PHP[https://pestphp.com] test, you may
provide the --pest
option to the
make:test
command:
php artisan make:test UserTest --pest
php artisan make:test UserTest --unit --pest
stubのリソース公開 を使って、Testスタブをカスタマイズできます。Note
Note:
Test stubs may be customized using stub publishing[/docs/{{version}}/artisan#stub-customization].
テストを生成したら、PHPUnitを使用する場合と同様にテストメソッドを定義します。テストを実行するには、ターミナルからvendor/bin/phpunit
またはphp
artisan test
コマンドを実行します。Once the test has been generated,
you may define test methods as you normally would
using PHPUnit[https://phpunit.de]. To run
your tests, execute the
vendor/bin/phpunit
or php artisan
test
command from your
terminal:
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* 基本的なテスト例
*
* @return void
*/
public function test_basic_test()
{
$this->assertTrue(true);
}
}
Warning! テストクラスに独自の
setUp
メソッドを定義する場合は、親のクラスのparent::setUp()
/parent::tearDown()
を確実に呼び出してください。Warning
If you define your ownsetUp
/tearDown
methods within a test class, be sure to call the respectiveparent::setUp()
/parent::tearDown()
methods on the parent class.
テストの実行Running Tests
前述のとおり、テストが書き上がったら、phpunit
を使って実行できます。As mentioned previously, once
you've written tests, you may run them using
phpunit
:
./vendor/bin/phpunit
テスト実行にはphpunit
コマンドに加え、test
Artisanコマンドも使用できます。Artisanテストランナーは、開発とデバッグを容易にするため、詳細なテストレポートを提供しますIn addition to the
phpunit
command, you may use the
test
Artisan command to run your tests.
The Artisan test runner provides verbose test
reports in order to ease development and
debugging:
php artisan test
phpunit
コマンドで使用できる引数はすべてArtisan
test
コマンドにも渡せます。Any
arguments that can be passed to the
phpunit
command may also be passed to
the Artisan test
command:
php artisan test --testsuite=Feature --stop-on-failure
テストを並列で実行Running Tests In Parallel
LaravelとPhpUnitはデフォルトで、単一のプロセス内でテストを順番に実行します。しかし、複数のプロセス間で同時にテストを実行し、テスト時間を大幅に削減できます。これを利用開始するには、最初にアプリケーションの依存パッケージへバージョン^5.3
以上のnunomaduro/collision
を確実に含めてください。それから、test
Artisanコマンドを実行するときに、--parallel
オプションを指定します。By default, Laravel and PHPUnit
execute your tests sequentially within a single
process. However, you may greatly reduce the amount
of time it takes to run your tests by running tests
simultaneously across multiple processes. To get
started, ensure your application depends on version
^5.3
or greater of the
nunomaduro/collision
package. Then,
include the --parallel
option when
executing the test
Artisan
command:
php artisan test --parallel
デフォルトで、Laravelはマシンで利用可能なCPUコアの数だけ、プロセスを作成します。しかし、--processes
オプションでプロセス数を調整できます。By default, Laravel will create
as many processes as there are available CPU cores
on your machine. However, you may adjust the number
of processes using the --processes
option:
php artisan test --parallel --processes=4
Warning! テストをパラレル実行すると、PHPUnitのオプション(
-do-not-cafy-result
など)が利用できない場合があります。Warning
When running tests in parallel, some PHPUnit options (such as--do-not-cache-result
) may not be available.
並列テストとデータベースParallel Testing & Databases
プライマリデータベース接続を設定さえすれば、Laravelは、テストを実行する並列プロセスごとに、テストデータベースの作成とマイグレーションを自動的に処理します。テストデータベースは、プロセスごとに一意のプロセストークンをサフィックス化します。たとえば、2つの並列テストプロセスがある場合、Laravelはyour_db_test_1
とyour_db_test_2
テストデータベースを作成して使用します。As long as you have configured a
primary database connection, Laravel automatically
handles creating and migrating a test database for
each parallel process that is running your tests.
The test databases will be suffixed with a process
token which is unique per process. For example, if
you have two parallel test processes, Laravel will
create and use your_db_test_1
and
your_db_test_2
test
databases.
デフォルトでは、テストデータベースはtest
Artisanコマンドへの呼び出し間で持続的に保持され、後続のtest
呼び出しで再使用できます。ただし、--recreate-databases
オプションを使用してそれらを再作成できます。By default, test databases
persist between calls to the test
Artisan command so that they can be used again by
subsequent test
invocations. However,
you may re-create them using the
--recreate-databases
option:
php artisan test --parallel --recreate-databases
並列テストフックParallel Testing Hooks
アプリケーションのテストでときどき、複数のテストプロセスにより安全に使用される特定のリソースを準備する必要があるかもしれません。Occasionally, you may need to prepare certain resources used by your application's tests so they may be safely used by multiple test processes.
ParallelTesting
ファサードを使用して、プロセスやテストケースのsetUp
とtearDown
で実行するコードを指定できます。指定するクロージャは、プロセストークンと現在のテストケースを含む$token
と$testcase
変数を受け取ります。Using the
ParallelTesting
facade, you may specify
code to be executed on the setUp
and
tearDown
of a process or test case. The
given closures receive the $token
and
$testCase
variables that contain the
process token and the current test case,
respectively:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 全アプリケーションサービスの初期起動処理
*
* @return void
*/
public function boot()
{
ParallelTesting::setUpProcess(function ($token) {
// ...
});
ParallelTesting::setUpTestCase(function ($token, $testCase) {
// ...
});
// テストデータベースが作成されたときに実行される
ParallelTesting::setUpTestDatabase(function ($database, $token) {
Artisan::call('db:seed');
});
ParallelTesting::tearDownTestCase(function ($token, $testCase) {
// ...
});
ParallelTesting::tearDownProcess(function ($token) {
// ...
});
}
}
並列テストトークンへのアクセスAccessing The Parallel Testing Token
アプリケーションのテストコードの他の場所から、現在の並列プロセスの「トークン」にアクセスしたい場合は、token
メソッドを使用します。このトークンは個々のテストプロセスのための一意な文字列の識別子であり、並列テストプロセス間でリソースを分割するために使用できます。たとえば、Laravelは各並行テストプロセスで作成するテストデータベースの末尾に、このトークンを自動的に付加します。If you would like to access the
current parallel process "token" from any
other location in your application's test code, you
may use the token
method. This token is
a unique, string identifier for an individual test
process and may be used to segment resources across
parallel test processes. For example, Laravel
automatically appends this token to the end of the
test databases created by each parallel testing
process:
$token = ParallelTesting::token();
テストカバレージのレポートReporting Test Coverage
Xdebug、またはPCOVが必要です。Warning
Warning! この機能を使用するには、
This feature requires Xdebug[https://xdebug.org] or PCOV[https://pecl.php.net/package/pcov].
アプリケーションのテストを実行する際に、テストケースが実際にアプリケーションコードをどの程度カバーしているかどうか、また、テストを実行する際にどれだけのアプリケーションコードが使用されているかを確認したいと思うことでしょう。これを行うには、test
コマンドを実行するときに、--coverage
オプションを指定します。When running your application
tests, you may want to determine whether your test
cases are actually covering the application code and
how much application code is used when running your
tests. To accomplish this, you may provide the
--coverage
option when invoking the
test
command:
php artisan test --coverage
最低限度のカバーレージ基準の強制Enforcing A Minimum Coverage Threshold
min
オプションを使用すると、アプリケーションのテストカバレッジの最小値を定義できます。この閾値を満たさない場合、テストスイートは失敗します。You may use the
--min
option to define a minimum test
coverage threshold for your application. The test
suite will fail if this threshold is not
met:
php artisan test --coverage --min=80.3