assertEqual - 两个相同列表,为什么结果奇怪?
我有一些单元测试:
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()
函数,使其不再是破坏性的。