如何将 Boost.Test 输出记录到 HRF 中的标准输出和 XML 中的文件?

问题描述 投票:0回答:2

我想启用将 Boost.Test 输出记录到 both stdout/sterr 和日志文件。

但是,我还希望标准输出日志记录采用 HumanReadableFormat,并且仅文件输出采用 XML 格式。

生成报告文件似乎已在here解决。 (官方文档

可以通过多种方式选择格式,但似乎只能选择 HRF 或 XML?


理由:

Jenkins 服务器上运行测试时,xUnit 插件 需要 log XML 输出(而不是 report XML 输出 -

log_level
report_level
)。

但是,当测试在服务器上运行时,进行中的日志输出(在 HRF 中)非常有价值,可以检测挂起的测试或快速手动检查测试当前的位置。因此,我想要一个正在进行的 HRF 日志用于测试,最后我需要一个包含 Boost.Test 的 <TestLog>...</TestLog> 输出(而不是

<TestResult>
输出)的 XML 文件。

请注意,我们通过 Boost.Test 运行单元测试和集成测试,因此其中一些测试运行时间相当长。

c++ unit-testing jenkins xunit boost-test
2个回答
3
投票

关键是要了解在 Boost.Test 中可以定制什么以及如何定制输出:

有两个日志区域,测试日志和测试结果,只有测试日志有用,因为测试结果即使在最高详细级别也只是一个摘要
  • Boost.Test 仅支持
  • one
  • 单个输出流进行输出,因此替换该输出流并不会立即有所帮助,尽管一个 can 使用 boost::iostream
    tee_filter
    来写入 stdout 和文件。
    上面没有帮助,因为 Boost.Test 也只使用 
  • one
  • sinlge 日志格式化程序 (unit_test_log_formatter),所以即使你可以将输出拆分为两个流,你仍然会遇到只有一种格式的问题。
    但是,日志格式化程序可以通过 
  • boost::unit_test::unit_test_log.set_formatter
  • 设置,这正是我正在做的。
    
    
    
  • 我在 HRF 格式化程序和 XML 格式化程序上提供了一个薄包装器,其中 HRF 格式化程序仅记录到默认流,而 XML 格式化程序写入自定义 XML 文件。

它似乎运行良好,但使用时需要您自担风险,因为这是相当新的,尚未在所有套件上运行。

#pragma once // Copyright (c) 2014 // This file is distributed under the // Boost Software License - Version 1.0 - August 17th, 2003 // (See http://www.boost.org/LICENSE_1_0.txt ) #include <boost/test/unit_test_log_formatter.hpp> #include <boost/test/output/compiler_log_formatter.hpp> #include <boost/test/output/xml_log_formatter.hpp> #include <fstream> namespace boost { namespace unit_test { namespace output { //! Log formatter for Boost.Test that outputs the logging output *both* //! to the standard HRF formatter (normal output stream ~ cout) *and* //! also to the XML formatter, but the XML is written to a report file. //! //! Usage: //! // Call in init_unit_test_suite: (this will override the --log_format parameter) //! boost::unit_test::unit_test_log.set_formatter( //! new boost::unit_test::output::dual_log_formatter(L"filename.xml") //! ); //! //! Note: Calling `boost::unit_test::unit_test_log.set_stream(...)` will change the stream for //! the HRF formatter used here. //! //! Note: Implemented in boost::unit_test::output for symmetry with existing formatter classes //! class dual_log_formatter : public unit_test_log_formatter { public: // Formatter interface void log_start(std::ostream& os, counter_t test_cases_amount) override { hrf_logger.log_start(os, test_cases_amount); xml_logger.log_start(xml_file, test_cases_amount); } void log_finish(std::ostream& os) override { hrf_logger.log_finish(os); xml_logger.log_finish(xml_file); } void log_build_info(std::ostream& os) override { hrf_logger.log_build_info(os); xml_logger.log_build_info(xml_file); } void test_unit_start(std::ostream& os, test_unit const& tu) override { hrf_logger.test_unit_start(os, tu); xml_logger.test_unit_start(xml_file, tu); } void test_unit_finish(std::ostream& os, test_unit const& tu, unsigned long elapsed) override { hrf_logger.test_unit_finish(os, tu, elapsed); xml_logger.test_unit_finish(xml_file, tu, elapsed); } void test_unit_skipped(std::ostream& os, test_unit const& tu) override { hrf_logger.test_unit_skipped(os, tu); xml_logger.test_unit_skipped(xml_file, tu); } void log_exception(std::ostream& os, log_checkpoint_data const& checkpoint_data, execution_exception const& ex) override { hrf_logger.log_exception(os, checkpoint_data, ex); xml_logger.log_exception(xml_file, checkpoint_data, ex); } void log_entry_start(std::ostream& os, log_entry_data const& entry_data, log_entry_types let) override { hrf_logger.log_entry_start(os, entry_data, let); xml_logger.log_entry_start(xml_file, entry_data, let); } using unit_test_log_formatter::log_entry_value; // bring base class functions into overload set void log_entry_value(std::ostream& os, const_string value) override { hrf_logger.log_entry_value(os, value); xml_logger.log_entry_value(xml_file, value); } void log_entry_finish(std::ostream& os) override { hrf_logger.log_entry_finish(os); xml_logger.log_entry_finish(xml_file); } dual_log_formatter(const wchar_t* xmlFilename) { // Note: Use char* on non-MSVC compilers xml_file.open(xmlFilename); } private: std::ofstream xml_file; compiler_log_formatter hrf_logger; xml_log_formatter xml_logger; }; } } }



0
投票
一个或多个记录器

。如果指定此参数,则其优先级高于 log_format、log_level 和 log_sink。 参数是可重复的:它可能在命令行中出现多次。可以使用分隔符“:”来指示一组记录器,这是通过环境变量重复记录器描述的唯一方法。

https://www.boost.org/doc/libs/1_84_0/libs/test/doc/html/boost_test/utf_reference/rt_param_reference/logger.html

© www.soinside.com 2019 - 2024. All rights reserved.