2013-02-19 88 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你檢查一個不同的列表。

相關問題