我正在使用Eclipse CDT开发C ++代码。对于单元测试,我使用谷歌测试,我通过“C ++单元测试”插件集成到Eclipse中。当测试生成输出到stdout时,现在会出现问题,例如,如下例所示。
Test.cpp的:
#include <iostream>
#include <string>
#include "gtest/gtest.h"
TEST(TestSuite, TestCase) {
std::string s = "str";
std::cout << s;
ASSERT_STREQ(s.c_str(), s.c_str());
}
AllTest.cpp
#include "gtest/gtest.h"
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
在构建并运行合适的运行配置(“C / C ++单元”与“Google Tests Runner”)后,“C / C ++单元”选项卡顶部显示错误消息:“解析Google Test期间出现未知错误模块输出:意外的测试模块输出。“
当我在Eclipse中作为应用程序运行测试时,它会通过并且控制台显示正确的输出。测试也会通过插件传递,只要它们不生成任何输出(例如,将Test.cpp中的字符串更改为空字符串,std::string s = "";
)
是否有任何解决方法允许执行通过插件生成输出的测试?我知道我可以,例如,将输出写入ostream并在测试期间将其设置为流。但是,我更愿意在不对源代码进行任何更改的情况下进行测试。有什么想法吗?
我不习惯用C ++编程,所以非常感谢任何建议。
P.S。:我正在使用Eclipse Oxygen(4.7.0)。
答案 0 :(得分:0)
如果测试产生控制台输出,只要输出字符串以换行符结尾,显然这不是问题。如,
std::cout << "someoutput\n";
工作正常。
当有多个输出时,任何测试用例的最后一个输出都以换行符结束似乎就足够了:
std::cout << "someoutput1";
...
std::cout << "someoutput2\n";
请注意(至少截至目前),即使测试在两个输出之间失败,这仍然有效。这是因为在测试失败的情况下,gtest会产生一些额外的输出,而扩展显然只需要匹配其中的一部分。当然,这可能会停止使用gtest或Unit Testing扩展的任何更新。
无论如何,为了我的目的,可能还有其他人的这些限制是可以接受的。