【发布时间】: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