单元测试移动/复制构造函数的策略?

时间:2015-07-29 14:16:57

标签: unit-testing c++11

我想编写单元测试来测试我正在编写的某些类的移动/复制构造函数/分配。我想确保资源得到适当处理,当我希望调用move ctor而不是copy ctor时调用它,反之亦然。

问题是我不想乱用类代码来测试它。那么,有没有办法从课外的测试代码中了解移动或复制ctors /赋值?

单元测试复制/移动ctors /赋值的一般策略是什么?

PD:我正在使用Catch单元测试框架,所以请提供一个可以在Catch中实现的答案。

1 个答案:

答案 0 :(得分:4)

我从未使用过Catch,因此无法提供一个有效的例子。

但是,我通过测试移动/复制的对象上的类方法,将复杂的复制/移动构造函数(例如涉及深层复制,std::unique_ptr等)单元测试。

例如,如果我有一个类如下:

// constructor
Foo::Foo(int i) : privateMember(i) {};

// some function that operates on this private member
int Foo::bar() { return privateMember + 5 };

我会对bar()方法进行测试,但是会为移动,复制等构造函数复制它。您可以轻松地完成原始测试的三到四次。

我没有公开成员变量。如果你这样做,你可以使用"是相同的"测试功能(假设Catch支持此功能)。例如,确保深层复制创建一个唯一的副本(即不会指向原始对象)。

<强>更新

您似乎更关心调用正确的移动或复制构造函数/赋值。如果您只是想要&#34;移动作业&#34;或其他一些标识符,我不知道该建议什么。

当我测试副本时,我确保在单元测试中复制对象,然后调用依赖于成员变量的浅/深副本的函数。当我测试移动时,这是相同的。在某些情况下,您可以对原始对象运行测试(例如,测试向量实例变量现在在移动后的大小为零)。

我按如下方式强制移动构造函数:

Foo foo{};
Foo bar(std::move(foo));

我按如下方式强制进行移动分配:

Foo foo{};
Foo bar{};
bar = std::move(foo);

我按如下方式强制复制构造函数:

Foo foo{};
Foo bar(foo);

我按如下方式强制进行复制分配:

Foo foo{};
Foo bar{};
bar = foo;

如果你真的需要这个,你可以从一些暴露枚举类字段的调试虚拟类继承。在调试版本中,字段将填充适当的枚举值(MoveConstructor)。此字段已公开,因此您可以在复制/移动后对其进行测试。确保在复制/移动构造函数/赋值方法中填充它。