我正在编写一个软件包,并像一个优秀的程序员一样进行测试,但这是发生的事情:
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, [])
同样的失败发生。在初始化我的实例时,我在做错了什么?
哦,如果重要的话,我会用鼻子来操作它们。
答案 0 :(得分: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 = []
这将确保它只是实例属性。