You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行Behat测试后Doctrine迁移新增字段消失是什么原因?

问题原因及排查方案

核心原因

你的修改被撤销大概率是Behat测试启动时自动重置了测试库表结构,且重置逻辑没有走你执行的Doctrine迁移流程,常见场景如下:

  • 实体映射未同步更新:你只在迁移文件里加了currency字段,但是对应master_game_report的Doctrine实体类没有添加该字段的映射配置(注解/XML/YAML配置)。大部分Symfony+Behat的默认配置会在测试启动前执行doctrine:schema:update --force逻辑,该操作会强制让表结构和实体映射完全对齐,自动删除映射中不存在的字段。
  • Behat使用的环境和你执行迁移的环境不一致:你执行迁移用的是--env=test,但Behat可能实际运行在单独的测试环境(比如test_behat),该环境的数据库从未执行过迁移,每次测试启动时会基于旧的映射初始化表结构。
  • 配置了测试前自动导入初始库结构:很多项目会预置旧的测试库SQL dump文件,配置了Behat测试套件启动前自动导入该文件,你新的字段没有更新到这个初始dump文件里,导入后就会覆盖迁移后的结构。
  • 测试数据库隔离工具的重置逻辑:如果你的项目用了dama/doctrine-test-bundle之类的测试隔离工具,或者Behat上下文里写了@BeforeScenario/@BeforeSuite钩子重置表结构,也会导致手动执行的迁移被覆盖。

排查步骤

  • 先确认master_game_report对应的Doctrine实体类中是否添加了currency字段的映射配置,没有的话先补全再重新执行迁移。
  • 检查你的behat.yml配置,查看扩展部分是否有数据库重置相关的配置项,比如schema_tool: update、reset_database: true之类的逻辑,临时关闭后再次执行测试,确认字段是否还会消失。
  • 执行Behat命令时加上环境参数,确保和你执行迁移的环境一致:
    docker exec -it statisticsweb vendor/behat/behat/bin/behat features/features/Report/master_game_report.feature:8 --env=test
    
  • 检查自定义的Context类(比如你报错里的DatabaseContext)有没有前置钩子写了修改表结构、导入SQL的逻辑。

内容的提问来源于stack exchange,提问作者Furkan ozturk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:00