0

0

PHP怎样进行单元测试_进行单元测试的框架使用【测试】

蓮花仙者

蓮花仙者

发布时间:2026-02-28 19:05:01

|

393人浏览过

|

来源于php中文网

原创

php主流单元测试框架是phpunit,需用vendor/bin/phpunit运行;测试类名以test结尾、方法以test开头;依赖须构造注入并可mock;断言优先用assertequals而非assertthat或assertsame。

php怎样进行单元测试_进行单元测试的框架使用【测试】

PHP单元测试该用哪个框架

PHP生态里真正主流、维护活跃、文档完整的单元测试框架只有 PHPUnit。别被“phpspec”“ParaTest”或某些博客提过的冷门工具带偏——它们要么定位不同(如 phpspec 是行为驱动,不替代单元测试),要么只是并行执行层(如 ParaTest 本质还是跑 PHPUnit)。你装了 phpunit/phpunit 就够了,其他都是锦上添花甚至画蛇添足。

常见错误现象:composer require phpunit/phpunit 装完直接运行 phpunit 报错“command not found”。这是因为新版 PHPUnit 默认不安装全局二进制,得用 vendor/bin/phpunit

  • 用 Composer 安装:运行 composer require --dev phpunit/phpunit
  • 运行测试:必须用 ./vendor/bin/phpunit(Linux/macOS)或 vendor\bin\phpunit(Windows)
  • 别手贱加 --global,全局安装容易和项目 PHP 版本/依赖冲突

写第一个测试类要注意什么

不是所有类都值得测,但只要你想测,就得让被测代码可被实例化、方法可被调用、依赖可被替换。这意味着:别在构造函数里干重活(比如连接数据库)、别用 new 硬编码依赖、别把逻辑塞进静态方法里——否则你写的不是单元测试,是集成测试的残废版。

典型错误场景:测试一个发邮件的服务,结果每次跑测试真发一封邮件出去;或者测试一个读配置的类,它直接 file_get_contents('/etc/app.conf'),根本没法 mock。

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

绿色大气办公家具类企业织梦模板1.0
绿色大气办公家具类企业织梦模板1.0

绿色大气办公家具类企业织梦模板是以织梦最新内核来进行开发的模板,该模板属于家具行业,装修企业,家装类,属于企业通用,装修设计、家具生产等企业均可以使用该模板,页面简洁简单,容易管理,DEDE5.5内核以上都可以使用;附带测试数据!模板特点:简洁美观大方小清新的设计风格,图片展示效果绝佳。页面结构简单,利于SEO的优化,模板后台易于管理。使用程序:织梦DEDECMS5.5以上版本都可以使用。温馨提示

下载
  • 测试类名必须以 Test 结尾,比如 UserRepositoryTest
  • 测试方法名必须以 test 开头,比如 testCanCreateUserFromValidData
  • 被测类尽量通过构造函数注入依赖,而不是在方法里 new 出来
  • $this->createMock(ClassName::class) 替代真实对象,尤其对 I/O、网络、时间等不稳定依赖

assertThat 和 assertEquals 到底用哪个

别用 assertThat。这是 JUnit 遗留风格,在 PHPUnit 里既冗长又无必要。现代写法全部用直白的断言函数,比如 assertEqualsassertTrueassertNull。它们语义清晰、报错信息友好、IDE 支持好。

容易踩的坑是过度使用 assertSame(严格比较)代替 assertEquals(宽松比较)。比如比较两个数组,内容一样但键顺序不同,assertSame 就会失败,而你其实只关心值是否一致。

  • 字符串、数字、布尔、简单数组:优先用 assertEquals
  • 要检查是否是同一对象引用(比如单例、装饰器链):才用 assertSame
  • 验证异常:用 $this->expectException(\Exception::class),别 try-catch + fail()
  • 验证输出(如 echo):用 $this->expectOutputString('hello'),别自己 ob_start()

测试数据库操作怎么避免污染和变慢

单元测试不该连真实数据库。哪怕你用 SQLite 内存库,只要走 PDO 连接,就不再是纯单元测试——它依赖外部状态、启动慢、容易因并发失败。真正靠谱的做法是:把数据库交互封装成接口,测试时 mock 接口行为。

比如你有个 UserRepository,它依赖 DatabaseConnection。不要在测试里 new 一个 SQLite 实例,而是让 UserRepository 构造函数接收 DatabaseConnectionInterface,然后在测试中传入 $mock = $this->createMock(DatabaseConnectionInterface::class),再指定 $mock->method('query')->willReturn($fakeResult)

  • 真实数据库操作属于集成测试范畴,应单独放在 tests/Integration 目录,用 phpunit --testsuite integration 单独跑
  • 如果非要用内存 SQLite,记得每个测试用全新 DB 文件或 :memory:,且不能跨测试复用连接
  • 时间相关逻辑(如 date('Y-m-d'))同样要抽象,用接口注入当前时间,测试时固定返回某一天

最常被忽略的一点:测试命名里藏逻辑。比如写个 testUserIsCreated,但里面没 assert 任何东西,只调用了创建方法——这根本不算测试,只是在跑副作用。每个测试必须有至少一个 assert,且 assert 的目标要明确、可验证、与方法职责对齐。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
composer是什么插件
composer是什么插件

Composer是一个PHP的依赖管理工具,它可以帮助开发者在PHP项目中管理和安装依赖的库文件。Composer通过一个中央化的存储库来管理所有的依赖库文件,这个存储库包含了各种可用的依赖库的信息和版本信息。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

160

2023.12.25

软件测试常用工具
软件测试常用工具

软件测试常用工具有Selenium、JUnit、Appium、JMeter、LoadRunner、Postman、TestNG、LoadUI、SoapUI、Cucumber和Robot Framework等等。测试人员可以根据具体的测试需求和技术栈选择适合的工具,提高测试效率和准确性 。

453

2023.10.13

java测试工具有哪些
java测试工具有哪些

java测试工具有JUnit、TestNG、Mockito、Selenium、Apache JMeter和Cucumber。php还给大家带来了java有关的教程,欢迎大家前来学习阅读,希望对大家能有所帮助。

312

2023.10.23

Java 单元测试
Java 单元测试

本专题聚焦 Java 在软件测试与持续集成流程中的实战应用,系统讲解 JUnit 单元测试框架、Mock 数据、集成测试、代码覆盖率分析、Maven 测试配置、CI/CD 流水线搭建(Jenkins、GitHub Actions)等关键内容。通过实战案例(如企业级项目自动化测试、持续交付流程搭建),帮助学习者掌握 Java 项目质量保障与自动化交付的完整体系。

25

2025.10.24

require的用法
require的用法

require的用法有引入模块、导入类或方法、执行特定任务。想了解更多require的相关内容,可以阅读本专题下面的文章。

505

2023.11.27

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

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

1642

2023.10.23

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

638

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

6

2026.02.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号