讲师中心 微信公众号
AI工具推荐 视频效率加速

Webman 单元测试指南:编写高质量、高覆盖率的 PHP 代码

夏墨大大_6263

夏墨大大_6263

发布时间:2026-06-20 14:58:58

|

920人浏览过

|

来源于php中文网

原创

Webman单元测试跑不起来主因是tests/bootstrap.php未正确加载框架上下文,必须显式引入support/bootstrap.php并初始化配置、容器与时区,控制器测试需用Request::create()构造请求并手动注入mock依赖,数据库等外部服务必须mock。

webman 单元测试指南:编写高质量、高覆盖率的 php 代码

Webman 单元测试跑不起来,90% 是因为 tests/bootstrap.php 没配对 —— 不是 PHPUnit 装错了,也不是测试类写法有问题,而是框架上下文根本没加载。

为什么 app() 报错或 Container 为空

直接运行 phpunit 时只加载了 vendor/autoload.php,support/bootstrap.php 完全没执行。结果就是 app()、config()、db() 全部不可用,报 Call to undefined function app() 或 Attempt to access property "xxx" on null。

  • 必须在 tests/bootstrap.php 开头显式 require __DIR__ . '/../support/bootstrap.php'(注意:要放在 autoload.php 之后)
  • 别信“只要 autoload 就够了”的直觉——Webman 不像 Laravel 那样自动桥接测试环境
  • 如果项目用了自定义配置路径,还要补一句 Config::load(__DIR__ . '/../config/'),否则 route.php、container.php 读不到
  • 手动设时区:date_default_timezone_set(config('app.timezone', 'Asia/Shanghai')),否则 Carbon 实例或日志时间错乱

测试控制器时怎么避免 404 Not Found 或
$this->request is null</H3>
<p>不要 <code>new UserController()
后直接调 show(),也不要用 file_get_contents('http://localhost/...') 发真实请求——前者缺 Request 和依赖注入,后者是集成测试,慢且不稳定。
  • 用 Webman\Http\Request::create('/user/123', 'GET') 构造请求对象,它自带完整上下文(query、header、method 等)
  • 若控制器构造函数依赖 UserService,先 mock:$mockService = $this->createMock(UserService::class),再 new UserController($mockService)
  • 跳过路由匹配层,直调方法:$result = $controller->show($request, '123')
  • 所有中间件、日志、监控等生产级组件,在测试中应禁用:在 config/middleware.php 测试配置里返回空数组,或只保留 SessionMiddleware 这类必要项

哪些依赖必须 Mock,不 Mock 会怎样

一跑测试就卡住、超时、抛 DatabaseConnectionException 或 RedisException,基本可以确定你没隔离外部服务。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

立即学习“PHP免费学习笔记(深入)”;

  • 数据库(db()、Eloquent、Query Builder)必须 mock,用 $this->createMock(Connection::class) 或更轻量的 Phake/Prophecy
  • Redis 客户端(redis())、HTTP 客户端(GuzzleHttp\Client)、消息队列(amqp)全部要 mock,否则测试环境连不上就会 fail
  • 文件系统操作(Storage::disk('local'))、第三方 API 调用(如微信支付 SDK)也得 mock,否则测试结果受网络、权限、配额影响
  • mock 不是“假装它存在”,而是明确声明行为:$mockService->method('find')->willReturn(null),让测试可预测、可重复

phpunit.xml 和 PhpStorm 配置里的硬坑

phpunit.xml 写错一行,bootstrap.php 就会被当成测试类反复加载,报 Cannot declare class Bootstrap;PhpStorm 的 Docker 映射多配一个路径,测试就找不到 bootstrap.php。

  • <directory></directory> 值必须精确到测试类目录,比如 tests/unit,不能写 tests(否则会扫进 tests/bootstrap.php)
  • bootstrap 属性值是相对路径,从 phpunit.xml 所在位置算起,正确写法是 tests/bootstrap.php,不是 ./tests/bootstrap.php(多点)或 tests/bootstrap.php(少 ./)——注意斜杠方向和层级
  • PhpStorm 的 CLI Interpreter → Path mappings 中,Remote path 和 Container path 都不需要填,留空即可;填了反而导致路径解析失败
  • 测试方法命名别用 testShow(),改用 testShowUserReturns404WhenUserNotFound(),业务语义越强,后期排查越快

真正难的不是写断言,而是判断哪一层该被隔离、哪条路径该被覆盖。mock 多了测试变假,mock 少了又跑不动——边界感得靠每次失败的 DatabaseConnectionException 来校准。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

9444

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

5701

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2055

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3548

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4234

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3311

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4717

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3682

2023.11.13

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

160

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman和FastAPI的性能对比
Webman和FastAPI的性能对比

共0课时 | 295人学习

Webman中文手册
Webman中文手册

共0课时 | 0人学习

webman初步使用及后台搭建
webman初步使用及后台搭建

共15课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn