Python 未初始化新类实例

Python 未初始化新类实例,python,tdd,nose,Python,Tdd,Nose,我正在编写一个软件包,并像一个优秀的小程序员一样进行测试,但发生的情况如下: 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.Test

我正在编写一个软件包,并像一个优秀的小程序员一样进行测试,但发生的情况如下:

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\u default\u search\u parts
失败,出现
AssertionError:['a']!=[]和
测试添加字母
通过。我不知道这里发生了什么。当我重写
test\u default\u search\u parts
时,它变得非常奇怪:

def test_default_search_parts(self):
    f = Finder()
    self.assertEqual(f.search_parts, [])
同样的故障也会发生。我在这里初始化实例的错误是什么


哦,如果有必要的话,我正在使用nose来运行它们。

正如@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'] != []
问题是所有查找器实例都共享这个类级属性search\u parts,并且在默认搜索测试之前运行add\u letter

要解决此问题,请使用以下方法:

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

这将确保它只是一个实例属性。

您可以为Finder添加代码吗?请记住,测试的顺序是不一致的或不能保证的,因此如果这些实例共享一些全局状态,则可能会以令人困惑的方式出现可怕的错误。
Finder
可能正在将
search\u parts
存储为类级属性?@samplebias,我将发布一个问题示例。有关Henry所描述差异的详细解释,请参见此问题: