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

时间:2010-09-24 11:34:27

标签: c++ boost boost-test

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

这是我试过的 -

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文件。

3 个答案:

答案 0 :(得分:5)

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

#include <boost/test/unit_test.hpp>
#include <string>
#include <fstream>

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不是Boost Documentation提供的答案中的静态成员,因为将logFile声明为静态成员导致错误生成的XML并且访问fixture结构不是线程 - 这样安全。

但是,Boost 1.44.0中似乎存在一个错误,如果logFile不是fixture结构的静态成员,也会导致生成错误的XML输出(可能与我提到的错误相同)之前)。 要解决此问题,需要在析构函数中关闭文件流以生成有效的XML之前使用行logFile << "</TestLog>" << std::flush;
感谢@Wracky(下面的评论)我将行logFile << "</TestLog>" << std::flush;替换为boost::unit_test::unit_test_log.test_finish();,这比手动编写标记更清晰。

注意:使用以下参数运行测试:--output_format=XML --log_level=all --report_level=no。 这样就可以将生成的XML文件与Steve TownsendxUnit plugin一起使用。

答案 1 :(得分:4)

你可以尝试这个替代方案,改编自here并据称可以使用Boost 1.34.1。这似乎更像是Boost的意图 - 请参阅结果流覆盖的使用。

//
// run_tests.cc
//

#define BOOST_AUTO_TEST_MAIN

#include <iostream>
#include <fstream>
#include <cassert>
#include <boost/test/auto_unit_test.hpp>
#include <boost/test/results_reporter.hpp>

std::ofstream ReportRedirector::out;

struct ReportRedirector
{
    ReportRedirector()
    {
        out.open("fileName.log");
        assert( out.is_open() );
        boost::unit_test::results_reporter::set_stream(out);
    }
private:
    static std::ofstream out;
};

BOOST_GLOBAL_FIXTURE(ReportRedirector)

答案 2 :(得分:4)

完整性:

如果您不想,您不必自行重定向输入。 您还可以通过命令行参数指定日志文件:

C:\MyTest.exe --log_sink=fileName.log

花了一会儿才发现。希望这有帮助!