测试:入门
Introduction
Laravel 在构建时考虑到了测试。事实上,对使用 PHPUnit 进行测试的支持是开箱即用的,并且phpunit.xml
已经为您的应用程序设置了文件。该框架还附带方便的帮助程序方法,使您能够有效地测试您的应用程序。
默认情况下,您的应用程序的tests
目录包含两个目录:Feature
和Unit
.单元测试是专注于代码中非常小的孤立部分的测试。事实上,大多数单元测试可能都集中在一个方法上。 “单元”测试目录中的测试不会启动 Laravel 应用程序,因此无法访问应用程序的数据库或其他框架服务。
功能测试可能会测试代码的大部分,包括多个对象如何相互交互,甚至是对 JSON 端点的完整 HTTP 请求。通常,您的大部分测试应该是功能测试。这些类型的测试最有信心确保您的系统作为一个整体按预期运行。
一个ExampleTest.php
文件中均提供了Feature
和Unit
测试目录。安装新的 Laravel 应用程序后,执行vendor/bin/phpunit
或者php artisan test
命令来运行你的测试。
Environment
运行测试时,Laravel 会自动设置配置环境 到testing
因为在定义的环境变量phpunit.xml
文件。 Laravel 还会自动配置会话和缓存到array
驱动程序,这意味着在测试时不会保留会话或缓存数据。
您可以根据需要自由定义其他测试环境配置值。这testing
环境变量可以在您的应用程序中配置phpunit.xml
文件,但请确保使用config:clear
运行测试之前的 Artisan 命令!
这.env.testing
环境文件
此外,您可以创建一个.env.testing
文件在项目的根目录中。将使用此文件代替.env
运行 PHPUnit 测试或使用 Artisan 命令执行文件时--env=testing
选项。
这CreatesApplication
特征
Laravel 包括一个CreatesApplication
应用于您的应用程序基础的特征TestCase
班级。这个特征包含一个createApplication
在运行测试之前引导 Laravel 应用程序的方法。重要的是将此特性保留在其原始位置,因为某些功能(例如 Laravel 的并行测试功能)依赖于它。
创建测试
要创建新的测试用例,请使用make:test
工匠命令。默认情况下,测试将放置在tests/Feature
目录:
php artisan make:test UserTest
如果您想在tests/Unit
目录,你可以使用--unit
执行时的选项make:test
命令:
php artisan make:test UserTest --unit
如果你想创建一个害虫PHP 测试,你可以提供--pest
的选项make:test
命令:
php artisan make:test UserTest --pest
php artisan make:test UserTest --unit --pest
Note
可以使用自定义测试存根存根发布.
生成测试后,您可以像通常使用的那样定义测试方法PHPUnit.要运行测试,请执行vendor/bin/phpunit
或者php artisan test
来自终端的命令:
<?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
如果你自己定义setUp
/tearDown
测试类中的方法,一定要调用相应的parent::setUp()
/parent::tearDown()
父类上的方法。
运行测试
如前所述,编写测试后,您可以使用phpunit
:
./vendor/bin/phpunit
除了phpunit
命令,你可以使用test
用于运行测试的 Artisan 命令。 Artisan 测试运行器提供详细的测试报告以简化开发和调试:
php artisan test
任何可以传递给phpunit
命令也可以传递给工匠test
命令:
php artisan test --testsuite=Feature --stop-on-failure
并行运行测试
默认情况下,Laravel 和 PHPUnit 在单个进程中按顺序执行测试。但是,您可以通过跨多个进程同时运行测试来大大减少运行测试所需的时间。首先,确保您的应用程序依赖于版本^5.3
或更大的nunomaduro/collision
包裹。然后,包括--parallel
执行时的选项test
工匠命令:
php artisan test --parallel
默认情况下,Laravel 将创建与您机器上可用的 CPU 内核一样多的进程。但是,您可以使用--processes
选项:
php artisan test --parallel --processes=4
Warning
并行运行测试时,一些 PHPUnit 选项(例如--do-not-cache-result
) 可能不可用。
并行测试和数据库
只要您配置了主数据库连接,Laravel 就会自动为每个运行测试的并行进程创建和迁移测试数据库。测试数据库将以每个进程唯一的进程令牌作为后缀。例如,如果你有两个并行的测试进程,Laravel 会创建并使用your_db_test_1
和your_db_test_2
测试数据库。
默认情况下,测试数据库在对test
工匠命令,以便后续可以再次使用它们test
调用。但是,您可以使用--recreate-databases
选项:
php artisan test --parallel --recreate-databases
并行测试挂钩
有时,您可能需要准备应用程序测试使用的某些资源,以便多个测试进程可以安全地使用它们。
使用ParallelTesting
外观,您可以指定要在外观上执行的代码setUp
和tearDown
过程或测试用例。给定的闭包收到$token
和$testCase
分别包含流程令牌和当前测试用例的变量:
<?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) {
// ...
});
}
}
访问并行测试令牌
如果您想从应用程序测试代码中的任何其他位置访问当前并行进程“令牌”,您可以使用token
方法。此令牌是单个测试过程的唯一字符串标识符,可用于跨并行测试过程分割资源。例如,Laravel 会自动将此标记附加到每个并行测试过程创建的测试数据库的末尾:
$token = ParallelTesting::token();
报告测试覆盖率
运行应用程序测试时,您可能想要确定测试用例是否实际覆盖了应用程序代码,以及在运行测试时使用了多少应用程序代码。为此,您可以提供--coverage
调用时的选项test
命令:
php artisan test --coverage
执行最低覆盖率阈值
您可以使用--min
为您的应用程序定义最小测试覆盖率阈值的选项。如果不满足此阈值,测试套件将失败:
php artisan test --coverage --min=80.3
分析测试
Artisan 测试运行器还包括一个方便的机制,用于列出应用程序最慢的测试。调用test
命令与--profile
显示十个最慢测试列表的选项,使您可以轻松调查可以改进哪些测试以加快测试套件的速度:
php artisan test --profile