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-templatesLiipFunctionalTestBundle 是 Symfony 的功能测试辅助库核心能力是把命令行测试里new Application、启动内核、查找命令、接住输出这一整串样板代码收敛成一次runCommand()调用。你如果写 Symfony command test 时总觉得执行命令的部分比断言还长这篇文章按你在测试里真实会卡住的四个问题来讲每个问题都给你可落地的解法和验证方式。一行拉起命令runCommand 替代手动装配先说最基础的痛点。场景你新写了一个命令app:my-command想给它加一条回归测试。为什么难WebTestCase只帮你解决了 HTTP 那半边。命令侧你得自己拼new Application($kernel)、启动内核、注册命令、CommandTester-execute()、再接输出。四五个样板步骤而且每个测试类都要重复一遍。怎么解测试类继承Liip\FunctionalTestBundle\Test\WebTestCase然后直接调runCommand()。它把内核启动、命令查找、执行与结果捕获封装成一行返回一个CommandTester对象。核心实现在 src/Test/WebTestCase.php方法签名在该文件约第 90 至 126 行官方说明见doc/command.md。下面这个用例要验证两件事命令成功退出且输出里出现预期文本。use Liip\FunctionalTestBundle\Test\WebTestCase; class MyCommandTest extends WebTestCase { public function testMyCommand(): void { $tester $this-runCommand(app:my-command, [--force true]); $this-assertSame(0, $tester-getStatusCode()); $this-assertStringContainsString(Done!, $tester-getDisplay()); } }怎么验证写法没错看断言是否同时覆盖了退出码和输出内容而不是只查文本。另外注意runCommand()的第三个参数$reuseKernel——同一个测试里要执行多条命令时传true复用已启动的内核省掉重复启动的开销。命令中途要输入setInputs() 模拟键盘场景命令跑一半停下来问Continue? (yes/no)测试一跑就卡住或者默默走了默认分支。为什么难功能测试环境没有真实终端命令的交互问题没人回答。不处理的话要么挂起要么拿不到你想验证的分支。怎么解在执行前用setInputs()按顺序喂入输入。设置之后runCommand()会自动把interactive模式置为true命令就能读到这些输入了。下面这个用例验证的是输入 yes 后命令走了确认分支。public function testInteractiveCommand(): void { $this-setInputs([yes]); $tester $this-runCommand(app:confirm-command); $this-assertStringContainsString(confirmed, $tester-getDisplay()); }怎么验证断言输出确实反映了你输入的内容。一个容易踩的点输入在首次执行后会被清空下一次runCommand()调用回到默认值。所以模拟多轮交互时每轮执行前都要重新setInputs()别指望一次设置反复生效。参考实现可以翻tests/Command/CommandTest.php里的testRunCommandWithInputs方法配合 bundle 自带的liipfunctionaltestbundle:test:interactive命令理解行为。输出看不到关键信息verbosity 五级怎么选场景命令的详细信息只在-v及以上才打印而测试默认拿不到这些内容断言想查的细节根本不在输出里。为什么难runCommand()默认以normal详细级别执行。你需要调试信息时如果只能改测试代码逐条加参数很快就会烦。全局配置YAML 一处改所有命令测试生效在测试环境的配置文件config/packages/test/或老项目的app/config/config_test.yml里声明# config/packages/test/liip_functional_test.yaml liip_functional_test: command_verbosity: debug合法取值是quiet、normal、verbose、very_verbose、debug五个默认normal。配置节点定义在 src/DependencyInjection/Configuration.php。适合整个团队统一风格一次配置处处生效。单条测试覆盖setVerbosityLevel()只想让某一条测试开更详细的输出时在测试方法内设置即可public function testDebugOutput(): void { $this-setVerbosityLevel(debug); // 等价于 $this-verbosityLevel debug $tester $this-runCommand(app:my-command); $this-assertStringContainsString(debug detail, $tester-getDisplay()); }setVerbosityLevel()是WebTestCase的公开 API优先级高于全局配置。⚠️ 拼写要小心传入不支持的级别比如foobar时getVerbosityLevel()会抛OutOfBoundsException。项目自带的testRunCommandVerbosityOutOfBound测试就是专门验证这个异常行为的。五级对照quiet 到 debug 怎么挑级别配置值命令行等价写法你会看到什么适合什么时候用quiet—基本不输出只关心退出码不看任何文本normal—常规结果信息默认档多数断言够用verbose-v常规信息 额外说明需要过程性提示时very_verbose-vv更细粒度的日志排查中间步骤debug-vvv全部调试信息排障、断言细节输出怎么验证各级别的实际行为bundle 自带的liipfunctionaltestbundle:test命令在不同级别下会打印不同内容tests/Command/CommandTest.php中的testRunCommandVerbosityVerbose、testRunCommandVerbosityDebug等方法就是逐档断言的活例子照着读一遍比查文档快。断言假通过与 CI 乱码statusCode 和 command_decoration场景命令其实失败了但输出里恰好还有半句成功文本你的断言只看文本测试照样绿。换个环境CI 日志里还多出一堆看不懂的转义字符。为什么难只断言getDisplay()会漏掉命令悄悄失败不关装饰器时ANSI 颜色码混进日志排错时得先人肉过滤一遍。怎么解两条规则。退出码和输出一起断言。0是成功非零是失败这一条断言最能防假通过$tester $this-runCommand(app:report); $this-assertSame(0, $tester-getStatusCode()); $this-assertStringContainsString(Report generated, $tester-getDisplay());关掉输出装饰。全局方式liip_functional_test: command_decoration: false默认值是true。只针对单条测试时用isDecorated(false)即可效果是输出中不再包含 ANSI 颜色转义字符。CI 环境建议直接走全局配置一劳永逸。速查清单开写之前的决策表把前面所有决策点收拢成一张表开写测试前过一遍决策点选项建议详细级别的作用范围全局command_verbosity/ 单测setVerbosityLevel()团队统一走全局个别测试走单测覆盖详细级别取哪个quiet/normal/verbose/very_verbose/debug默认normal排障再升档别一律debug输出颜色装饰全局command_decoration: false/ 单测isDecorated(false)CI 一律关本地可开内核复用runCommand($cmd, $args, true)第三参传true同一测试内多次执行命令时开交互输入setInputs([...])每轮执行前重新设置用完即清空断言组合getStatusCode()getDisplay()两者都断言缺一不可核心实现、配置节点与示例测试分别在src/Test/WebTestCase.php、src/DependencyInjection/Configuration.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),仅供参考
返回列表