assertEqual - 两个相同的列表,为什么我得到奇怪的结果?

时间:2013-02-19 15:16:02

标签: python unit-testing

我有单元测试:

import unittest

class TestFail(unittest.TestCase):
    def testFail(self):
        data = range(5)
        self.assertEqual(data, insertion_sorting(data))

class TestSuccess(unittest.TestCase):   
    def testSuccess(self):
        data = range(5)
        self.assertEqual([0,1,2,3,4], insertion_sorting(data))


def insertion_sorting(data):
        result = []
        while len(data):
            min_index = 0
            for i in range(len(data)):
                if data[i] < data[min_index]: min_index = i
            result.append(data[min_index])
            del data[min_index] 
        return result 

if __name__ == '__main__':
    unittest.main()

TestSuccess运行成功,但TestFail提出:

  

AssertionError:列表不同:[]!= [0,1,2,3,4]

     

第二个列表包含5个附加元素。第一个额外元素0:0

     
      
  • []
  •   
  • [0,1,2,3,4]
  •   

你能解释一下,为什么TestSuccess成功运行,但TestFail没有?

2 个答案:

答案 0 :(得分:2)

您的insertion_sorting()功能破坏性:它会就您传递的列表就地修改。因此,在调用data期间,TestFail()中定义的insertion_sorting()变量引用的列表确实会被清除。

一个简单的解决方法是对列表的副本进行操作:

self.assertEqual(data, insertion_sorting(data[:]))

更复杂的选择是重构insertion_sorting(),因此它不具有破坏性。

答案 1 :(得分:1)

尝试以下方法:

data = range(5)
print data
print insertion_sorting(data)
print data

你看到会发生什么吗?您删除data

的内容

要回答您的真实问题 - TestFail失败,因为data在排序后为空,而在TestSuccess中则会检查其他列表。