如何使用 googletest 捕获 stdout/stderr?
使用 googletest 框架时是否可以捕获 stdout 和 stderr?
例如,我想调用一个将错误写入控制台(stderr)的函数。 现在,当在测试中调用该函数时,我想断言那里没有输出。
或者,也许我想测试错误行为,并想断言当我(故意)产生错误时会打印某个字符串。
Is it possible to capture the stdout and stderr when using the googletest framework?
For example, I would like to call a function that writes errors to the console (stderr).
Now, when calling the function in the tests, I want to assert that no output appears there.
Or, maybe I want to test the error behaviour and want to assert that a certain string gets printed when I (deliberately) produce an error.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
Googletest 为此提供了函数:
Googletest offers functions for this:
我之前曾在测试输出时使用此代码片段将 cout 调用重定向到字符串流。希望它能激发一些想法。我以前从未使用过 googletest。
在重定向回原始输出之前,请使用谷歌测试检查缓冲区中的输出。
I have used this snippet before to redirect cout calls to a stringstream when testing output. Hopefully it might spark some ideas. I've never used googletest before.
Before redirecting back to the original output use your google test to check the output in buffer.
避免这样做始终是一个好的设计理念。如果您确实想这样做,请执行以下操作:
要使用 stderr 而不是 stdout,请将 dup2 的第二个参数更改为 2。为了不通过文件进行捕获,您可以使用管道对。
Avoiding having to do this is always a good design idea. If you really want to do it the following works:
To use stderr instead of stdout change the second argument to dup2 to be 2. For capturing without going via a file you could use a pipe pair instead.
不要这样做,而是使用依赖项注入来删除对 std::cout 的直接使用。在您的测试代码中,使用
std:ostringstream
类的模拟对象作为模拟对象,而不是真正的std::cout
。所以代替这个:
有这个:
Rather than do this, use dependency injection to remove the direct use of
std::cout
. In your test code use a mock object of classstd:ostringstream
as a mock object instead of the realstd::cout
.So instead of this:
have this:
将 Wgaffa 的建议(我喜欢)放入 Google 测试装置中,人们可能会这样写:
Putting Wgaffa's suggestion (which I like) to a Google Test fixture, one might write:
根据 Wgaffa 的答案,我制作了这个辅助类,可以使用
std::cout
或std::cerr
构造:Based on the answer of Wgaffa I made this helper class which can be constructed with either
std::cout
orstd::cerr
:这是另一个实用程序类,它执行接受的答案建议的操作:
用法:
在 Godbolt 中运行
Here is a yet another utility class doing what the accepted answer suggests:
Usage:
Run in Godbolt
我们正在做的正是你所指的。
首先我们创建了一些宏:
请参阅此答案以捕获 stdout 和 stderr:
https://stackoverflow.com/a/5419409/9796918
只需使用它们的BeginCapture()、EndCapture() 代替我们的redirect() 和reset()。
在 AssertInfoMsgOutput 方法中:
现在,在单元测试中,只需将要捕获 stdout/stderr 的调用包装起来:
We are doing exactly what you are referring to.
First we created some macros:
See this answer for capturing stdout and stderr:
https://stackoverflow.com/a/5419409/9796918
Just use their BeginCapture(), EndCapture() in place of our redirect() and reset().
In the AssertInfoMsgOutput method:
Now in your unit test just wrap your calls that you want to capture stdout/stderr with: