【问题标题】:Hide cerr output during BOOST_CHECK_EQUAL在 BOOST_CHECK_EQUAL 期间隐藏 cerr 输出
【发布时间】:2014-07-07 19:45:07
【问题描述】:

我正在测试一个返回整数错误代码的函数。我正在使用BOOST_CHECK_EQUAL 来比较函数返回的错误代码。类似这样:

BOOST_CHECK_EQUAL( foo(a), 12 ) // where 12 is an error code

函数foo 中有一个cerr 语句,将在返回错误代码之前触发。有什么办法可以隐藏错误信息吗?目前我的输出是这样的:

Running 7 test cases...
Error in foo()

*** No errors detected

但是我想要

Running 7 test cases...

*** No Errors detected

有没有办法在一个测试中使用相当于2>/dev/null 的方法来运行这个测试?提前谢谢。

【问题讨论】:

    标签: c++ unit-testing boost boost-test


    【解决方案1】:

    一种选择是将返回值保存在变量中,以便在检查之前触发副作用:

    auto result = foo(a);
    BOOST_CHECK_EQUAL(result, 12)
    

    另一个隐藏输出的方法是将std::cerr的缓冲区更改为写入dev/null

    namespace ns {
        struct defer_output_wrapper
        {
            defer_output_wrapper(std::ostream& os) : os(os), sbuf(os.rdbuf())
            {
                os.rdbuf(null.open("dev/null", std::ios_base::out));
            }
    
            ~defer_output_wrapper() { os.rdbuf(sbuf); }
        private:
            std::ostream& os;
            std::streambuf* sbuf;
            std::filebuf null;
        };
    }
    

    稍后...

    {
        ns::defer_output_wrapper _(std::cerr); // Output on std::cerr writes to dev/null
        BOOST_CHECK_EQUAL(foo(a), 12)
    } // buffer changes back
    

    【讨论】:

    • 我希望完全不显示错误,所以第一个建议不会很好。 (这是一个非常大的程序,有很多测试用例,我不希望成功时输出。)我可以使用你的第二个解决方案,因为我正在使用记录器,并且可以在检查之前更改输出优先级,然后在之后恢复它。我只是想知道是否有一种提升测试原生的方式来做到这一点。在测试时想要隐藏输出似乎应该是一件常见的事情。我在上面找不到任何谷歌结果,所以一定不是。
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2020-06-10
    相关资源
    最近更新 更多