gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:44:51 26 4
gpt4 key购买 nike

我知道默认情况下报告被定向到标准错误,所以必须将它重定向到一个文件。我的问题是我们应该在全局范围内这样做吗?这似乎对我不起作用。

这是我试过的-

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

最佳答案

使用 Boost 1.44.0(可能还有更高版本),您需要以下代码来创建一个全局夹具,该夹具将测试程序的输出重定向到一个以包含测试的主测试套件命名的文件(参见 Boost Documentation )

#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 不是 Steve Townsend 提供的答案中的静态成员,因为将 logFile 声明为静态成员会导致错误生成 XML,并且以这种方式访问​​夹具结构不是线程安全的。

但是,Boost 1.44.0 中似乎存在一个错误,如果 logFile 不是固定结构的静态成员(可能与我之前提到的错误相同),该错误也会导致生成不正确的 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 文件与 xUnit plugin 一起用于 continuous integration server Jenkins

关于c++ - 使用 BOOST.Test 在文件中生成测试报告的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3786639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com