我使用unittest
在Python中進行單元測試。據我所知,unittest
在每次測試之前調用setUp
函數,以便單元測試對象的狀態是相同的,並且執行測試的順序並不重要。Python中的單元測試對象 - 對象不會寫在設置中
現在我有這個類我測試...
#! 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)取消註釋設置功能的第二行。或者,
(2)更改測試名稱,使translate
首先出現。我注意到unittest
按字母順序執行測試。將translate
更改爲atranslate
,以便它首先執行使所有測試都成功。
對於(1),我無法想象這是如何影響測試的,因爲在setUp
的第一行,我們爲self.st創建了一個新對象。至於(2),我的投訴是相似的,因爲,嘿,在setUp
我分配一個新的對象self.st
所以我所做的任何self.st
在test_set
應該不會影響test_translate
的結果。
那麼,我在這裏錯過了什麼?
所以......再教育我一點。 'None'和'== None'有什麼區別?我總是使用'是None';不知道'== None'的作品。 – skytreader 2012-07-08 15:21:24
@skytreader:運算符'is'測試對象身份。 「None」值由NoneType類的單個實例表示。值爲'None'意味着您將共享對同一對象的引用。 'numlist是None'表示您正在測試是否共享相同的對象。 == ==運算符更復雜。如果'numlist'是定義自己的'.__ eq__'方法的類的實例(引用),'=='可能會產生一個意外的布爾值。但是,簡單情況下大致相同。 – pepr 2012-07-08 15:40:12