【问题标题】:Unit testing custom STL-compatible containers and iterators单元测试自定义 STL 兼容的容器和迭代器
【发布时间】:2021-03-28 16:53:33
【问题描述】:

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

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

诸如(我知道这是其中之一)之类的东西,例如这来自operator <的操作语义:

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

而且返回类型是正确的等等等等。


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

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

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

【问题讨论】:

  • 没有真正回答您的问题,但请注意 assert((it -= n) == (it += -n)) 实际上不会起作用。意思是,如果迭代器被正确实现,测试将失败,因为它正在比较 it - nit - 2*n
  • @IgorTandetnik 哎呀;让我清理一下。谢谢。
  • @IgorTandetnik 什么?该测试是虚假的,但出于不同的原因:两个复合赋值都返回对 it 的引用,并且迭代器应该是自相等的。
  • @Deduplicator True。出于某种原因,我认为它会返回一个值。
  • 但是如果您在没有咖啡的情况下进行测试,那么您就没有正确模拟真实世界的条件。

标签: c++ unit-testing testing stl c++17


【解决方案1】:

不,我们没有。

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 2021-09-15
    • 2013-02-17
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多