当前位置:  开发笔记 > 编程语言 > 正文

使用BOOST.Test在文件中生成测试报告的更好方法是什么?

如何解决《使用BOOST.Test在文件中生成测试报告的更好方法是什么?》经验,为你挑选了1个好方法。

我知道默认情况下报告是针对标准错误的,因此必须将其重定向到文件.我的问题是我们是否应该在全球范围内进行此操作?这对我来说似乎并没有起作用.

这是我试过的 -

struct MyConfig
{
 MyConfig()
  : testReport("fileName.log")
  {
    if(!testReport.fail())
     original = std::cerr.rdbuf(testReport.rdbuf());
  }
  ~MyConfig()
    {        
        cerr.rdbuf(original);        
        testReport.close();
    }
    ofstream testReport;
    streambuf* original;

 };

 BOOST_GLOBAL_FIXTURE(MyConfig);

运行测试后,仅在控制台上报告输出,尽管使用给定名称创建了0kb文件.



1> MKroehnert..:

使用Boost 1.44.0(以及更高版本),您需要以下代码来创建一个全局fixture,它将测试程序的输出重定向到以包含测试的主测试套件命名的文件(请参阅Boost文档)

#include 
#include 
#include 

struct LogToFile
{
    LogToFile()
    {
        std::string logFileName(boost::unit_test::framework::master_test_suite().p_name);
        logFileName.append(".xml");
        logFile.open(logFileName.c_str());
        boost::unit_test::unit_test_log.set_stream(logFile);
    }
    ~LogToFile()
    {
        boost::unit_test::unit_test_log.test_finish();
        logFile.close();
        boost::unit_test::unit_test_log.set_stream(std::cout);
    }
    std::ofstream logFile;
};

BOOST_GLOBAL_FIXTURE(LogToFile);

在这个例子logFile中不是像Steve Townsend提供的答案中的静态成员,因为声明logFile为静态成员导致错误生成的XML并且访问fixture结构不是这种方式的线程安全.

但是,Boost 1.44.0中似乎存在一个错误,如果logFile它不是fixture结构的静态成员(也可能是我之前提到的相同错误),也会导致生成错误的XML输出.要解决此问题,logFile << "" << std::flush;需要在析构函数中关闭文件流之前生成有效的XML.
由于@Wracky(评论如下)我取代了线logFile << "" << std::flush;boost::unit_test::unit_test_log.test_finish();比手动编写的标签更清洁的解决方案.

注意:测试使用以下参数运行: --output_format=XML --log_level=all --report_level=no.这样就可以将生成的XML文件与xUnit插件一起用于持续集成服务器Jenkins.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有