【问题标题】:Boost Test run function on failureBoost 失败时的试运行功能
【发布时间】:2021-12-28 13:18:54
【问题描述】:

我有许多依赖于随机程序的测试。测试失败的情况很少见,因为您基本上对随机数不走运。

但是,有时失败实际上是一个错误,我想重现它。我有一个全局随机生成器,可以为其他所有东西播种。我希望 Boost Test 输出其原始种子,以防任何测试用例失败。

我发现最接近的是将原始种子输出到 Fixture 中,但似乎我必须一直打印它,而不仅仅是失败。如果任何测试失败,是否有一种简单、简洁的方式来打印语句?

【问题讨论】:

    标签: c++ boost-test


    【解决方案1】:

    我想我设法找到了一个解决方案,我使用访问者(this answer 提供)来确定是否所有测试用例都已通过,如果没有则打印我需要的信息。

    struct SeedPrinter {
        struct AllPassVisitor : boost::unit_test::test_tree_visitor {
            bool passed = true;
    
            void visit( boost::unit_test::test_case const& test ) {
                passed &= boost::unit_test::results_collector.results(test.p_id).passed();
            }
        };
    
        ~SeedPrinter() {
            namespace ut = boost::unit_test;
    
            // Check whether we have passed all tests.
            AllPassVisitor v;
            ut::traverse_test_tree(ut::framework::master_test_suite(), v);
    
            // If not, print the global seed to reproduce errors.
            if (!v.passed)
                BOOST_CHECK_MESSAGE(false, "PRINT MY INFO");
        }
    };
    
    BOOST_TEST_GLOBAL_FIXTURE(SeedPrinter);
    

    请注意,我使用BOOST_CHECK_MESSAGE 进行打印,因为除非指定--log_level=message,否则BOOST_TEST_MESSAGE 不会出现在输出中。

    如果有人能找到更好的解决方案,我会全力以赴 :)

    【讨论】:

      【解决方案2】:

      将您的测试包含在 BOOST_TEST_CONTEXT 中。例如:

      BOOST_AUTO_TEST_CASE( TestSeed )
      {
          int seed = getSeed();
          BOOST_TEST_CONTEXT( "seed value is " << seed )
          {
              // BOOST_CHECK() statements, etc., that sometimes fail
          }
      }
      

      这将在测试失败时输出种子值。

      【讨论】:

      • 谢谢。我的主要问题是我必须为每一个测试都做它,而我正在寻找更“全球”的东西。不过,这是一个不错的选择。
      猜你喜欢
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      相关资源
      最近更新 更多