用途:在非 Laravel 的 PHP 项目中编写和配置测试时使用,核心是决定用 PHPUnit 还是 Pest,并给出配置与测试替身模板。不适用于 Laravel 的 RefreshDatabase、HTTP 测试等助手,也不适用于静态分析与格式化(属于 php-quality-tooling)。
主要能力:提供框架选择决策矩阵(依据团队偏好而非能力差异);提供 phpunit.xml、Pest.php 初始化与测试替身(stub、mock、fixture、覆盖率)模板;覆盖注解迁移到属性的说明。
框架对比:PHPUnit 13 为基于类的 xUnit 风格,适合企业基线、严格 CI 与混合团队;Pest 5 为闭包风格,语法简洁,内置浏览器、架构与变异测试。Pest 5 运行在 PHPUnit 13 引擎之上,PHPUnit 知识可直接迁移,选择取决于人机工程与团队偏好。
关键规则:两者均要求 PHP 8.4+(PHP 8.3 需停留在 PHPUnit 12 / Pest 4);仅用属性,PHPUnit 12 已移除 @test、@dataProvider 等注解;数据提供器必须为 public static;createStub() 不可配置期望,仅在 createMock() 上配置,PHPUnit 13 中 any() 已硬弃用,改用 stub 或明确次数(once()、exactly(n));同一项目只用一种框架驱动同一套件;在边界处 mock(网络、数据库、时钟),不要 mock 内部实现细节。
使用方式:先检测现有框架(phpunit.xml 与 Pest.php)、测试布局与 PHP 版本,再查阅对应参考文档与模板;实现后运行验证。快速示例:PHPUnit 用 final class 继承 TestCase 并 assertSame;Pest 用 it() 与 expect()->toBe()。
最佳实践:按行为命名测试、每个测试断言一个行为;用 #[DataProvider] 与 public static 提供器做表驱动测试;CI 以明确覆盖率阈值作为门禁。避免保留已移除的注解、在 createStub() 上配置期望、mock 被测类本身(应 mock 其协作者)。
限制:资料未提供具体安装命令、价格、平台支持范围与效果数据。