php-testing 是一个面向非 Laravel PHP 项目的测试技能,用于在编写或配置测试时,帮助在 PHPUnit 与 Pest 两个框架之间做出选择,并提供相应的配置模板与测试替身参考。
用途与定位: 该技能聚焦于非 Laravel 项目的测试框架选型与配置指导。它明确指出不适用于 Laravel 测试助手(如 RefreshDatabase、HTTP 测试),这些由 laravel-expert 的 laravel-testing 技能覆盖;也不适用于静态分析或格式化工具,那属于 php-quality-tooling 的范畴。
主要能力: 技能提供一个框架决策矩阵,用于在 PHPUnit 13 与 Pest 5 之间选择。PHPUnit 13 采用基于类的 xUnit 风格,适合企业基线、明确表达以及最广泛的工具与 CI 支持;Pest 5 采用闭包式表达风格,提供现代开发体验、浏览器测试、架构测试与变异测试,样板代码更少。由于 Pest 5 运行在 PHPUnit 13 的引擎之上,PHPUnit 知识可直接迁移,选择更多关乎开发体验与团队偏好,而非能力差异。技能还提供 phpunit.xml 模板、Pest.php 初始化模板,以及测试替身(桩、模拟、夹具、覆盖率)的参考文档。
关键规则: 需要 PHP 8.4+,PHPUnit 13 与 Pest 5 已放弃 PHP 8.3(使用 8.3 应停留在 PHPUnit 12 / Pest 4);仅使用属性,不再使用注解(PHPUnit 12 已移除 @test、@dataProvider 等 docblock 注解);数据提供器必须是 public static;createStub() 不可配置,期望只能在 createMock() 上设置,PHPUnit 13 中 any() 已硬性废弃,应使用桩或明确计数(once()、exactly(n));同一项目只使用一个框架驱动同一测试套件;只在边界处模拟(网络、数据库、时钟),不要模拟内部实现细节。
使用方式: 技能规定了一个强制性的代理工作流:在任何实现之前,并行启动三个代理,分别用于探索代码库(检测现有框架、测试布局、PHP 版本)、通过 Context7/Exa 核实最新的 PHPUnit 13 / Pest 5 文档、查询属性名称、测试替身 API 与配置模式;实现之后运行 fuse-ai-pilot:sniper 进行验证。快速开始示例中,PHPUnit 13 使用继承 TestCase 的类与 assertSame,Pest 5 使用 it() 闭包与 expect()->toBe()。
适用场景与限制: 适用场景包括企业级或严格 CI 的混合团队选择 PHPUnit 13、绿地小型团队选择 Pest 5、需要开箱即用的浏览器/架构/变异测试选择 Pest 5、以及大型 PHPUnit 套件迁移时保持 PHPUnit 或逐步迁移到 Pest。最佳实践建议按行为命名测试、每个测试断言一个行为、使用 public static 数据提供器做表驱动测试、在 CI 中设置明确的覆盖率阈值。限制方面:不覆盖 Laravel 测试助手与静态分析/格式化工具;需要 PHP 8.4+;同一套件不能混用两个框架。