1

如果我在 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 的单元测试工具解析消息并显示单元测试结果的同时继续使用这个打印调试消息的示例?

4

2 回答 2

4

Eclipse CDT 和 Boost.Test 之间的通信是通过 std::cout 实现的,因此您的代码不应在那里输出任何其他内容。您应该改用 BOOST_MESSAGE 或打印到 std::cerr。

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

于 2013-03-24T09:46:14.990 回答
0

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

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

...

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

这会停止将程序的输出解析为 XML。

于 2013-09-13T11:37:59.263 回答