本文给出从编写到执行的完整路径:如何组织测试金字塔、度量覆盖率并在 CI 中设定门槛,结合 PHPStan 静态分析发现早期缺陷,形成可持续的质量保障机制。
## 安装与基础命令
composer require --dev phpunit/phpunit:^10 phpstan/phpstan:^1.11
基础执行:
./vendor/bin/phpunit --colors=always
./vendor/bin/phpstan analyse src --level=max
## 覆盖率度量
使用 Xdebug 或 PCOV:
./vendor/bin/phpunit --coverage-text --coverage-html coverage/
在 `phpunit.xml` 中设定覆盖率目录与白名单:
<phpunit colors="true">
<coverage>
<include>
<directory>src</directory>
</include>
<report>
<html outputDirectory="coverage"/>
</report>
</coverage>
</phpunit>
## 静态分析与规则
`phpstan.neon` 示例:
parameters:
level: max
paths:
- src
checkMissingIterableValueType: true
treatPhpDocTypesAsCertain: true
## CI 集成与质量门禁
典型 GitHub Actions 片段:
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: xdebug
- run: composer install --no-interaction --prefer-dist
- run: ./vendor/bin/phpunit --coverage-text --coverage-clover=coverage.xml
- run: ./vendor/bin/phpstan analyse src --level=max
- name: Enforce Coverage >= 80%
run: |
php -r '$c=simplexml_load_file("coverage.xml");$r=(float)$c->project->metrics[0]["statements"];$m=(float)$c->project->metrics[0]["coveredstatements"];$p=$m/$r*100;echo "Coverage: $p%\n";if($p<80){exit(1);}';
## 测试金字塔建议
- 单元测试占多数,聚焦纯函数与小型类;集成测试覆盖关键边界;端到端测试针对核心流程。
- 使用 Test Doubles 控制外部依赖;将慢测试隔离并在夜间构建运行。
## 相关文章(同分类热门)
- [PHP 8 性能优化与 Opcache 与 FPM 调优:生产可验证实践指南](./PHP 8 性能优化与 Opcache 与 FPM 调优:生产可验证实践指南.md)
- [Composer 2 与自动加载优化:PSR-4、Classmap 与 Opcache 结合实战](./Composer 2 与自动加载优化:PSR-4、Classmap 与 Opcache 结合实战.md)
## 结语
将覆盖率度量与静态分析门禁写入 CI,可让质量基线从“偶然”变为“必然”。通过持续的度量与反馈循环,团队能够更可靠地交付可维护的 PHP 代码。

发表评论 取消回复