Polyscope——面向 Laravel 的以代理为先的开发环境

使用 PCOV 在 Laravel 中生成代码覆盖率

发布日期 经过

使用 PCOV 图片在 Laravel 中生成代码覆盖率

Laravel 拥有高效编写功能和单元测试所需的所有测试工具,让您对代码更有信心并减少错误。使用开箱即用的安装,我们可以立即使用 artisan 查看覆盖率报告 --coverage 旗帜:

php artisan test --coverage

如果你没有 PCOV 或者 调试工具 尚未安装,您将收到以下错误:

错误:代码覆盖率驱动程序不可用。您是否安装了 Xdebug 或 PCOV?

根据您的操作系统和 PHP 安装,您可能需要安装 PCOV 或使用 安装文档 。我使用的是 macOS,因此我可以使用 Shivam Mathur 的安装 PCOV 用于 Homebrew 的 homebrew-extensions Tap :

brew install shivammathur/extensions/pcov@8.3

安装 Xdebug 或 PCOV 后,您可以获得覆盖率报告的文本版本:

$ php artisan test --coverage
...
测试:通过 26 项(76 个断言)
时长:2.53秒
Http/Controllers/Auth/VerifyEmailController ............. 18 / 80.0%
Http/Controllers/Controller ................................. 100.0%
Livewire/操作/注销..................................... 100.0%
Livewire/Forms/LoginForm .................... 53..60, 62..61 / 55.6%
模特/用户................................................. 100.0%
提供商/应用服务提供商................................ 100.0%
提供商/VoltServiceProvider ............................... 100.0%
视图/组件/应用程序布局................................... 100.0%
视图/组件/访客布局................................... 0.0%
总计:74.4%

很不错!

HTML 报告

我们可以获得其他格式的更详细的覆盖率报告,包括我最喜欢的开发格式 HTML 报告:

vendor/bin/pest --coverage-html=build/coverage

使用 --coverage-html flag 将在您的项目中创建一个覆盖率报告,位于 build/coverage 路径,然后您可以打开 index.html 文件以在浏览器中查看它:

Laravel 应用程序中的 HTML 覆盖率
Laravel 中的 HTML 覆盖率

注意:理想情况下,您忽略打算用于覆盖率报告的路径,在我的情况下,我会添加 build.gitignore 。 PHPUnit 有许多可用的覆盖选项。要获得完整列表,您可以运行 phpunit --help

在 phpunit.xml 中配置覆盖范围

我更喜欢使用 CLI 标志来创建覆盖率报告,以便我可以在开发中生成 HTML 报告,并在 CI 构建期间生成 Clover 报告。但是,您可能希望将覆盖率配置为每次运行时都运行 pest 或者 phpunit :

< phpunit xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation = "vendor/phpunit/phpunit/phpunit.xsd"
引导 = "vendor/autoload.php"
颜色 = “真的”
>
< 覆盖范围 >
< 报告 >
< html 输出目录 = “构建/覆盖” />
< 文本 输出文件 = "build/coverage.txt" />
< 三叶草 输出文件 = "build/logs/clover.xml" />
</ 报告 >
</ 覆盖范围 >
</ phpunit >

上面的覆盖配置创建了一个 HTML、文本和 Clover 覆盖工件。现在,每次运行测试套件时,它都会生成覆盖率报告。

我更喜欢使用 CLI 标志来生成覆盖范围的灵活性,但 XML 配置可能比某些配置更可取。您可以了解更多有关 <coverage> PHPUnit 中的标签 XML 配置文件参考

承保范围是如何确定的?

为了生成准确的覆盖率,PHPUnit 需要知道您拥有哪些代码要包含在覆盖率报告中。定义 <include> 推荐使用 element,Laravel 在创建项目时默认会这样做。仅当您想要/拥有应用程序源代码的非标准路径时,才需要更改此设置。

这是什么 <source> 部分应该类似于典型的 Laravel 应用程序安装:

