用途:在 Oro Commerce 6.1 中调试与排查 Behat 测试问题,例如场景失败、间歇性/不稳定运行(5 次过 4 次、20 次失败 3 次)、元素缺失等。
调试流程:从成本最低的信号开始逐级升级。先读失败输出与 var/log/<env>.log——Behat 报“element not found”,实际常是应用 500,真正原因在服务端日志。再用 -v/-vv/-vvv 逐级查看匹配的步骤定义、hook 执行与步骤匹配轨迹。可在疑似失败点插入 And I take screenshot;Oro 的 ScreenshotTrait::takeScreenshot 也会捕获光标位置(但浏览器弹出 alert 时除外)。可在 Context 类中放 dump($variable) 检查运行时状态。
多关卡失败:用单个诊断步骤做广度优先,而非 N 次串行运行。当症状为不透明的“缺失/为空”且有多个可能关卡(可见性表、scope、Elasticsearch 索引、系统配置、功能开关等),在 Context 中写一个 @Then I dump X for :arg 步骤,一次性查询所有可疑点并以 RuntimeException 抛出合并状态;用 try/catch 包裹每个子查询以免相互抑制;提交前移除该临时诊断步骤。
隔离与聚焦:剥离复现所需之外的所有步骤;失败的三步场景比三十步场景信息量更大。用 --stop-on-failure 获得紧密反馈。若为间歇性失败,按 AJAX 竞态处理而非简单 flake,加 And I wait 不是修复。
Xdebug 双进程调试:Behat runner(bin/behat,跑 Context、步骤定义、element、fixtures)与 PHP-FPM(响应 Mink 浏览器的 HTTP 请求,断点落在控制器、服务、仓库、事件监听器)是两个进程,通常两个容器;只在其中一个启用 Xdebug 会漏掉另一个,需两个监听目标、两个端口。CLI 附加示例:XDEBUG_MODE=debug XDEBUG_SESSION=1 php bin/behat path/to/feature.feature。调试 FPM 需在 Mink 会话中设置 XDEBUG_SESSION cookie:$this->getSession()->setCookie('XDEBUG_SESSION', 'IDEKEY');,可放 @BeforeScenario hook 或专用调试步骤。
步骤发现与冗长输出:不要猜步骤措辞。php bin/behat -dl -s OroUserBundle(仅名称)、-di(名称+描述+示例)、管道 grep 过滤;用 --dry-run --append-snippets --snippets-type=regex 生成未定义步骤骨架。标签过滤:--tags=@smoke、"@smoke&&@checkout"(AND)、"@smoke,@checkout"(OR)、"~@wip"(NOT)。
手动检查:And I wait for action 打印“Press [RETURN] to continue...”并阻塞,仅限本地;CI 中会挂起至超时,建议加 pre-commit 检查。
主要陷阱:调试错进程;在非 jQuery 请求上使用 waitForAjax(原生 fetch 与 XMLHttpRequest 不入队);提交 And I wait for action;失败后不读 var/log/<env>.log;split-process Xdebug 路径映射错误会静默跳过断点。
限制:资料未提供具体收费、平台要求或版本支持范围;v7.0 参考为占位内容。