DoD*_*oDo 5 c++ google-chrome headless emscripten docker
我想在 docker 环境中使用 headless chrome 来运行编译为 Web 程序集的 C++ 测试。
我已确保我的测试可执行文件与--emrun
标志链接,以确保所有输出都发布到 emrun 服务器并打印到控制台(然后由 CTest 框架捕获)。
但是,当运行无头铬时
emrun --browser=chrome --browser_args="--no-sandbox --disable-gpu --use-gl=swiftshader --headless" ./MyTestExecutable.html --gtest_filter=MyTestFixture.myTest
Run Code Online (Sandbox Code Playgroud)
没有任何内容打印到输出中。但是,如果我将命令更改为
emrun --browser=chrome --browser_args="--no-sandbox --disable-gpu --use-gl=swiftshader --headless --remote-debugging-port=9222" ./MyTestExecutable.html --gtest_filter=MyTestFixture.myTest
Run Code Online (Sandbox Code Playgroud)
测试输出很高兴地打印到命令行,但如果输出超过 cca 9kB,则会被截断,这是它自己的问题 - 见下文。但是,chrome 调试会话保持挂起并使用端口 9222。我当前的解决方法是确保 CTest 框架中的每个单元测试都有自己独特的调试端口,并让 chrome 会话保持生成状态,直到容器停止 - docker 清理它们那就起来吧。这个解决方案很脏,我不喜欢它。
--remote-debugging-port
我想知道是否有人知道如果没有提供给 Chrome,为什么 emrun 服务器不会打印任何内容?
我的预感是,chrome 在完成执行后会停止向 emrun 服务器发送数据,并且启用调试会以某种方式减慢 chrome 的速度,从而为至少一些输出发送到 emrun 服务器腾出时间(这也解释了大输出大小的截断) 。
我还去查看了 Emscripten 人员如何运行他们的 CI 测试,发现他们在 Xvfb 下使用完整的 chrome,而不是 headless chrome。我也尝试过,但是,这导致了一些其他问题,例如如果在容器内运行但不是以 root 用户身份运行,则 chrome 会因 SIGTRAP 崩溃,而 Jenkins 的 docker 插件以用户模式运行所有容器(即,您不是 root 用户)在容器内 - 理论上我可以让 Jenkins 以 root 身份运行容器,但这会导致其他我不希望出现的问题)。
除此之外,在 Xvfb 下的 chrome 中,日志截断仍然存在,所以这对我来说仍然是个问题。
最后,我尝试使用 Firefox 进行测试,它有点工作,但行为很奇怪:
emrun --browser=firefox --browser_args="--headless" ./MyTestExecutable.html --gtest_filter=MyTestFixture.myTest
Run Code Online (Sandbox Code Playgroud)
工作正常并且输出没有被截断。但是,再次运行相同的命令会失败并启动 emrun 服务器,因为它默认侦听的端口 (6931) 正在使用中。这很奇怪,因为 emrun 服务器没有在输出中列出ps
,但有几个服务器在输出firefox-bin
中列出,这表明 Firefox 在 emrun 进程完成后一直挂起,更奇怪的是,终止这些进程会使端口 6931 再次释放。因此,Firefox 似乎以某种方式“捕获”了 emrun 服务器正在侦听的端口的所有权。我真的不知道这怎么可能。
所以,我的问题是如何使 emrun 与 Headless chrome 很好地配合,以及为什么在使用 chrome 时应用程序输出会被截断?我的测试框架需要应用程序的整个输出来确定测试是否通过或失败,而对于具有大量输出的测试,目前 Chrome 无法实现这一点。
你有什么经历?如果您曾经使用 Emscripten 将您的 C++ 应用程序移植到 Web,您是如何设置 CI 环境的?
到目前为止我能想到的最好的解决方案是:
emrun --browser=chrome --hostname=localhost --kill_exit --browser_args="--headless --remote-debugging-port=0 --disable-gpu --disable-software-rasterizer" web/index.html
Run Code Online (Sandbox Code Playgroud)
指定端口 0 似乎可以修复控制台输出,同时分配一个随机端口号,因此您不必在测试框架中为此烦恼。
归档时间: |
|
查看次数: |
408 次 |
最近记录: |