我正在使用 Python 对类进行单元测试unittest
。据我了解,在每次测试之前unittest
调用该setUp
函数,以便单元测试对象的状态相同并且执行测试的顺序无关紧要。
现在我有这门课我正在测试......
#! usr/bin/python2
class SpamTest(object):
def __init__(self, numlist = []):
self.__numlist = numlist
@property
def numlist(self):
return self.__numlist
@numlist.setter
def numlist(self, numlist):
self.__numlist = numlist
def add_num(self, num):
self.__numlist.append(num)
def incr(self, delta):
self.numlist = map(lambda x: x + 1, self.numlist)
def __eq__(self, st2):
i = 0
limit = len(self.numlist)
if limit != len(st2.numlist):
return False
while i < limit:
if self.numlist[i] != st2.numlist[i]:
return False
i += 1
return True
通过以下单元测试...
#! usr/bin/python2
from test import SpamTest
import unittest
class Spammer(unittest.TestCase):
def setUp(self):
self.st = SpamTest()
#self.st.numlist = [] <--TAKE NOTE OF ME!
self.st.add_num(1)
self.st.add_num(2)
self.st.add_num(3)
self.st.add_num(4)
def test_translate(self):
eggs = SpamTest([2, 3, 4, 5])
self.st.incr(1)
self.assertTrue(self.st.__eq__(eggs))
def test_set(self):
nl = [1, 4, 1, 5, 9]
self.st.numlist = nl
self.assertEqual(self.st.numlist, nl)
if __name__ == "__main__":
tests = unittest.TestLoader().loadTestsFromTestCase(Spammer)
unittest.TextTestRunner(verbosity = 2).run(tests)
此测试对 test_translate 失败。
我可以做两件事来使测试成功:
(1) 取消setUp函数第二行的注释。或者,
(2) 更改translate
首先发生的测试的名称。我注意到unittest
按字母顺序执行测试。translate
例如,更改为atranslate
使其首先执行会使所有测试成功。
对于 (1),我无法想象这会如何影响测试,因为在 的第一行setUp
,我们为 self.st 创建了一个新对象。至于(2),我的抱怨是相似的,因为,嘿,setUp
我分配了一个新对象,self.st
所以无论我做什么都不应该影响self.st
.test_set
test_translate
那么,我在这里缺少什么?