< 来源 >
< 包括 >
< 目录 >app</ 目录 >
</ 包括 >
</ 来源 >

如果您使用某种模块模式,则可能需要包含其他目录以反映准确的覆盖范围之外的内容 app 文件夹。此外,PCOV 需要了解这些其他目录,否则您将在其他应用程序文件夹中获得 0% 的覆盖率。

为什么?

因为 PCOV 试图找到 src , lib , 或者 app 什么时候 pcov.directory 未设置。我们可以通过创建一个示例文件来演示这一点,以便您可以直观地了解如何进行设置。

非标准代码路径的覆盖范围

我建议坚持 Laravel 的约定,但是您可能会遇到这样的情况:您处理的现有代码在除 app 文件夹。我们可以配置 PHPUnit 和 PCOV 来将此代码包含在覆盖率报告中,并进行一些调整。

让我们模仿这个;假设您从一个新的 Laravel 应用程序开始,创建一个示例模块:

# 在 Laravel 应用中
mkdir -p module/Example/src

添加以下内容到 Example.php 在里面 src 示例模块的文件夹:

命名空间 模块示例 ;
班级 例子
{
民众 功能 sayHello (名称) = '世界'
{
返回 “你好, { $名称 }! ;
}
}

接下来,我们需要自动加载此代码以运行涵盖此示例类的测试。打开 composer.json 并添加以下自动加载行:

“自动加载” :{
“psr-4” :{
“应用程序\\” : “应用程序/” ,
“模块\\示例\\” : "module/Example/src/" ,
“数据库\\工厂\\” : "数据库/工厂/" ,
“数据库\\种子库\\” : "数据库/种子/"
}
}

更新composer.json文件后,运行 composer dumpautoload 更新自动加载器并找到新路径。

正如我之前提到的,PHPUnit 需要了解源代码的位置。打开 phpunit.xml 并更新 <source> 配置以包含我们的模块:

