测试有关删除列表中节点的信息

时间:2018-07-03 10:46:55

标签: c++ unit-testing automated-tests

我实现了一个双向链接的循环列表,我确实想编写测试。

因此,在此列表中,有一个删除运算符,我想检查其是否正常运行。我将一个迭代器保存到一个节点,然后删除了该节点,现在我想验证该迭代器是否指向不再存在的对象。 如何编写测试以验证这一点? 在搜索网络时,我发现了一些关于Boost库和测试库的信息。 下面是我所说的一个最小的例子。

#include<iostream>
struct Node{
    Node* back;
    Node* front;
    int data;
}Node;

int main(int argc, char* argv[])
{
    Node* a = new Node;
    Node* b = a;
    delete a;

    //HOW TO CHECK IF THE NODE THAT I ALLOCATED, HAVE BEEN DELETED?
}

3 个答案:

答案 0 :(得分:0)

单元测试主要由三个部分组成;安排,行动和断言。

  • 安排部分中,创建列表。
  • Act 部分中,您将使用删除运算符
  • 声明部分中,您将结果与期望值进行比较。

我最喜欢的C ++单元测试框架是Google Test,您可以找到有关该框架的非常好的教程here

答案 1 :(得分:0)

通常,访问无效的迭代器将是不确定的行为,或者至少在使用标准库容器时会出现。

除非您的容器具有某些特定的附加功能来跟踪迭代器是否仍然有效,否则我建议您使用其他方法来确保节点已被删除,例如通过测试删除之前和之后的节点节点现在指向彼此,而不是指向已删除的节点。

如果您想实际测试该节点已被释放,并且包含该节点的内存没有泄漏,那么我个人将通过在Valgrind下运行整个测试套件来做到这一点。如果您尝试访问超出范围的内存,泄漏内存,尝试双重释放等等,这将跟踪内存分配并发出警告。

可以将Valgrind配置为生成XML输出,因此您可以让测试运行程序在Valgrind下运行测试,并自动解析输出以确保不发生泄漏或其他违规情况。即使您找到了一种不用Valgrind来测试此特定情况的方法,也总是要确保测试套件在Valgrind下运行时不会产生任何错误,以捕捉可能犯的任何其他错误,这总是一个好主意。

答案 2 :(得分:0)

在删除对象之前,您可以故意对其进行垃圾桶或标记,以使它们的继续使用会迅速出错。这并不是真正的测试工具,而是用于快速查找错误,而不是等待损坏最终导致崩溃的原因。例如,您可以将一个对象清零。因此,在双向链接列表中,您删除了对象的前向/后向链接,如果您对该链接进行了不适当的保留,则该链接将被废弃。 (如果使用指针,则它可以为null。如果使用索引,则可能希望用0xFF填充该对象)。如果您真正释放了已删除的项目,则该项目可能已被重用。但是我想您可以在进行任何进一步分配之前运行此测试。对于调试,如果将垃圾内容留在发行版本中,则由您选择。除非您的动态列表构建受到性能限制,否则我将保留它。因此,它也可以在测试中使用。尽管我不确定我会一直推荐这种类型的测试。对我来说,创建项目列表并删除并检查其是否删除就足够了。我也将添加泄漏测试,以重复执行多次删除等任务,并期望内存不会泄漏。