运行单个测试、跳过测试以及其他技巧和窍门
发布于 作者 Paul Redmond
Nuno Maduro 最近 分享 了可以使用 PestPHP 附加到测试的 ->only()
方法。我非常喜欢针对性地运行和重新运行测试以提高效率的方式,这个辅助方法激发了我收集各种在 PHP 中过滤、跳过和定位测试的方法的想法。这篇博文绝非面面俱到,但我希望涵盖最重要的技巧。我将介绍 PHPUnit 和 Pest,以及每个工具的应用场景。
在开始之前,让我们看一下 Nuno 分享的可以附加到单个测试的 only()
方法
it('returns a successful response', function () { $response = $this->get('/'); $response->assertStatus(200);})->only(); // If you use ->only() with multiple tests it will// run all of those selected tests.it('another test', function () { // ...})->only();
使用 only()
就像一个开关,它可以定位单个测试,方便你在专注于编写代码和运行该功能的测试时进行操作。除了 only()
辅助方法之外,PHPUnit 和 Pest 都提供了很多方法来隔离、跳过和迭代选定的测试集。
让我们来看一下!
过滤测试
无论项目规模如何,我更喜欢在进行功能开发时,单独运行一小部分测试。学习如何在 PHP 中选择和过滤测试对于开发人员来说是一项宝贵的技能。
Pest 提供了许多过滤测试的选项,包括前面提到的 ->only()
方法,使用代码或命令行标志的组合。
以下是 Pest 提供的一些用于过滤测试的标志
pest --dirtypest --bail # stop execution on first non-passing testpest --filter 'returns a successful response'pest --retry # reorders higher priority to failed testspest --group|--exclude-group # Like PHPUnit, filter by test groups.pest --todo # List tests marked as `->todo()`
在 Pest CLI 参考 中,还有其他用于测试选择的标志和选项。
PHPUnit 也提供了多种方法来过滤测试,你可以在命令行中使用这些方法
# filter which tests to runphpunit --filter test_the_application_returns_a_successful_response# Group flagsphpunit --list-groups # list available groupsphpunit --group apiphpunit --exclude-group live
PHPUnit 有很多其他选择选项,你可以通过运行 phpunit --help
或访问 PHP CLI 选择 文档来查看。Laravel 的 Tim MacDonald 在 Laravel 新闻中撰写了 加速你的 PHPUnit 测试的技巧 ,我建议你参考这篇博文来提升你的测试管理技能。
Pest 提供了与 PHPUnit 类似的选择,并在此基础上构建了一些出色的 DX 辅助方法,我发现这些方法非常宝贵。
跳过测试
当验证你的测试套件时,跳过测试很有用,但要记住,有些测试要么完全损坏,要么还在开发中。我发现一个主题是 PHPUnit 提供了跳过测试的功能,Pest 在此基础上构建了一些生产力工具,这些工具可以帮助你 用 PEST TODO 来头脑风暴测试 以及其他跳过测试的妙招。
当我编写一个新功能时,我会在开发初始功能时获得大量想法。想法比我编写代码的速度快,所以我直接跳到测试文件,开始在代码中创建待办事项清单!
it('returns a successful response', function () { $response = $this->get('/'); $response->assertStatus(200);}); it('requires a valid email')->todo();it('detects Gmail addresses with a "+" as a non-unique email.')->todo();it('requires a strong password')->todo();
然后,我可以运行 pest --todo
,准确地找到尚未完成并且想要重新访问的新功能或测试。
PHPUnit 有些你可以用于选择/跳过测试的 CLI 标志,例如 --exclude-filter
或 --exclude-group
,它们范围更广。当你想要跳过特定测试时,可以使用测试中提供的 markTestIncomplete()
方法
public function test_the_application_returns_a_successful_response(): void{ $this->markTestIncomplete('it requires a valid email'); $response = $this->get('/'); $response->assertStatus(200);}
如果你运行测试套件,你会看到一条消息,表明你有一个或多个不完整的测试。你可以使用 --display-incomplete
标志更详细地列出所有不完整的测试
我认为不完整的测试最接近 Pest 的 todo()
方法。虽然你可以使用 markTestAsSkipped()
达到类似的效果,但我建议将它保留用于跳过在目标平台或给定场景下不应该运行的测试。
为特定 PHP 或操作系统版本运行测试
如果你的代码库支持多个版本的 PHP,有时在给定版本的 PHP、操作系统或扩展上跳过特定测试是有意义的。Pest 和 PHPUnit 都提供灵活的支持来满足这些需求。
PHPUnit 有一个 RequiresPhp
属性,你可以用来定位测试中的 PHP 版本,以及各种操作系统属性
use PHPUnit\Framework\Attributes\RequiresOperatingSystemFamily;use PHPUnit\Framework\Attributes\RequiresPhp; #[RequiresPhp('<=8.0.0')]#[RequiresOperatingSystemFamily('Windows')]public function test_the_application_returns_a_successful_response(): void{ $response = $this->get('/'); $response->assertStatus(200);}
注意: 从历史上看,PHPUnit 使用 @requires 注解(现在已弃用)来定位多种类型的常见先决条件,例如 PHP 版本、操作系统、函数等。
当你运行上述测试时,它将针对运行 PHP 版本 >8.0.0
或操作系统不是 Windows
系列的系统进行跳过。使用 --display-skipped
运行测试套件,你将获得有关根据这些属性跳过的所有测试的详细信息:
作为 Pest 的 跳过测试文档 的一部分,你可以使用以下方法来跳过某些 PHP 版本、操作系统版本等。
it('has home', function () { //})->skipOnPhp('>=8.0.0'); it('has home', function () { //})->skipOnWindows(); // or skipOnMac() or skipOnLinux() ... it('has home', function() { //})->onlyOnWindows(); // or onlyOnMac() or onlyOnLinux() ...
从你的编辑器运行单个测试
最后需要提一点的是,IDE 提供了一些方法,可以使用快速命令快捷键快速运行单个测试、测试组、一个文件中的所有测试等。 Better PHPUnit VS Code 扩展 支持 PHPUnit 和 Pest,并提供以下功能
- 运行测试方法
- 运行测试文件
- 运行整个套件
- 运行之前的测试
PHPStorm 提供了大量有用的方法来运行(和重新运行)测试,包括快捷键和 UI 图标,让你可以非常轻松地从测试文件中运行测试,而无需跳到命令行: 有关为 PHPUnit 和 Pest 设置测试快捷键和工具的详细信息,请参阅 PhpStorm 文档 PHPUnit 和 Pest。
值得一提的是 sublime-phpunit 插件,它可以让你直接从 Sublime 运行单个单元测试和文件。
你使用哪些其他 IDE 和文本编辑器工具来自动运行测试?请告诉我们!