2010-09-24 3 views
3

Я знаю, что отчет по умолчанию направлен на стандартную ошибку, поэтому нужно перенаправить его в файл. Вопрос в том, должен ли мы сделать это внутри глобального светильника? Кажется, что это не работает для меня каким-то образом.Каков лучший способ генерировать тестовый отчет в файле с помощью 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 создается с заданным именем.

ответ

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) 
+0

Почему 'out' должен быть объявлен как' static'? – Hemant

+1

Я не вижу причин, по которым нестатические могут сбой здесь, но это версия, которая должна была быть протестирована, по информации в ссылке. –

5

с усилением 1.44.0 (и, возможно, более поздних версий), Вам необходимо следующий код, чтобы создать глобальный прибор, который перенаправляет вывод тестовой программы в файл с именем после того, как мастер TestSuite, в которую включен тест (см 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 не является статическим членом структуры прибора (вероятно, такая же ошибка, о которой я упоминал ранее). Чтобы исправить это, необходимо, чтобы строка logFile << "</TestLog>" << std::flush; была необходима, прежде чем закрывать поток filestream в деструкторе для генерации действительного 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 plugin для continuous integration server Jenkins.

+0

Это не работает с отчетами, к сожалению. Мне нужна командная строка «--report_format = XML --report_level = detail» для работы с QuickBuild, но ни один из результатов не появляется в XML-файле. – Cthutu

+1

У меня была та же проблема с последним тегом, который там не был. Я подумал, что, поскольку это мой собственный поток вывода, я должен сказать, что тест более чем какой-то. И похоже, что существует такая функция. Если я могу добавить это: 'unit_test_log.test_finish(); ' к коду, как раз перед закрытием файла журнала, я получаю тег в своем выпуске. Надеюсь, это поможет. – Wracky

+0

Спасибо за подсказку @Wracky. Я определенно попробую это и обновить ответ, если он сработает для меня. – MKroehnert

3

Для Полнота:

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

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

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