2013-02-19 91 views
4

我有单元测试: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: Lists differ: [] != [0, 1, 2, 3, 4]

Second list contains 5 additional elements. First extra element 0: 0

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

你能解释我为什么TestSuccess跑成功,但TestFail不是?

回答

2

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

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

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

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

+0

's/data /由两个不同的变量引用的列表,这两个变量都被称为data/g' – delnan 2013-02-19 15:19:44

+0

@delnan,yup,这可能会令人困惑。我试图更具体。 – 2013-02-19 15:21:38

+0

您仍在混合变量(或“名称”)和列表(这是来自几个地方的引用,包括两个不同的变量/名称)。鉴于别名是整个问题,我想说这是一个相当重要的区别。 – delnan 2013-02-19 15:21:43

1

尝试以下操作:

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

你看看会发生什么?您删除了data的内容。

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

相关问题