如何正确地对链表进行单元测试(使用Python)?

时间:2015-06-13 06:33:39

标签: python unit-testing linked-list

我是TDD的新手。我已经创建了所有主要功能(插入,搜索,删除等)。这是我的insert_beginning()函数:

def insert_beginning(self, node):
    '''
    Inserts a Node to the beginning of the list.
    '''
    node.set_next(self.head)
    self.head = node

我的问题是,我该如何正确地对这个功能进行单元测试?我能做到的唯一方法是:

class ListFunctionsTest(unittest.TestCase):

    def setUp(self): 
        self.list1 = LinkedList()
        self.node1 = Node(1)

    def test_insert_beginning(self):
        self.list1.insert_beginning(self.node1)
        self.assertEqual(self.list1.__str__(), "1")

但是test_insert_beginning()函数依赖于我的

__str__() # string representation of my linked list

功能。我有一种感觉,我正在测试它的方式是不正确的(因为我决定改变我的链表的方式,然后我最终不得不重写我的测试用例)。有没有办法测试我的insert_beginning()函数而不依赖于我创建/自定义的另一个函数?

编辑:对于那些想知道的人,目前,我的链表的字符串表示只是用逗号分隔的节点的字符串表示。例如,具有节点1,2和“a”的链表将如下表示:

1, 2, "a"

但是,我打算更改链表的字符串表示(计划更改__ str __()函数)。这是我意识到我单元测试的方式可能不正确。

编辑2(一条评论建议我创建一个函数,帮助我找到链表中项目的索引):假设存在一个名为index_of(self,item)的函数,并且该函数找到一个索引。项目。假设这是index_of(self,item)的单元测试,并假设测试用例成功通过。

def test_index_of(self):
    myList = LinkedList()
    node1 = Node(1)
    node2 = Node(2)
    node3 = Node(3)
    myList.head = node1
    node1.next = node2
    node2.next = node3

    self.assertEqual(self.myList.index_of(1), 0)
    self.assertEqual(self.myList.index_of(2), 1)
    self.assertEqual(self.myList.index_of(3), 2)

现在,我可以依赖index_of(self,item)函数来确定insert_beginning(self,node)是否正常工作?换句话说,如果我的test_insert_beginning()函数是:

,是否可以
class ListFunctionsTest(unittest.TestCase):

    def setUp(self): 
        self.list1 = LinkedList()
        self.node1 = Node(1)

    def test_insert_beginning(self):
        self.list1.insert_beginning(self.node1)
        self.assertEqual(self.list1.index_of(1), 0)

1 个答案:

答案 0 :(得分:2)

你有一个好点。您不希望将自己绑定到列表的任意String表示形式,这可能会更改。检查此方法的“正确”方法是检查列表中的。即,不应检查字符串表示,而应分别检查所有发布条件:

  • 第一个值是1
  • 以前的值不存在(无论你想在错误时发生什么)
  • 下一个值与之前的值
  • 相同
  • 大小为1
  • ...

    当然,对于支持此方法的方法,您必须进行单独的单元测试。