【问题标题】:Pytest testing for class valuePytest 测试类值
【发布时间】:2020-04-25 23:43:05
【问题描述】:

在 python 中做一个二叉树的基本实现并使用 pytest 测试实现。单元测试之一是检查新节点是否正确插入到父节点的左侧(或右侧)。当我执行断言语句时,在 == 的左侧和右侧显示了正确的比较,但测试失败了。附上代码片段。

主要代码相关部分:

class Node:
    # Contains data variables.
    def __init__(self, val: Optional[int]=None) -> None:
        self.value: Optional[int] = val
        self.left: Optional[Node] = None
        self.right: Optional[Node] = None

    def __repr__(self):
        return f"{self.value}"

    def insert(self, data: int) -> bool:
        # Insert a node to the right or left of a parent node.
        # Return False only if trying to insert duplicate.

        if self.value == data:      # Duplicate found
            return False

        if self.value > data:       # New node to the left of parent node
            if self.left:           # If left exist, then recurse
                return self.left.insert(data)
            self.left = Node(data)  # Default, create a new left node
            return True
        else:
            if self.right:          # If right exist, then recurse
                return self.right.insert(data)
            self.right = Node(data) # Default, create a new right node
            return True

具体的pytest单元测试

def test_node_insert_left():
    node = Node(4)
    node.insert(3)
    #print(f"\n{node.left}-{node}-{node.right}")

    assert node.value == 4
    assert node.left == Node(3)             # I've also tried node.left == 3
    assert type(node.left) == type(Node())
    assert node.right == None

错误信息

> assert node.left == Node(3)
E       assert 3 == 3
E         -3
E         +3

【问题讨论】:

  • 如果您的节点的repr 是(例如)f'Node({self.value})',您的代码会更容易调试,这样您就可以将节点与其包含的内容区分开来。
  • 但是如果你想让两个节点显示为相等,你应该在你的 Node 类中实现__eq__

标签: python python-3.x pytest


【解决方案1】:

除非您在节点类中实现__eq__,否则两个节点将不相等。

您可以在Node 中编写__eq__ 方法:

def __eq__(self, other):
    if not isinstance(other, Node):
        return NotImplemented
    return self.value==other.value

如果您想将任何两个具有相同值的节点视为相等。

那么assert node.left == Node(3) 就可以了。

但是,由于节点包含的不仅仅是一个值,这可能并不理想。


更简单:

对于您的断言,您真正想要测试的是该节点的值是否为 3。为此,您可以简单地将断言更改为

assert node.left.value == 3

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多