我的Python单元测试中AssertEqual和AssertNotEqual均失败

问题描述

我在二叉树上有以下测试代码

def test_deleteMin_root(self):
    btree = BinaryTree()
    min_value = self.person('AAKVIK','ANNE-MARIT','RISØYVEGEN 17','1705','SARPSBORG')
    node = BinaryTreeNode(min_value)
    btree.insert(value = min_value)
    btree.insert(value = self.person('Zero','Zero','Zero street','1234','ZeroCity'))
    btree.deleteMin()
    self.assertEqual(node,btree.findMin())

我得到这个失败结果:

======================================================================
FAIL: test_deleteMin_root (__main__.BinaryTreeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\abdka\Documents\Programs\Python\PythonExercises\aicourse\test_binarytree.py",line 47,in test_deleteMin_root
    self.assertEqual(node,btree.findMin())
AssertionError: <BinaryTreeNode.BinaryTreeNode object at 0x000001C7E33EFA00> != <BinaryTreeNode.BinaryTreeNode object at 0x000001C7EAB5A6D0>

当我在测试代码的最后一行中将AssertEqual更改为AssertNotEqual时(这是我唯一更改的内容):

def test_deleteMin_root(self):
    btree = BinaryTree()
    min_value = self.person('AAKVIK','ZeroCity'))
    btree.deleteMin()
    self.assertNotEqual(node,btree.findMin())

我失败了:

