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]

2 番目のリストには、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ため失敗しました。dataTestSuccess

于 2013-02-19T15:19:49.877 に答える