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
文件以在浏览器中查看它:
注意:理想情况下,您忽略打算用于覆盖率报告的路径,在我的情况下,我会添加
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 报告,您应该会看到报告的覆盖率!
包含这些 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 应用程序生成覆盖率报告所需的所有工具,并在项目需要时考虑非标准路径的覆盖率!







