尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LiipFunctionalTestBundle踩坑指南:注解冲突、会话配置与PHPUnit兼容问题全解

LiipFunctionalTestBundle踩坑指南:注解冲突、会话配置与PHPUnit兼容问题全解 LiipFunctionalTestBundle踩坑指南注解冲突、会话配置与PHPUnit兼容问题全解【免费下载链接】LiipFunctionalTestBundleSome helper classes for writing functional tests in Symfony项目地址: https://gitcode.com/gh_mirrors/li/LiipFunctionalTestBundle为什么要读这份 LiipFunctionalTestBundle 踩坑指南LiipFunctionalTestBundle 是 Symfony 生态中最受欢迎的功能测试辅助工具之一它为开发者提供了WebTestCase基类、makeClient()客户端工厂、assertStatusCode()状态码断言、Query Counter 查询计数器等一系列开箱即用的能力。然而很多新手在第一次配置时就会接连踩坑注解冲突、会话配置报错、PHPUnit 版本兼容问题一个接一个让人头疼。这份踩坑指南基于 LiipFunctionalTestBundle 官方源码与文档整理帮你把最常见的 3 个大坑一次讲透附上可直接复制的解决方案照着改就能跑通。 本文涉及的官方资料位置安装文档doc/installation.md基础用法doc/basic.md踩坑说明doc/caveats.md查询计数doc/query.md一、先花 30 秒认识这个 BundleLiipFunctionalTestBundle 解决的核心痛点让 Symfony 功能测试写起来更快、断言更直观。它的核心类只有两个文件作用src/Test/WebTestCase.php测试基类提供 makeClient / assertStatusCode / runCommand 等方法src/Annotations/QueryCount.php查询次数上限注解防止页面 SQL 爆炸一分钟安装步骤composer require --dev liip/functional-test-bundle:^4.0.0安装后在AppKernel中仅对test环境启用if (test $this-getEnvironment()) { $bundles[] new Liip\FunctionalTestBundle\LiipFunctionalTestBundle(); }⚠️ 注意从 3.x 开始fixtures 加载功能已拆分为独立的 LiipTestFixturesBundle需要单独安装。升级细节可参考 UPGRADE-3.0.md。二、坑 1注解冲突 —— “group was never imported” 报错全解这是 LiipFunctionalTestBundle 被问得最多的问题。当你给测试方法加上 PHPUnit 的group controller注解后运行测试会直接爆出Doctrine\Common\Annotations\AnnotationException: [Semantical Error] The annotation group in method Tests\…::test…() was never imported. Did you maybe forget to add a use statement for this annotation?为什么会有注解冲突原因很直接Bundle 内部用 Doctrine 的注解读取器解析QueryCount等注解而PHPUnit 自身的group、dataProvider、depends等注解并不是 Doctrine 认识的注解类于是被当成非法注解报错。最快配置方法一在测试类上声明忽略在测试类上方加入IgnoreAnnotation告诉 Doctrine 读取器这个注解不用管use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation; use Liip\FunctionalTestBundle\Test\WebTestCase; /** * IgnoreAnnotation(group) */ class AcmeTest extends WebTestCase { // ... }最快配置方法二全局 bootstrap 文件推荐一劳永逸的办法是新建tests/bootstrap.php全局忽略 PHPUnit 注解use Doctrine\Common\Annotations\AnnotationReader; use Doctrine\Common\Annotations\AnnotationRegistry; $loader require __DIR__./../vendor/autoload.php; AnnotationRegistry::registerLoader([$loader, loadClass]); AnnotationReader::addGlobalIgnoredName(group);然后在phpunit.xml.dist中指定 bootstrapphpunit bootstraptests/bootstrap.php✅ 如果同时使用了dataProvider或depends记得把注解名也加进去AnnotationReader::addGlobalIgnoredName(dataProvider);三、坑 2会话配置 —— “Missing session.storage.options#name” 怎么破第二个高频报错出现在你使用makeClient()或登录用户测试时Missing session.storage.options#name为什么会话配置报错因为 Bundle 要求测试环境必须使用文件系统的 mock 会话存储并且显式指定会话名。官方推荐在config_test.ymlSymfony 4 为config/packages/test/framework.yaml中这样配置framework: test: true session: storage_id: session.storage.mock_file name: MOCKSESSION liip_functional_test: ~✅ 关键点就两个storage_id: session.storage.mock_file 自定义name。实测将name设为MOCKSESSION或MOCKSESSID均可。登录用户的会话配置技巧如果需要测试登录态推荐使用 HTTP Basic Auth 方式官方最佳实践在config_test.yml中配置liip_functional_test: authentication: username: 测试用户名 password: 测试密码之后在测试里直接$this-makeAuthenticatedClient()就能拿到已登录的客户端。⚠️ 升级提醒旧版$this-makeClient(true)和$this-makeClient([username ...])已废弃3.x 拆分为makeAuthenticatedClient()与makeClientWithCredentials()详见 UPGRADE-3.0.md。四、坑 3PHPUnit 兼容问题 —— 版本限制与 QueryCount 注解陷阱第三个大坑集中在版本兼容上这里整理成一张速查表场景兼容情况说明PHPUnit 版本✅ ^9.6 / ^10.0 / ^11.0composer.json 明确声明支持Symfony 版本✅ 5.4 / 6.4 / 7.0旧版本建议先升级Query Counter 查询计数⚠️ 与 Symfony 7不兼容官方文档明确标注QueryCount注解方法名⚠️ 只支持testFooBla()形式不支持test注解声明的方法QueryCount 注解的三个隐藏限制只认test前缀QueryCount(100)只对testXxx()命名的方法生效用test注解声明的方法无效会破坏 PHPUnit 内置注解开启 Query Counter 后dataProvider、depends可能失效需要在类上补充/** * IgnoreAnnotation(dataProvider) * IgnoreAnnotation(depends) */ class DemoTest extends WebTestCase { // ... }必须配套开启 ProfilerQuery Counter 依赖 Symfony Profiler 统计 SQL 条数配置参考 doc/query.mdframework: profiler: enabled: true collect: true liip_functional_test: query: max_query_count: 50 # 单请求最多 50 条 SQL超出即失败如何优雅地跳过查询计数某些页面如报表导出查询量本来就大这时可用QueryCount注解按方法单独放宽上限use Liip\FunctionalTestBundle\Annotations\QueryCount; /** * QueryCount(500) */ public function testExportReport() { // 该方法允许最多 500 条 SQL }五、终极避坑清单收藏备用最后把全文精华浓缩成一张检查清单排错时逐项核对✅ 已执行composer require --dev liip/functional-test-bundle:^4.0.0✅ 仅 test 环境注册了 Bundle✅framework.session.storage_id设为session.storage.mock_file且配置了name✅ 使用group/dataProvider/depends时已加IgnoreAnnotation或全局 bootstrap✅ 使用 Symfony 7 时未启用 Query Counter不兼容✅QueryCount只写在testXxx()方法上✅ 已登录客户端使用makeAuthenticatedClient()而非旧版makeClient(true)✅ 需要 fixtures 时已额外安装 LiipTestFixturesBundle按照这份 LiipFunctionalTestBundle 踩坑指南逐项排查注解冲突、会话配置、PHPUnit 兼容这三大难题基本都能一次解决。如果某一步仍然报错记得先确认你的 Symfony 与 PHPUnit 版本再回看本文的兼容速查表——大多数问题都源于版本组合。祝你的 Symfony 功能测试一次通过全绿收工【免费下载链接】LiipFunctionalTestBundleSome helper classes for writing functional tests in Symfony项目地址: https://gitcode.com/gh_mirrors/li/LiipFunctionalTestBundle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表