可以用升压测试检查我的程序输出吗?
问题描述:
void f()
{
cout << "blah" << endl;
}
BOOST_AUTO_TEST_CASE(f)
{
f();
// This would be a beauty
// BOOST_CHECK_PROGRAM_OUTPUT_MATCH("blah");
}
答
是的,你可以通过重定向std::cout
为boost::test_tools::output_test_stream
,它提供了特殊的方法来比较输出做到这一点。为确保std::cout
始终可以正确恢复,可以使用自定义结构,如下例所示。
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include <boost/test/output_test_stream.hpp>
#include <iostream>
BOOST_AUTO_TEST_SUITE(TestSuite1)
struct cout_redirect {
cout_redirect(std::streambuf * new_buffer)
: old(std::cout.rdbuf(new_buffer))
{ }
~cout_redirect() {
std::cout.rdbuf(old);
}
private:
std::streambuf * old;
};
BOOST_AUTO_TEST_CASE(test1)
{
boost::test_tools::output_test_stream output;
{
cout_redirect guard(output.rdbuf());
std::cout << "Test" << std::endl;
}
BOOST_CHECK(output.is_equal("Test\n"));
}
BOOST_AUTO_TEST_SUITE_END()
答
我跟着@BjörnPollex的答案有些日子。但有一天,我发现没有必要这样做。只需使用boost::test_tools::output_test_stream
。
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
#include <boost/test/output_test_stream.hpp>
BOOST_AUTO_TEST_SUITE(TestSuite1)
BOOST_AUTO_TEST_CASE(test1)
{
boost::test_tools::output_test_stream output;
output << "Test";
BOOST_CHECK(output.is_equal("Test"));
}
BOOST_AUTO_TEST_SUITE_END()
欲了解更多信息,请阅读the official documentation。
美丽,Space_C0wb0y。那么让我们看看我是否能够看到发生了什么。在cout_redirect构造函数中,我们设置了cout流缓冲区来提升输出测试流缓冲区。我们保存旧的cout流缓冲区。无论从cout中写入什么,直到cout_redirect被销毁,实际上都会被写入增强流缓冲区。当cout_redirect被破坏时,我们将cout流缓冲区重置为其先前的值,并且我们有一个带有所有我们想要的程序输出的增强流缓冲区。 – rturrado 2011-03-23 13:06:58
@rturrado:的确如此。 – 2011-03-23 13:08:08
我想,我们也可以做的是将增强流缓冲区设置为cout流缓冲区。在这种情况下,我们仍然会在cout中获得输出,并且我们可以使用增强流来检查它。 – rturrado 2011-03-23 13:09:07