如何在Eclipse CDT的单元测试支持中使用std :: cout?

时间:2013-03-15 12:54:09

标签: unit-testing eclipse-cdt

如果我在Eclipse CDT的简单单元测试中使用std :: cout,我会收到错误消息: “XML解析错误:prolog中不允许使用内容。”

但是,如果我删除带有“cout”消息的行,则测试运行正确。我打印到终端的调试消息似乎干扰了单元测试输出,因此Eclipse中的“C / C ++单元测试”窗口无法解析单元测试输出。

我的问题是,如果我的代码包含一些cout调试消息,如何在Eclipse的CDT中使用单元测试支持?单元测试输出是否可以发送到不同的位置(如临时文件),以便与打印到终端的cout / debug / log消息分开?

编辑: 例如,如果我使用http://www.boost.org/doc/libs/1_42_0/libs/test/doc/html/utf/user-guide/fixture/global.html中的示例25:

#define BOOST_TEST_MODULE example
#include <boost/test/included/unit_test.hpp>
#include <iostream>

//____________________________________________________________________________//

struct MyConfig {
    MyConfig()   { std::cout << "global setup\n"; }
    ~MyConfig()  { std::cout << "global teardown\n"; }
};

//____________________________________________________________________________//

BOOST_GLOBAL_FIXTURE( MyConfig );

BOOST_AUTO_TEST_CASE( test_case )
{
    BOOST_CHECK( true );
}

//____________________________________________________________________________//

然后我收到错误“XML解析错误:prolog中不允许内容。”在Eclipse中。这似乎是由Eclipse单元测试工具无法解析包含“全局设置”的输出引起的。所以问题是:在获取Eclipse的单元测试工具来解析消息并显示单元测试结果时,如何继续使用此示例和打印的调试消息?

2 个答案:

答案 0 :(得分:4)

Eclipse CDT&amp; amp; Boost.Test是通过std :: cout实现的,所以你的代码不应该在那里输出任何东西。你应该使用BOOST_MESSAGE或者打印到std :: cerr。

不幸的是,它是Boost.Test的限制,应该扩展它以实现您想要的功能。

答案 1 :(得分:0)

我克服了类似的问题,XML解析错误干扰了测试运行,有条件地将输出包装到带有CDATA标记的std :: cout进行单元测试构建:

#if defined(WRAP_XML_CDATA)
  output << "<![CDATA[";
#endif

...

#if defined(WRAP_XML_CDATA)
  output << "]]>";
#endif

这会阻止程序的输出被解析为XML。