我正在尝试学习如何使用boost::test
的数据驱动测试功能。我怎么遇到了一个我认为与数据集(和样本)破坏相关的麻烦。以下面的代码片段为例:
#define BOOST_TEST_MODULE dataset_example68
#include <boost/test/included/unit_test.hpp>
#include <boost/test/data/test_case.hpp>
#include <boost/test/data/monomorphic.hpp>
#include <sstream>
#include <cstdio>
namespace bdata = boost::unit_test::data;
// Dataset generating a Fibonacci sequence
class fibonacci_dataset {
public:
// Samples type is int
using sample=int;
enum { arity = 1 };
struct iterator {
iterator() : a(1), b(1) {}
int operator*() const { return b; }
void operator++()
{
a = a + b;
std::swap(a, b);
}
private:
int a;
int b; // b is the output
};
fibonacci_dataset() {fprintf(stderr, "constructed %p\n", (void*)this);}
~fibonacci_dataset() {fprintf(stderr, "destructed %p\n", (void*)this);}
// size is infinite
bdata::size_t size() const { return bdata::BOOST_TEST_DS_INFINITE_SIZE; }
// iterator
iterator begin() const { return iterator(); }
};
namespace boost { namespace unit_test { namespace data { namespace monomorphic {
// registering fibonacci_dataset as a proper dataset
template <>
struct is_dataset<fibonacci_dataset> : boost::mpl::true_ {};
}}}}
// Creating a test-driven dataset
BOOST_DATA_TEST_CASE(
test1,
fibonacci_dataset() ^ bdata::make( { 1, 2, 3, 5, 8, 13, 21, 35, 56 } ),
fib_sample, exp)
{
BOOST_TEST(fib_sample == exp);
}
此代码段来自boost::test
的doc,我只在构造函数/析构函数中添加了fprintf(stderr,''')
。我在我的arch linux上编译并运行它(boost 1.63.0,gcc 6.3.1,编译选项-std = c ++ 14),输出如下:
constructed 0x7ffd69e66e3e
destructed 0x7ffd69e66de0
destructed 0x7ffd69e66e3d
destructed 0x7ffd69e66e3e
Running 9 test cases...
4.cpp(53): error: in "test1/_7": check fib_sample == exp has failed [34 != 35]
Failure occurred in a following context:
fib_sample = 34; exp = 35;
4.cpp(53): error: in "test1/_8": check fib_sample == exp has failed [55 != 56]
Failure occurred in a following context:
fib_sample = 55; exp = 56;
*** 2 failures are detected in the test module "dataset_example68"
我的问题是:
非常感谢你的帮助。
答案 0 :(得分:0)
地址0x7ffd69e66e3e
的第一个数据集是由于在
fibonacci_dataset() ^ bdata::make( { 1, 2, 3, 5, 8, 13, 21, 35, 56 } )
这是您使用默认构造函数看到的唯一一个。实际上移动了所有其他数据集。举例来说,operator^
意味着构建了班级boost::unit_test::data::monomorphic::zip
。
在初始化时(在输入main
之前),UTF声明调用BOOST_DATA_TEST_CASE
的{{1}}。这会为数据集的每个样本注册一个单元测试。单元测试直接保存样品。
一旦注册了所有单元测试,就不再需要保存数据集了。因此,在测试开始之前删除数据集是完全合理的。