Pest v3 现已推出

今天,我们非常高兴地宣布 Pest 3 的发布。正如我们在 Laracon US 上宣布的那样,Pest 3 引入了变异测试、架构预设、团队管理、新的配置 API,以及对架构测试的诸多改进等等。

观看 Pest 的创建者 Nuno Maduro 现场演示 Pest 3 的新功能

下面,我们将介绍此版本的所有精彩细节。与往常一样,您可以在我们的网站上找到 升级指南

  • 变异测试:一项创新技术,它对您的代码进行细微更改以查看您的测试是否能够捕获这些更改。
  • 架构预设:您可以使用的一组预定义规则来测试应用程序的架构。
  • 团队管理:一项新功能,允许您直接从控制台与团队管理任务和待办事项。
  • 新的配置 API:一个新的配置 API,更直观且易于使用。
  • 更多架构测试改进toUseStrictEqualitytoHaveMethodsDocumented->not->toHaveProtectedMethods 等等。
  • 以及更多...:类型覆盖率中的常量、静态分析改进等等。

变异测试

变异测试是一种创新的新技术,它对您的代码引入小的更改(变异)以查看您的测试是否能够捕获它们。这确保您正在彻底测试您的应用程序,而不仅仅是达到代码覆盖率,更重要的是测试的实际质量。这是一种识别测试套件中的弱点并提高质量的好方法。

Mutation Testing

要开始使用变异测试,请转到您的测试文件,并使用 covers() 函数明确指定您的测试涵盖的代码部分。

1covers(TodoController::class);
2 
3it('list todos', function () {
4 $this->getJson('/todos')->assertStatus(200);
5});

然后,使用 --mutate 选项运行 Pest PHP 以开始变异测试。

1./vendor/bin/pest --mutate
2# or in parallel...
3./vendor/bin/pest --mutate --parallel

然后,Pest 将针对“变异”代码重新运行您的测试,并查看测试是否仍在通过。如果测试针对变异仍然通过,则表示该测试没有涵盖代码的该特定部分。因此,Pest 将输出变异和代码的差异。

1UNTESTED app/Http/TodoController.php > Line 44: ReturnValue - ID: 76d17ad63bb7c307
2 
3class TodoController {
4 public function index(): array
5 {
6 // pest detected that this code is untested because
7 // the test is not covering the return value
8- return Todo::all()->toArray();
9+ return [];
10 }
11}
12 
13 Mutations: 1 untested
14 Score: 33.44%

识别出未测试的代码后,您可以编写其他测试来涵盖它。

1covers(TodoController::class);
2 
3it('list todos', function () {
4+ Todo::factory()->create(['name' => 'Buy milk']);
5 
6- $this->getJson('/todos')->assertStatus(200);
7+ $this->getJson('/todos')->assertStatus(200)->assertJson([['name' => 'Buy milk']]);
8});

然后,您可以使用 --mutate 选项重新运行 Pest 以查看该变异现在是否已“测试”并涵盖。

1Mutations: 1 tested
2Score: 100.00%

变异得分越高,您的测试套件越好。100% 的变异得分表示所有变异都已“测试”,这是变异测试的目标。

现在,如果您看到“未测试”或“未覆盖”的变异,或者变异得分低于 100%,通常表示您缺少测试您的测试没有涵盖所有边缘情况

我们的插件与 Pest PHP 深度集成。因此,每次引入变异时,Pest PHP 将

  • 仅运行涵盖变异代码的测试以加快处理速度。
  • 尽可能多地缓存以加快后续运行的速度。
  • 如果启用,则使用并行执行来并行运行多个测试以加快处理速度。

变异测试还有很多值得探索的地方,例如 @pest-mutate-ignore--mutate --everything。您可以在我们的 变异测试 部分了解更多信息。

架构预设

您可能知道,架构测试 使您能够指定期望,以测试您的应用程序是否符合一组架构规则,帮助您维护一个干净且可持续的代码库。

它是 Pest 最受欢迎的功能之一,在 Pest 3 中,我们引入了 架构预设。架构预设是一组预定义的架构规则,您可以使用它们来测试应用程序的架构。这些预设旨在帮助您快速轻松地开始进行架构测试。

Arch Presets

以下是 Pest 3 中可用的架构预设

php

php 预设是一组预定义的期望,可用于任何 php 项目。它不与任何框架或库耦合。

它避免使用 dievar_dump 和类似函数,并确保您没有使用已弃用的 PHP 函数。 源代码

1arch()->preset()->php();

security

security 预设是一组预定义的期望,可用于任何 php 项目。它不与任何框架或库耦合。

它确保您没有使用可能导致安全漏洞的代码,例如 evalmd5 和类似函数。 源代码

1arch()->preset()->security();

laravel

laravel 预设是一组预定义的期望,可用于 Laravel 项目。

它确保您的项目结构遵循众所周知的 Laravel 约定,例如控制器仅具有 indexshowcreatestoreeditupdatedestroy 作为公共方法,并且始终以 Controller 结尾等等。 源代码

1arch()->preset()->laravel();

strict

strict 预设是一组预定义的期望,可用于任何 php 项目。它不与任何框架或库耦合。

它确保您在所有文件中都使用严格类型,所有类都是最终类等等。 源代码

1arch()->preset()->strict();

relaxed

relaxed 预设是一组预定义的期望,可用于任何 php 项目。它不与任何框架或库耦合。

它与 strict 预设相反,确保您没有在所有文件中使用严格类型,所有类都不是最终类等等。 源代码

1arch()->preset()->relaxed();

