从 2.x 升级到 3.x

预计升级时间:2 分钟

我们努力记录每个潜在的破坏性更改,但其中一些更改可能存在于框架中使用频率较低的部分。因此,只有一部分这些更改可能会影响您的应用程序。

更新依赖项

影响可能性:高

Pest 3 现在需要 PHP 8.2.0 或更高版本。要开始从 Pest 2 迁移到 Pest 3,请将应用程序的 composer.json 文件中的 pestphp/pest 依赖项更新为 ^3.0

1- "pestphp/pest": "^2.0",
2+ "pestphp/pest": "^3.0",

此外,如果您使用的是 Laravel,请将 Collision 升级到版本 8。请注意,需要 Laravel 11。

1- "nunomaduro/collision": "^7.0",
2+ "nunomaduro/collision": "^8.0",

所有其他 Pest 维护的插件都应在应用程序的 composer.json 文件中更新为版本 ^3.0

1- "pestphp/pest-plugin-laravel": "^2.0",
2+ "pestphp/pest-plugin-laravel": "^3.0",

PHPUnit 11 更改

影响可能性:中

Pest 3 基于 PHPUnit 11 构建。这意味着对 PHPUnit 11 做出的任何重大更改都可能影响您的测试套件。要检查 PHPUnit 11 中引入的所有更改,请查阅 PHPUnit 11 变更日志

toHaveMethodtoHaveMethods 断言

影响可能性:低

toHaveMethodtoHaveMethods 断言已被架构断言 toHaveMethodtoHaveMethods 替换。如果您使用过这些断言,则无法再提供对象,因为架构断言需要命名空间或类名。

1-expect($object)->toHaveMethod('method');
2+expect($object::class)->toHaveMethod('method');

pest()

Pest 2 已弃用功能

在 Pest 2 发布期间,一些功能已弃用,现在在 Pest 3 中已移除。以下是要注意的更改

tap() 方法

影响可能性:低

在执行高阶测试时,您可能使用了 tap() 方法在运行时需要延迟评估的对象上调用断言。在 Pest 2 中,tap() 方法已弃用,在 Pest 3 中已移除。相反,您应该使用 defer() 方法。

1it('creates admins')
2- ->tap(fn () => $this->artisan('user:create --admin'))
3+ ->defer(fn () => $this->artisan('user:create --admin'))
4 ->assertDatabaseHas('users', ['id' => 1]);

从 1.x 升级到 2.x

预计升级时间:2 分钟

我们努力记录每个潜在的破坏性更改,但其中一些更改可能存在于框架中使用频率较低的部分。因此,只有一部分这些更改可能会影响您的应用程序。

更新依赖项

影响可能性:高

Pest 2 现在需要 PHP 8.1.0 或更高版本。要开始从 Pest 1 迁移到 Pest 2,请将应用程序的 composer.json 文件中的 pestphp/pest 依赖项更新为 ^2.0

1- "pestphp/pest": "^1.22",
2+ "pestphp/pest": "^2.0",

接下来,如果包含 PHPUnit,您可以将其从依赖项列表中移除。

1- "phpunit/phpunit": "^9.5.10",

此外,如果您使用的是 Laravel,请将 Collision 升级到版本 7。请注意,需要 Laravel 10。

1- "nunomaduro/collision": "^6.0",
2+ "nunomaduro/collision": "^7.0",

如果您使用的是并行插件(或 Paratest),您可以将其从依赖项中移除,因为它现在已默认包含在 Pest 中。

1- "brianium/paratest": "^6.8.1",
2- "pestphp/pest-plugin-parallel": "^1.2.1",

全局断言插件已存档,应将其从依赖项中移除。

1- "pestphp/pest-plugin-global-assertions": "^1.0.0",

如果您依赖于全局断言插件,您可以使用 $this 变量访问相同的底层断言。或者,您可以迁移到 断言 API

1test('sum', function () {
2 $result = sum(1, 2);
3 
4- assertSame(3, $result);
5+ $this->assertSame(3, $result); // or expect($result)->toBe(3)
6});

所有其他 Pest 维护的插件都应在应用程序的 composer.json 文件中更新为版本 ^2.0

1- "pestphp/pest-plugin-laravel": "^1.4",
2+ "pestphp/pest-plugin-laravel": "^2.0",

如果您使用的是 Faker 插件,则 faker() 函数已重命名为 fake()。您需要更新所有用法。

1- use function Pest\Faker\faker;
2+ use function Pest\Faker\fake;
3 
4test('faker', function () {
5- expect(faker()->name())->toBeString();
6+ expect(fake()->name())->toBeString();
7});

PHPUnit 10 更改

影响可能性:中

如果您之前使用的是 PHPUnit 而不是 Pest,则可能需要更新您的 phpunit.xml 文件。在这种情况下,首次运行 Pest 2 时可能会遇到以下消息。

1WARN Your XML configuration validates against a deprecated schema. Migrate your XML configuration using "--migrate-configuration"!

要解决此问题,只需使用 --migrate-configuration 选项重新运行 Pest。

1./vendor/bin/pest --migrate-configuration

Pest 2 基于 PHPUnit 10 构建。这意味着对 PHPUnit 10 做出的任何重大更改都可能影响您的测试套件。要检查 PHPUnit 10 中引入的所有更改,请查阅 PHPUnit 10 变更日志

高阶测试

影响可能性:低

在执行高阶测试时,您可能使用了 tap() 方法在运行时需要延迟评估的对象上调用断言。在 Pest 2 中,tap() 方法已弃用。相反,您应该使用 defer() 方法。

1it('creates admins')
2- ->tap(fn () => $this->artisan('user:create --admin'))
3+ ->defer(fn () => $this->artisan('user:create --admin'))
4 ->assertDatabaseHas('users', ['id' => 1]);

数据集

绑定数据集

影响可能性:极低

如果您正在使用“绑定”数据集并绑定单个数据集参数,则现在必须键入相应的测试参数。

1-it('can generate the full name of a user', function ($user, $fullName) {
2+it('can generate the full name of a user', function (User $user, $fullName) {
3 expect($user->full_name)->toBe($fullName);
4})->with([
5 [fn() => User::factory()->create(['first_name' => 'Nuno', 'last_name' => 'Maduro']), 'Nuno Maduro'],
6 [fn() => User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Downing']), 'Luke Downing'],
7 [fn() => User::factory()->create(['first_name' => 'Freek', 'last_name' => 'Van Der Herten']), 'Freek Van Der Herten'],
8]);

作用域数据集

影响可能性:极低

虽然我们之前在 Pest 1 中有文档说明数据集应该只使用 tests/Pest.phptests/Datasets.php 文件中的 dataset 函数声明,但实际上您可以在测试套件中的任何测试文件中声明数据集。但是,在 Pest 2 中,随着 作用域数据集 的引入,在测试文件中声明的数据集只能在同一测试文件中使用。因此,如果您有一个需要全局访问的数据集,请确保将其放在 tests/Pest.phptests/Datasets.php 文件中。


至此,Pest 2 升级指南结束。在下一章中,我们将介绍如何轻松地将您的测试从 PHPUnit 迁移到 Pest:从 PHPUnit 迁移