Каков наилучший способ создания отчета о тестировании в файле с помощью BOOST.Test? - PullRequest
3 голосов
/ 24 сентября 2010

Я знаю, что по умолчанию отчет направлен на стандартную ошибку, поэтому нужно перенаправить его в файл. Мой вопрос заключается в том, будем ли мы делать это в глобальном мире? Что, похоже, не работает для меня как-то.

Это то, что я пытался -

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 ]

5 голосов
/ 14 апреля 2011

В 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 .

4 голосов
/ 08 апреля 2014

Для полноты:

Вам не нужно перенаправлять ввод самостоятельно, если вы не хотите.Вы также можете указать лог-файл с помощью аргументов командной строки:

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

Мне понадобилось время, чтобы найти.Надеюсь, это поможет!

4 голосов
/ 24 сентября 2010

Вы можете попробовать этот вариант, адаптированный с здесь и предположительно работающий над 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)
...