就像常规的架构测试一样,您可以使用 ignoring() 方法忽略特定的期望目标。

1arch()->preset()->security()->ignoring('md5');
2 
3arch()->preset()->laravel()->ignoring(User::class);

要开始使用架构预设,请参阅我们的 架构测试 部分。

团队管理

Pest 3 还引入了 团队管理,这是一项新功能,允许您直接从控制台与团队管理任务和待办事项。使用团队管理,您可以创建、分配和跟踪任务,以及查看每个任务的状态。

Team Management

要开始在 Pest 中使用团队管理,您需要在 Pest.php 配置文件中指定项目的 URL。此 URL 将用于将待办事项链接到相应的项目管理系统。

1pest()->project()->github('my-organization/my-repository');

如果您使用的是其他版本控制系统,则可以使用 gitlabbitbucketjiracustom 方法。

最后,您可以使用 todo() 方法创建待办事项。此外,您可以使用 assigneeissue 参数将待办事项分配给特定团队成员或将其链接到项目管理系统中的问题。

1it('has a contact page', function () {
2 //
3})->todo(assignee: '[email protected]', issue: 123);

此外,为待办事项提供其他上下文通常很有帮助。Pest 允许您通过向 todo() 方法的 note 参数提供字符串来为待办事项编写注释。

1it('has a contact page', function () {
2 //
3})->todo(note: <<<NOTE
4 Given I am a user
5 When I visit the contact page
6 Then I should see a contact form
7NOTE);

待办事项完成后,您可以使用 wip() 方法将其标记为进行中,或使用 done() 方法将其标记为已完成。

1it('has a contact page', function () {
2 //
3})->wip(assignee: '[email protected]', issue: 123); // or ->done()

最后,您可以通过在运行 Pest 时包含 --todos 选项,从其余测试套件中分别查看待办事项。您还可以通过向 --assignee 选项提供其姓名来按分配者过滤待办事项,或通过向 --issue 选项提供问题编号来按问题过滤待办事项。

1./vendor/bin/pest --todos --assignee=taylor # or --issue=123

团队管理还有很多值得探索的地方,您可以在我们的 团队管理 部分了解更多信息。

新的配置 API

Pest 1 / Pest 2 的配置 API 有点令人困惑,最初仅用于在闭包中将 $this 变量绑定到测试用例实例的 uses() 函数最终被用于几乎所有事情。

在 Pest 3 中,我们引入了一个新的配置 API,它更直观且易于使用。新的配置 API 基于 pest() 函数,允许您使用流畅且富有表现力的 API 配置 Pest。

注意:uses() 函数在 Pest 3 中仍然可用,我们没有计划将其删除。但是,我们建议在新项目中使用新的配置 API。

1-uses(TestCase::class)->in(__DIR__);
2+pest()->extends(TestCase::class);
3 
4-uses(TestCase::class, RefreshDatabase::class)->in('Features');
5+pest()->extends(TestCase::class)->use(RefreshDatabase::class)->in('Features');
6 
7-uses()->compact();
8+pest()->printer()->compact();

当然,uses() API 上可用的任何方法,如 ->beforeEach()->group(),在新的 pest() 配置 API 上仍然可用;我们只是使其更直观且易于使用。

更多架构测试改进

新的断言

同样,Pest 带有一系列新的架构断言和改进。其中一些已在新架构预设中使用,但您也可以单独使用它们。

您可以在我们的 架构测试 部分查看所有现有的架构期望。

拆卸改进

如您所知,Pest 允许您使用 afterEach() 方法在每个测试后运行特定的“拆卸”回调。这对于清理资源或在测试之间重置状态非常有用。

1afterEach(function () {
2 // This will run after each test...
3});

在 Pest 3 中,我们引入了一个新的 after() 方法,允许您使用 describe 在特定测试或一组测试后运行特定的“拆卸”回调。

1it('may list todos', function () {
2 //
3})->after(function () {
4 // This will run after this test only...
5});

要了解更多关于钩子的信息,请参阅我们的 钩子 部分。

其他改进

因为 Pest 3 基于 PHPUnit 11,所以您现在可以在 Pest 中使用任何 PHPUnit 11 功能。此外,Pest 3 还包含了许多小的错误修复和改进,以下是一些:

  • FEAT:类型覆盖现在检查常量上缺少的类型。
  • FEAT:在测试中使用静态闭包 + 数据集中错误的参数时,提供更好的错误信息。
  • FEAT:为测试闭包中的静态分析工具添加基本支持。
  • FEAT:对期望和整个 API 表面的静态分析进行了整体改进。
  • FEAT:可以删除 phpunit.xml 文件并使 Pest 开箱即用。
  • FIX:使用 --fail-on-xxx CLI 选项时,退出代码计算错误。
  • FIX:Describe 块现在支持在链式调用方法时调用多个方法。
  • FIX:现在捕获并显示第一个测试之前的运行时异常。
  • FIX:当结果小于 100 但大于 99.5 时,覆盖率报告使用 --min=100 选项失败。
  • 以及更多...

现在是深入测试并开始使用 Pest 的最佳时机。如果您准备立即开始使用 Pest 3,请查看我们的 安装指南,获取分步说明。如果您目前正在使用 Pest 2,我们已在我们的 升级指南 中为您提供了详细的升级说明。

感谢您持续的支持和反馈。我们迫不及待地想看看您用 Pest 3 构建的内容!


感谢您阅读 Pest 3.0 的新功能!如果您正在为下一个项目考虑一个测试框架,以下是如何使用 Pest 的理由: 为什么选择 Pest →