首页 > 解决方案 > 单元测试自定义 STL 兼容的容器和迭代器

问题描述

我刚刚为自定义容器实现了自定义迭代器类型。容器对 C++17 ReversibleContainer建模,其迭代器(const 和非 const)建模LegacyRandomAccessIterator

我的问题是;是否有某种内置的东西std可以用来测试容器及其迭代器是否都符合指定的命名要求,或者我是否必须自己编写所有测试(这对我来说大部分是可行的,但我d宁愿不重新发明轮子;而且我不确定我是否有足够的模板向导来真正彻底地证明例如类型等是正确的)?

诸如(我知道这是其中之一)之类的事情,例如来自以下操作语义operator <

custom_container::iterator a = ...;
custom_container::iterator b = ...;
assert((a < b) == (b - a > 0));

并且返回类型是正确的,等等,等等。


我已经设法找到了一些功能,例如<type_traits>有一些有用的实用程序,例如:

if (!std::is_copy_constructible<custom_container::iterator>::value)
   /* fail test */ ;

这至少对一些基本的命名需求是有好处的。

标签: c++unit-testingtestingstlc++17

解决方案


不,我们没有。

事实上,证明一个类型满足作为迭代器的所有要求不能在 C++ 中静态完成。

您可以静态测试类型是否正确,并且存在运算符等。但是这种语义无法在一般情况下得到证明(我认为由于赖斯定理,无论是在实践上还是理论上)。

我发现大多数需求在实践中都很容易检查(如果不那么容易自动化的话)。我发现的最常见的问题是,比输入迭代器更强的“遗留”迭代器必须具有它们返回引用和指针的实际支持持久数据;该数据不能存在于迭代器中,或者是临时/生成的。


推荐阅读