c++ - 数据集(和样本)何时在 boost::test 中破坏?

标签 c++ boost boost-test

我正在尝试学习如何使用 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 的文档,我只在构造函数/析构函数中添加了 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"

我的问题是:

  1. 似乎数据集在测试用例开始之前就被破坏了 运行,有意义吗?(虽然没有在这个片段中演示,但似乎数据样本在测试用例开始运行之前就被破坏了,这有意义吗?)
  2. 我认为如果您声明一个构造函数,编译器不会隐式地为您生成一个默认构造函数。如果你声明一个析构函数,编译器不会为你隐式生成复制/移动运算符/构造函数,那么“另一个”数据集是如何构建的(从输出来看,有多个数据集被破坏了)?<

非常感谢您的帮助。

最佳答案

地址0x7ffd69e66e3e的第一个数据集是由于调用了它的构造函数而构建的

fibonacci_dataset() ^ bdata::make( { 1, 2, 3, 5, 8, 13, 21, 35, 56 } )

这是您使用默认构造函数看到的唯一一个。所有其他数据集实际上都被移动了。例如在 operator^ 中有这样一个 Action ,暗示类 boost::unit_test::data::monomorphic::zip 的构造。

在初始化时(在进入main 之前)UTF 声明BOOST_DATA_TEST_CASE 调用make_test_case_gen。这为数据集的每个样本注册了一个单元测试。单元测试直接持有样本。

一旦所有的单元测试都被注册,就没有必要再保留数据集了。因此,在测试开始之前删除数据集是非常有意义的。

关于c++ - 数据集(和样本)何时在 boost::test 中破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44151026/

相关文章:

c++ - quickfix sendToTarget 和持久性

c++ - 在 UML 中绘制智能指针

c++ - 我如何判断到目前为止是否有任何 BOOST_CHECK 测试失败?

c++ - Ubuntu - 链接 boost.python - fatal error : pyconfig cannot be found

c++ - 对 DLL 中的非导出类进行单元测试

c++ - Boost.Spirit 的单元测试

c++ - 在 C++ 中插入优先级队列时如何解决段错误

c++ - 管理生成文件中的依赖关系复杂性

c++ double 到字节数组

c++ - 如何检查 Linux 操作系统中使用的 C++ 版本?