尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Symfony 命令行测试怎么做?runCommand 与 verbosity 五档控制完整指南

Symfony 命令行测试怎么做?runCommand 与 verbosity 五档控制完整指南 Symfony 命令行测试怎么做runCommand 与 verbosity 五档控制完整指南【免费下载链接】nuclei-templatesCommunity curated list of templates for the nuclei engine to find security vulnerabilities.项目地址: https://gitcode.com/GitHub_Trending/nu/nuclei-templatesSymfony 命令行测试向来是功能测试里最费神的一块手动建 Application、引导内核、找命令、执行、收集输出样板代码比断言还长。LiipFunctionalTestBundle 就是冲着这个痛点来的——继承它的 WebTestCase一行 runCommand() 就能执行命令并拿到 CommandTesterverbosity 详细级别还能按全局或单测两级控制。为什么命令行测试比 HTTP 测试更费劲写 HTTP 接口测试时动作很顺发请求、断言状态码、断言响应体内核引导这一摊事 Symfony 自带的基础设施就替你管了。换成控制台命令麻烦立刻显形——命令不在任何 HTTP 请求里你得自己搭 Application、把 kernel 挂上去、定位命令、借 CommandTester 执行、再从中抠出输出与退出码这几步换个项目就得再抄一遍。LiipFunctionalTestBundle 在 Symfony 自带 WebTestCase 之上加了一层便捷方法把建 Application、挂 kernel、找命令、执行、取输出这一串动作压进一次 runCommand() 调用测试代码只剩业务断言。它顺手还管了输出详细级别、颜色装饰、交互式输入这些细活。核心实现集中在 src/Test/WebTestCase.php官方文档 doc/command.md 讲的就是同一条流程。继承基类一行 runCommand 跑通命令测试流程不长测试类继承Liip\FunctionalTestBundle\Test\WebTestCase调runCommand()执行命令命令名走第一个参数--force这类开关塞进第二个参数的数组返回值就是CommandTester断言直接挂在它身上use Liip\FunctionalTestBundle\Test\WebTestCase; class MyCommandTest extends WebTestCase { public function testMyCommand(): void { $tester $this-runCommand(app:my-command, [--force true]); $this-assertStringContainsString(Done!, $tester-getDisplay()); $this-assertSame(0, $tester-getStatusCode()); } }runCommand()还有个容易忽略的第三参$reuseKernel同一个测试里要连跑几条命令时传true内核只启动一次命令多时测试速度提升肉眼可见。完整签名见 src/Test/WebTestCase.php项目自带的示例测试在 tests/Command/CommandTest.php。verbosity 五档怎么选全局配置、单测覆盖与速查表命令在默认级别下经常惜字如金关键信息要调高详细级别才肯打印。控制手段分全局和单测两层按作用范围选。全局 YAML改一处处处生效测试环境配置文件里写一行整个测试套件的命令都按这个级别跑# config/packages/test/liip_functional_test.yaml liip_functional_test: command_verbosity: debug 团队统一风格就走全局改一处处处生效个别测试想临时换级别下一节单独覆盖两层互不干扰。节点默认值是normal定义在 src/DependencyInjection/Configuration.php。单条测试覆盖verbosityLevel 属性与 setVerbosityLevel()不想动全局时在测试方法里设置即可public function testDebugOutput(): void { $this-verbosityLevel debug; $tester $this-runCommand(app:my-command); $this-assertStringContainsString(debug detail, $tester-getDisplay()); }更规范的写法是调用公开 APIsetVerbosityLevel()效果相同只是把赋值变成显式方法调用。级别名拼错时getVerbosityLevel()会直接抛异常这个坑文末细说。五档速查quiet 到 debug级别对应开关什么时候用quiet无只关心命令跑没跑成输出全静音normal无默认档常规提示信息verbose-v想看额外的执行说明very_verbose-vv需要更细的日志线索debug-vvv排障要全量调试信息项目里的liipfunctionaltestbundle:test命令在不同档位输出内容不同tests/Command/CommandTest.php 中testRunCommandVerbosityVerbose、testRunCommandVerbosityDebug等方法就是按档位逐条断言的现成参考。setInputs() 模拟真人敲键盘交互式命令是另一道坎命令中途弹出确认或提问测试跑到那里就卡死。setInputs()按数组顺序模拟键盘输入一条yes顶替一次回车public function testInteractiveCommand(): void { $this-setInputs([yes]); $tester $this-runCommand(app:confirm-command); $this-assertStringContainsString(confirmed, $tester-getDisplay()); }⚠️ 输入会被消耗喂进去的数组只服务当前这一次执行下一轮 runCommand() 拿到的已经是空输入。连跑多条交互命令时每条执行前都要重新 setInputs()。设置过输入后runCommand()会自动把 interactive 模式打开命令真的会走到提问逻辑里。想看多步交互的完整用法参考 tests/Command/CommandTest.php 的testRunCommandWithInputs配合liipfunctionaltestbundle:test:interactive命令效果更直观。让 CI 日志干净关掉 ANSI 颜色装饰本地终端里颜色是加分项落到 CI 日志文件里ANSI 转义字符就是一串\033...乱码排查问题先被颜色码劝退。两种关法全局在 liip_functional_test 配置里加command_decoration: false默认true单条测试调isDecorated(false)public function testWithoutDecoration(): void { $this-isDecorated(false); $tester $this-runCommand(app:my-command); // 输出里不再有 ANSI 颜色转义字符 }CI 上建议直接走全局配置别指望每个测试都记得调一次isDecorated(false)。断言清单与两个容易踩的坑一条可靠的命令测试断言至少覆盖两个面getDisplay()拿到全部输出断言关键文案确实出现getStatusCode()拿退出码0代表命令跑成功任何非零值都意味着失败。只断言输出、不断言退出码命令以非零码退出却没人过问测试报告照样一片绿——这是命令行测试里最常见的假通过。坑基本都出在细节上。verbosity 的合法值只有quiet、normal、verbose、very_verbose、debug五个手滑拼错比如写成foobargetVerbosityLevel()会直接抛OutOfBoundsExceptiontestRunCommandVerbosityOutOfBound这个用例就是专门验证它的。交互输入那边setInputs()喂的内容一轮执行后清空别指望上一次的输入还能喂给下一条命令。遇到拿不准的行为最快路径是翻源码配置默认值看 [src/DependencyInjection/Configuration.php运行逻辑看 src/Test/WebTestCase.php断言写法参考 tests/Command/CommandTest.php。【免费下载链接】nuclei-templatesCommunity curated list of templates for the nuclei engine to find security vulnerabilities.项目地址: https://gitcode.com/GitHub_Trending/nu/nuclei-templates创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表