c++ - 对二叉搜索树进行单元测试

标签 c++ unit-testing c++11 testing tree

<分区>

假设您有这个二叉搜索树 (BST)。请参阅下面的代码。属性:

  • 节点的左子树只包含键小于节点键的节点。

  • 节点的右子树仅包含键大于节点键的节点。

  • 左子树和右子树也必须是二叉搜索树。

您将如何对其进行单元测试?您无法访问节点,也无法验证结构。您不能单独测试 Insert 函数。

1) 您可以从 BST 创建一个继承的测试类,并声明额外的方法来进行测试。这常见吗?

2) 以不同的方式实现 BST。有一个树类。此类可以访问子节点等并实现基本的树功能。从 Tree 继承 BST。借助Tree提供的方法测试BST。

3) 你的意见?

谢谢。

template <typename ValueType>
class BinarySearchTree
{
public:

    BinarySearchTree() : m_count(0), m_root(nullptr) {}
    void Insert(const ValueType& elementToInsert);
    bool Remove(const ValueType& elementToRemove);
    bool Contains(const ValueType& elementToFind);
    bool IsEmpty() const;
    size_t Count() const;
    ValueType Max() const;
    ValueType Min() const;
    int Delimiter() const;
    void PrintToFile(std::ofstream& outFile);
    void BuildFromFile(std::ifstream& inFile);
    ~BinarySearchTree() { delete m_root; }
    // TODO: copy ctr, copy assignment operator, move ctr

private:

    struct Node
    {
        Node(const ValueType& value) : value(value), parent(nullptr), left(nullptr), right(nullptr) {}
        ~Node() { delete left; delete right; }
        // TODO: copy ctr, copy assignment operator, move ctr

        ValueType value;
        Node* parent;
        Node* left;
        Node* right;
    };

    Node* m_root;
    int m_count;
};

最佳答案

按照常见的 STL 实现,我会将您的 BinarySearchTree 类拆分为不同的组件:

  • 一些仅适用于节点的二叉树类。让我们将其命名为 BinaryTree。它支持 Node * 的插入和删除、遍历(beginend)和有用的树操作(如 rotate用于平衡树)。但它不会分配任何东西或找到任何东西(没有已知的 ValueType)。

  • 保证 log(n) 深度的特定二叉树版本。我们称它为 AVLTree(您也可以使用红黑色或其他名称)。这棵树知道 ValueType 并将实现诸如 find 和插入/删除值的方法(包括内存管理)。它还将根据存储的值进行平衡。

(最重要的是,您可以像 STL 那样构建类似 setmap 的东西。)

测试的好处:

BinaryTree 类将在树中使用的 Node 类型中进行模板化(出于性能原因,基于多态 virtual 方法进行模板化) .因此,对于单元测试,您可以使用不同类型的 Nodes 构建一个 BinaryTree。这些特殊类型的节点可以为您的测试维护额外的信息(例如计数器)(例如,在某些操作期间,左 child 最多更改一次)。

另一方面,AVLTree 只能根据值进行测试,例如。插入后可以找到一些值。这与原始 BinarySearchTree 基本相同。我建议添加一些测试方法(例如 verify_invariants)来迭代完整的树并检查所有不变量(例如 log(n) depth,father of child of节点是节点)。这可能成本高且速度慢,但应仅用于单元测试。


结束语:如果您为自己编写树/作业 - 很好!另一方面,如果这应该在“真实”世界的某个地方使用,强烈考虑改用 STL 容器。

关于c++ - 对二叉搜索树进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40502021/

相关文章:

php - 使用编译代码和 PHP 加速器提高性能之间的差异

java - JNI native : java. lang.UnsatisfiedLinkError : no HelloWorld in java. 库.path

c++ - 为什么 MSVC 在寄存器中返回一个小结构时不必要地使用堆栈?

c# - 单元测试中的元素在完成后仍待处理

java - 如何在 JUNIT4.7 中断言用户定义的异常

c++ - 在 C++ 中创建和实现类

windows - DirectX 11 视频播放

c++ - 复制构造函数产生访问冲突后的 flann::Index 的析构函数

typescript - 在 TypeScript 中进行单元测试时, stub 依赖项的正确方法是什么?

c++ - 如何根据可变参数模板的大小自动填充 std::array?