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

4 投票
2 回答
2740 浏览
提问于 2025-04-17 16:22

我有一些单元测试:

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 个回答

1

试试下面的代码:

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

你看到发生了什么吗?你把 data 的内容给删掉了。

至于你真正想问的问题 - TestFail 失败是因为排序后 data 变空了,而在 TestSuccess 中你检查的是一个不同的列表。

2

你的 insertion_sorting() 函数是 破坏性的:它会直接修改你传入的列表。因此,在 TestFail() 函数中定义的 data 变量所引用的列表,在调用 insertion_sorting() 时确实会被清空。

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

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

一个更复杂的选择是重构 insertion_sorting() 函数,使其不再是破坏性的。

撰写回答