运行单个测试、跳过测试以及其他技巧和窍门

发布于 作者

Running a Single Test, Skipping Tests, and Other Tips and Tricks image

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 --dirty
pest --bail # stop execution on first non-passing test
pest --filter 'returns a successful response'
pest --retry # reorders higher priority to failed tests
pest --group|--exclude-group # Like PHPUnit, filter by test groups.
pest --todo # List tests marked as `->todo()`

Pest CLI 参考 中,还有其他用于测试选择的标志和选项。

PHPUnit 也提供了多种方法来过滤测试,你可以在命令行中使用这些方法

# filter which tests to run
phpunit --filter test_the_application_returns_a_successful_response
# Group flags
phpunit --list-groups # list available groups
phpunit --group api
phpunit --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 文档 PHPUnitPest

值得一提的是 sublime-phpunit 插件,它可以让你直接从 Sublime 运行单个单元测试和文件。

你使用哪些其他 IDE 和文本编辑器工具来自动运行测试?请告诉我们!

Paul Redmond photo

Laravel 新闻的撰稿人。全栈 Web 开发人员和作者。

Cube

Laravel 新闻通讯

加入 40,000 多名其他开发者,不错过任何新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理你的服务器,并在几秒钟内部署你的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

No Compromises

Joel 和 Aaron,来自 No Compromises 播客的两位经验丰富的开发者,现在可以为你的 Laravel 项目提供服务。 ⬧ 固定价格 7500 美元/月。 ⬧ 没有冗长的销售流程。 ⬧ 没有合同。 ⬧ 100% 退款保证。

No Compromises
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保你的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?立即进行自动化的 Laravel 升级和代码现代化,以保持你的应用程序新鲜。

Shift
Bacancy logo

Bacancy

只需每月$2500,即可为您的项目配备一位拥有4-6年经验的资深 Laravel 开发人员。获得160小时的专业技术支持和15天无风险试用。立即预约通话!

Bacancy
Lucky Media logo

Lucky Media

现在就幸运起来 - Laravel 开发的理想选择,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的力量带入 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位招聘平台

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表板、身份验证、即用型组件、统计数据、博客、文档等等。

SaaSykit: Laravel SaaS 启动套件
Rector logo

Rector

您的无缝 Laravel 升级合作伙伴,降低成本,加速创新,助力企业成功

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活、现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的站点搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包为您的 Laravel 应用程序添加评论

阅读文章