内容挺扎实的,补两个新手最容易卡住的地方:autoload 没配和CI 没写。这两块不通,本地能跑、推到 GitHub 照样红。
先说 autoload。composer require --dev phpunit/phpunit 只会装依赖,不会帮你建 App\ 的映射。如果 src/Cart.php 里写的是 namespace App;,必须先在 composer.json 补:
"autoload": { "psr-4": { "App\\": "src/" } }
然后 composer dump-autoload,否则 vendor/bin/phpunit 一跑就是 Class "App\Cart" not found——这个报错 90% 是 autoload 没配或命名空间大小写不匹配。
再补一份能直接用的 GitHub Actions:
name: tests
on: [push, pull_request]
jobs:
phpunit:
runs-on: ubuntu-latest
strategy:
matrix:
php: ['8.2', '8.3', '8.4']
steps:
- uses: actions/checkout@v4
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: xdebug
- run: composer install --prefer-dist --no-progress
- run: vendor/bin/phpunit --coverage-text
两点注意:一是 composer.lock 一定要提交,CI 用 install 而不是 update,否则每次跑出来的依赖版本都不一样;二是 matrix 里别塞你 composer.json 的 require.php 约束之外的版本,PHPUnit 11 在 8.1 上直接装不上。
最后提一句和本站相关的:Clara 核心不走 Composer,没有 vendor/autoload.php。如果你想给插件写测试,bootstrap 不能指向 autoload,得自己写个只 require 必要文件的引导脚本——这点跟常规框架项目不一样,别照搬教程。
延伸建议:测试里一旦出现数据库、文件系统、time()、rand(),就会变得不可重复。先给这些开依赖注入的口子,或把测试跑在事务里最后回滚,比事后到处打补丁省事得多。