======================================================================
FAIL: test_deleteMin_root (__main__.BinaryTreeTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\abdka\Documents\Programs\Python\PythonExercises\aicourse\test_binarytree.py",in test_deleteMin_root
    self.assertNotEqual(node,btree.findMin())
AssertionError: <BinaryTreeNode.BinaryTreeNode object at 0x000001C7EE3D4F10> == <BinaryTreeNode.BinaryTreeNode object at 0x000001C7E5DCAA00>

当我断言相等时,它表示它们不相等;当我断言不相等时,它表示它们是相等的。我不明白这是什么错误?我该如何解决

这是完整的测试代码,BinaryTree代码和BinaryTreeNode代码

二叉树代码

from BinaryTreeNode import BinaryTreeNode

class BinaryTree:    
    def __init__(self,data = None):
        self._root = None
        if isinstance(data,BinaryTreeNode):
            self._root = data

    def findLeftMost(self,treenode):
        left = treenode.left
        if left == None:
            return treenode
        return self.findLeftMost(left)
    
    def findMin(self):
        return self.findLeftMost(self._root)
        
    def findRightMost(self,treenode):
        right = treenode.right
        if right == None:
            return treenode
        return self.findRightMost(right)
    
    def findMax(self):
        return self.findRightMost(self._root)
    
    def find(self,key,treenode = None):
        if treenode == None:
            treenode = self._root
        if treenode == None:
            return None
        elif treenode.value > key:
            if treenode.left:
                return self.find(key,treenode.left)
        elif treenode.value < key:
            if treenode.right:
                return self.find(key,treenode.right)
        elif treenode.value == key:
            return treenode
        else:
            raise KeyError("Key not found")
       
    def _getnodes(self,current = None,treenode = None,value = None):
        if current != None and treenode != None:
            return current,treenode
        if value == None:
            if treenode == None:
                raise Exception("Attempt to insert an empty space into Binary Tree")
            else:
                if treenode.value == None:
                    raise Exception("Attempt to insert an Node into Binary Tree with no key value")
        else:
            if treenode != None:
                if treenode.value != None:
                    raise Exception("Key inconsistency detected")
            else:
                treenode = BinaryTreeNode(value)
        if current == None:
            current = self._root
        return current,treenode
    
    def insert(self,value = None):
        if current == None:
            current = self._root
        # Checking consistency ...
        current,treenode = self._getnodes(current,treenode,value)
        if current != None:
            if treenode.value < current.value:
                treenode.level += 1
                if current.left is None:
                    current.left = treenode
                else:
                    self.insert(current.left,treenode)
            elif treenode.value > current.value:
                treenode.level += 1
                if current.right is None:
                    current.right = treenode
                else:
                    self.insert(current.right,treenode)
            else:
                if self._root == None:
                    treenode.level = 0
                    self._root = treenode
                else:
                    raise Exception("Duplicate key: " + treenode.value)
        else: # If empty tree,the first node entered is the root
            self._root = treenode
        return treenode

    def deleteMin(self):
        parent = self._root
        while True:
            # If a left branch exists - find the smallest item
            current = parent.left
            if current:
                if current.left == None:
                    if current.right != None:
                        parent.left = current.right
                        return current
                    else:
                        parent.left = None
                        return current                  
                else:
                    parent = current
            # If no left branch exists,the root item is the smallest in the tree
            else:
                self._root = parent.right
                return self._root
    
    def deleteMax(self):
        parent = self._root            
        while True:
            current = parent.right
            if current.right == None:
                if current.left != None:
                    parent.right = current.left
                    return current
                else:
                    parent.right = None
                    return current                   
            else:
                parent = current
        
    def delete(self,key):
        node = self.find(key)
        delnode = node
        if not node.left and not node.right:
            node = None
        elif node.right:
            temptree = BinaryTree(node.right)
            mintempnode = temptree.deleteMin()
            node.value = mintempnode.value
        elif node.left:
            node = node.left  
        return delnode

二叉树节点代码

class BinaryTreeNode:
    def __init__(self,value,lefttree = None,righttree = None):
        self.value = value      
        self.left = lefttree
        self.right = righttree
        self.level = 0

    # Bruker setter/getters
    @property
    def value(self):
        return self.__value
    
    @value.setter
    def value(self,value):
        self.__value = value
    
    @property
    def left(self):
        return self.__left 
    
    @left.setter
    def left(self,lefttree):
        self.__left = lefttree 
   
    @property
    def right(self):
        return self.__right        
    
    @right.setter
    def right(self,righttree):
        self.__right = righttree 

    @property
    def level(self):
        return self.__level
    
    @level.setter
    def level(self,level):
        self.__level = level
    
    def __str__(self):
        return self.value
    
    def hasRight(self):
        if self.right == None:
            return False
        return True
        #return self.right != None            
    
    def hasLeft(self):
        if self.left == None:
            return False
        return True
        #return self.left != None
    
    def prefixOrder(self):
        print(str(self.value),' ')
        if self.hasLeft():
            self.left.prefixOrder()
        if self.hasRight():
            self.right.prefixOrder()
        
    def infixOrder(self):
        if self.hasLeft():
            self.left.infixOrder()
        print(str(self.value),' ')
        if self.hasRight():
            self.right.infixOrder()
        
    def postfixOrder(self):
        if self.hasLeft():
            self.left.postfixOrder()
        if self.hasRight():
            self.right.postfixOrder()
        print(str(self.value),' ')
        
    def levelOrder(self):
        from queue import SimpleQueue
        FIFOQueue = SimpleQueue()
        FIFOQueue.put(self)
        self.levelOrderEntry(FIFOQueue)
        while not FIFOQueue.empty():
            node = FIFOQueue.get()
            print(str(node.value),' ')
                
    def levelOrderEntry(self,queue):
        if queue.empty():
            return
        node = queue.get()
        print(str(node.value),' ')
        if node.hasLeft():
            queue.put(node.left)
        if node.hasRight():
            queue.put(node.right)
        if node.hasLeft() or node.hasRight:
            self.levelOrderEntry(queue)            

    def __eq__(self,other):   
        if other != None:
            return self.value == other.value
        elif other == None and self.value == None:
            return True
        return False

    def __ne__(self,other):
        if other != None:
            if self.value == None:
                return False
            else:
                return not self.value != other.value
        return True
        
    def __lt__(self,other):
        if other != None:
            return self.value < other.value
        elif other == None and self.value == None:
            return False
        return False
    
    def __le__(self,other):
        if other != None:
            return self.value <= other.value
        elif other == None and self.value == None:
            return False
        return False
               
    def __gt__(self,other):
        if other != None:
            return self.value > other.value
        elif other == None and self.value == None:
            return False
        return False
    
    def __ge__(self,other):
        if other != None:
            return self.value >= other.value
        elif other == None and self.value == None:
            return False
        return False

完整的测试代码

import unittest
from BinaryTree import BinaryTree
from BinaryTreeNode import BinaryTreeNode
from collections import namedtuple

class BinaryTreeTest(unittest.TestCase):
    def setUp(self):
        self.person = namedtuple('person',['lastname','firstname','address','postalcode','city'])
        persons_file = open("Personer-kort.dta",'r')
        content = persons_file.read()
        content = content.splitlines()
        self.binarytree = BinaryTree()   
        for p in content:
            self.binarytree.insert(value = self.person(*p.split(';')))
        persons_file.close()
    
        
    def test_findMin(self):
        min_value = self.person('AAKVIK','ANETTE','BAKLIEN 11','1360','nesBRU')
        node = BinaryTreeNode(min_value)
        self.assertEqual(node,self.binarytree.findMin())
    
    def test_findMax(self):
        max_value = self.person('ØYFOSS','ØISTEIN','ORHEIM 76','0367','oslo')
        node = BinaryTreeNode(max_value)
        self.assertEqual(node,self.binarytree.findMax())
        
    def test_deleteMin(self):
        self.binarytree.deleteMin()
        min_value = self.person('AAKVIK','SARPSBORG')
        node = BinaryTreeNode(min_value)
        self.assertEqual(node,self.binarytree.findMin())

    def test_deleteMin_root(self):
        btree = BinaryTree()
        min_value = self.person('AAKVIK','SARPSBORG')
        node = BinaryTreeNode(min_value)
        btree.insert(value = min_value)
        btree.insert(value = self.person('Zero','ZeroCity'))
        btree.deleteMin()
        self.assertNotEqual(node,btree.findMin())
    
    def test_deleteMax(self):
        self.binarytree.deleteMax()
        max_value = self.person('ØYFOSS','WERNER STENVOLD','KIRKVOLL 28','5935','LAVIK')
        node = BinaryTreeNode(max_value)
        self.assertEqual(node,self.binarytree.findMax())
        
    
    def test_find(self):
        value = self.person('SKARSHAUG','ASBJØRN HaraLD','ALAPMO 72','7290','STØREN')
        node = BinaryTreeNode(value)
        self.assertEqual(node,self.binarytree.find(value))
    
    def test_find_key_not_found(self):
        value = self.person('BORIS','JOHNSON','SOME STREET 72','LONDON')
        self.assertEqual(None,self.binarytree.find(value))
        self.assertRaises(KeyError,self.binarytree.find,value)


    def test_delete(self):
        value = self.person('SKARSHAUG',self.binarytree.find(value))
        self.binarytree.delete(value)
        self.assertEqual(None,self.binarytree.find(value))
        
    
    def test_insert_value(self):
        value1 = self.person('WIKILUND','JOHAN','sveTUN 11','8510','NARVIK')
        node1 = BinaryTreeNode(value1)
        value2 = self.person('ALFRED','POLLEN','gate 11','KONGSBERG')
        node2 = BinaryTreeNode(value2)
        self.binarytree.insert(value=value1)
        self.binarytree.insert(value=value2)
        self.assertEqual(node1,self.binarytree.find(value1))
        self.assertEqual(node2,self.binarytree.find(value2))
    
    def test_insert_node(self):
        value1 = self.person('WIKILUND','KONGSBERG')
        node2 = BinaryTreeNode(value2)
        self.binarytree.insert(treenode=node1)
        self.binarytree.insert(treenode=node2)
        self.assertEqual(node1,self.binarytree.find(value2))
    
    def test_insert_duplicate(self):
        value = self.person('SKARSHAUG','STØREN')
        self.assertRaisesRegex(Exception,"Duplicate key",self.binarytree.insert,[None,None,value])
    
    def test_insert_empty_space(self):
        self.assertRaisesRegex(Exception,"Attempt to insert an empty space into Binary Tree",None])
    
    def test_insert_empty_node(self):
        node = BinaryTreeNode(None)
        self.assertRaisesRegex(Exception,"Attempt to insert an Node into Binary Tree with no key value",node,None])
    
    def test_find_in_empty_tree(self):
        tree = BinaryTree()
        value = self.person('SKARSHAUG','STØREN')
        self.assertEqual(None,tree.find(value))
        


if __name__ == '__main__':
    import sys;sys.argv = ['','BinaryTreeTest']
    unittest.main()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)