2

私はパッケージを書いていて、良い小さなプログラマーのようにテストを行っていますが、何が起こるかは次のとおりです。

class TestOne(unittest.TestCase):
    def setUp(self):
        self.finder = Finder()

    def test_default_search_parts(self):
        self.assertEqual(self.finder.search_parts, [])

class TestTwo(unittest.TestCase):
    def setUp(self):
        self.finder = Finder()

    def test_add_letter(self):
        self.finder.add('a')
        self.assertNotEqual(self.finder.search_parts, [])

この場合、は でtest_default_search_parts失敗しAssertionError: ['a'] != []test_add_letter合格します。ここで何が起こっているのかわかりません。書き直すと本当に奇妙になりますtest_default_search_parts

def test_default_search_parts(self):
    f = Finder()
    self.assertEqual(f.search_parts, [])

同じ障害が発生します。インスタンスの初期化で何が間違っていますか?

ああ、それが問題なら、私は鼻を使ってそれらを実行しています。

4

1 に答える 1

4

@samplebiasが述べたように、この場合はクラスレベルの属性を持つ共有状態が問題を引き起こす可能性があります。考えられる状況は次のとおりです。

import unittest

# bad implementation of Finder, class-level attribute
class Finder(object):
    search_parts = []

    def add(self, letter):
        self.search_parts.append(letter)


# using 'Zne' here makes sure this test is run second        
class TestZne(unittest.TestCase):
    def setUp(self):
        print 'I am run next'
        self.finder = Finder()

    def test_default_search_parts(self):
        self.assertEqual(self.finder.search_parts, [])


class TestTwo(unittest.TestCase):
    def setUp(self):
        print 'I am run first'
        self.finder = Finder()

    def test_add_letter(self):
        self.finder.add('a')
        self.assertNotEqual(self.finder.search_parts, [])

unittest.main()

出力

Traceback (most recent call last):
  File "test.py", line 18, in test_default_search_parts
    self.assertEqual(self.finder.search_parts, [])
AssertionError: Lists differ: ['a'] != []

問題は、すべてのFinderインスタンスがこのクラスレベルの属性search_partsを共有し、デフォルトの検索テストの前にadd_letterが実行されていることです。

解決するには、次のようなものを使用します。

class Finder(object):
    def __init__(self):
        self.search_parts = []

これにより、インスタンス属性のみが保証されます。

于 2011-04-27T17:57:59.443 に答える