phpunit在symfony 6+项目中默认预装且开箱即用,无需手动安装;运行./vendor/bin/phpunit即可执行测试,但须调用self::bootkernel()才能使用static::getcontainer()获取测试容器。

PHPUnit在Symfony项目里默认就装好了
Symfony 6+ 项目初始化时,phpunit 已作为开发依赖写进 composer.json,且自带 phpunit.xml.dist 配置文件。不需要手动安装或配置基础环境——只要项目是用 symfony new 或 composer create-project symfony/skeleton 创建的,直接运行 ./vendor/bin/phpunit 就能跑默认测试(哪怕目前啥测试都没写)。
常见错误现象:Command "phpunit" is not defined —— 多半是因为你删了 phpunit 的 Composer 脚本别名,或者用了旧版 Symfony(composer show phpunit/phpunit 是否有输出;没有就补上:composer require --dev phpunit/phpunit。
测试类该放在哪儿、怎么命名
Symfony 遵循 PSR-4 和约定优于配置原则:测试类必须放在 tests/ 目录下,命名以 Test 结尾,对应被测类路径要能映射上。
-
src/Controller/PostController.php→tests/Controller/PostControllerTest.php -
src/Service/EmailSender.php→tests/Service/EmailSenderTest.php - 测试类必须继承
TestCase(use PHPUnit\Framework\TestCase;),方法名以test开头或加@test注解
别手贱把测试文件丢进 src/,也别叫 PostTest.php 却放在 tests/ 根目录——自动加载器找不到,报 Class ... not found。
用KernelTestCase跑带容器的集成测试
纯 TestCase 无法访问 Symfony 容器、数据库、配置等。要测 Controller、Repository 或带依赖注入的服务,得用 KernelTestCase。
示例:
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
class EmailSenderTest extends KernelTestCase
{
public function testSendsEmail(): void
{
self::bootKernel();
$emailSender = static::getContainer()->get(EmailSender::class);
// …断言逻辑
}
}
关键点:
- 必须调用
self::bootKernel(),否则getContainer()报错 -
static::getContainer()返回的是测试专用容器,和 prod/dev 环境隔离 - 数据库操作默认走内存 SQLite(
sqlite:///:memory:),但如果你改过phpunit.xml.dist里的SYMFONY_DEPRECATIONS_HELPER或数据库 DSN,行为会变 - 每次测试后容器自动销毁,不用手动清理
避免在测试里硬编码环境或路径
很多人写测试时直接 new 一个 EntityManager 或拼接 __DIR__.'/../../config/packages/test/doctrine.yaml',这会导致测试脆弱、不可移植。
正确做法:
- 依赖注入:把需要的对象(如
EntityManagerInterface)声明为测试方法参数,KernelTestCase 会自动注入(需启用autowire: true且服务可 public) - 用
static::getContainer()->get('doctrine.orm.default_entity_manager')拿 EntityManager,而不是 new - 配置差异走
config/packages/test/目录下的 YAML 文件,不要在测试代码里copy()或file_put_contents() - 环境变量统一由
.env.test控制,别在测试里putenv('APP_ENV=test')
最常被忽略的一点:测试中调用 $kernel->getContainer()(而非 static::getContainer())会拿不到已启动的容器实例,因为每个测试方法是独立执行的,$kernel 是未 boot 的新实例——这个坑够填半小时。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











