4

我有单元测试:

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 没有?

4

2 回答 2

2

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

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

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

一个更复杂的选择是重构insertion_sorting(),所以它不是破坏性的。

于 2013-02-19T15:18:37.600 回答
1

尝试以下操作:

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

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

并回答您真正的问题-TestFail失败是因为data排序后为空,而在TestSuccess您检查不同的列表时。

于 2013-02-19T15:19:49.877 回答