< 来源 >
< 包括 >
< 目录 >app</ 目录 >
< 目录 >module/*/src</ 目录 >
</ 包括 >
</ 来源 >

接下来,创建一个测试文件,以便我们可以说明模块的 0% 覆盖率报告:

php artisan make:test --unit ExampleModuleTest

将以下内容添加到创建的 ExampleModuleTest.php 文件:

使用 模块\示例\示例 ;
测试 它说你好 , 功能 (){
主题 = 新的 例子 ();
预计 (主题) -> sayHello ()) -> 等于 '你好世界!' (英文):
});

如果您现在运行测试套件,您将获得 0% 的覆盖率报告 module 文件夹:

vendor/bin/pest --coverage-html=build/coverage

如果您打开最新的覆盖率报告,您会注意到丢失的覆盖率,即使测试已通过:

缺少模块覆盖
缺少模块覆盖

我们可以通过更改一些 PCOV 配置选项来解决此问题:

php -d pcov.enabled=1 -d pcov.directory=. -dpcov.exclude="~vendor~" \
vendor/bin/pest --coverage-html=build/coverage

在典型的 Laravel 应用程序结构中,我们不必这样做,因为覆盖率报告将查找 app 自动文件夹。但是,如果您的项目需要报告其他路径的覆盖率,我们必须设置 pcov.directory 到项目的根目录。自从 vendor 文件夹位于项目的根目录中,我们不想扫描 vendor ,我们可以给 PCOV pcov.exclude 图案。

如果您运行上述命令,然后刷新 HTML 报告,您应该会看到报告的覆盖率!

Laravel 应用程序中的模块覆盖率
Laravel 应用程序中的工作模块覆盖率

包含这些 PCOV 选项很乏味,所以我更喜欢添加一些编写器脚本来为我完成此操作:

“脚本” :{
"test:html" :[
“作曲家 \\ 配置::禁用进程超时" ,
"php -d pcov.enabled=1 -d pcov.directory=. -dpcov.exclude= \” 供应商 \” vendor/bin/pest --coverage-html=build/coverage"
]
}

您现在可以运行 composer test:html 生成 HTML 覆盖率报告。我也喜欢定义一个 test:ci 脚本,我可以使用它进行持续集成(clover)并将覆盖工件上传到类似的服务 声纳

您现在拥有为 Laravel 应用程序生成覆盖率报告所需的所有工具,并在项目需要时考虑非标准路径的覆盖率!

保罗·雷德蒙德照片

Laravel News 特约撰稿人。全栈 Web 开发人员兼作家。

归档于:
立方体

Laravel 时事通讯

加入超过 4 万名开发者的行列,不错过任何新的技巧、教程等内容。

图像
Laravel 云

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

访问 Laravel Cloud
PhpStorm 标志

PhpStorm

首选的 PHP IDE,对 Laravel 及其生态系统提供广泛的开箱即用支持。

PhpStorm
Kirschbaum 标志

樱桃树

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

樱桃树
Shift 标志

转移

还在运行旧版本的 Laravel?立即实现 Laravel 自动升级和代码现代化,让您的应用程序保持最新状态。

转移
Laravel Cloud 标志

Laravel 云

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

Laravel 云
了解 Softtech 的标志

了解软科技

Acquaint Softtech 提供 AI 就绪的 Laravel 开发人员,48 小时内即可上手,每月费用为 3000 美元,没有冗长的销售流程,并提供 100% 退款保证。

了解软科技
Lucky Media 标志

幸运传媒

Get Lucky Now——拥有十余年经验的 Laravel 开发理想之选!

幸运传媒
鱼叉:新一代时间跟踪和发票标志

Harpoon:新一代时间跟踪和发票系统

新一代时间跟踪和计费软件,帮助您的机构规划和预测盈利的未来。

Harpoon:新一代时间跟踪和发票系统
SerpApi logo

SerpApi

Access real-time search engine results through a simple API—no more scraping headaches! Use it for AI applications, SEO tools, product research, travel information, and more

SerpApi
Tinkerwell 徽标

廷克威尔

Laravel 开发者必备的代码运行器。可在本地和生产环境中体验 AI、自动补全和即时反馈功能。

廷克威尔
SaaSykit:Laravel SaaS 入门套件徽标

SaaSykit:Laravel SaaS 入门套件

SaaSykit 是一个多租户 Laravel SaaS 入门套件,包含运行现代 SaaS 所需的所有功能,例如支付、美观的结账界面、管理面板、用户仪表盘、身份验证、现成组件、统计数据、博客、文档等等。

SaaSykit:Laravel SaaS 入门套件
几天内即可获得 Laravel 代码审查徽标的专家指导

几天内即可获得 Laravel 代码审查方面的专家指导

专家级代码审查!两位拥有 10 年以上 Laravel 开发经验的开发者将为您提供清晰、实用的反馈,帮助团队构建更优质的应用程序。

几天内即可获得 Laravel 代码审查方面的专家指导
Simple Feature Flags for Laravel with Laravel Toggle image

Simple Feature Flags for Laravel with Laravel Toggle

阅读文章
Manage Laravel Cloud Deployments Inside PhpStorm image

Manage Laravel Cloud Deployments Inside PhpStorm

阅读文章
Piper: Laravel-Style Array and String Helpers for PHP's Pipe Operator image

Piper: Laravel-Style Array and String Helpers for PHP's Pipe Operator

阅读文章
Storage Cache Store in Laravel 13.10.0 image

Storage Cache Store in Laravel 13.10.0

阅读文章
Laravel MongoDB Full-Text Search tutorial: The Art of the Relevancy image

Laravel MongoDB Full-Text Search tutorial: The Art of the Relevancy

阅读文章
Drag-and-Drop Sorting for Eloquent Models with Reorderable for Laravel image

Drag-and-Drop Sorting for Eloquent Models with Reorderable for Laravel

阅读文章