В 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, похоже, есть ошибка, которая также приводит к генерированию неверного вывода XML, если logFile
не является статическим членом структуры fixture (вероятно, та же ошибка, о которой я упоминал ранее).Чтобы исправить это, строка logFile << "</TestLog>" << std::flush;
необходима перед закрытием файлового потока в деструкторе для генерации корректного XML.
Благодаря @Wracky (комментарий ниже) я заменил строку logFile << "</TestLog>" << std::flush;
на boost::unit_test::unit_test_log.test_finish();
, которая являетсягораздо более чистое решение, чем запись тега вручную.
ПРИМЕЧАНИЕ: тесты выполняются со следующими параметрами: --output_format=XML --log_level=all --report_level=no
.Это позволяет использовать полученные XML-файлы с плагином xUnit для сервера непрерывной интеграции Jenkins .