私はユニットテストクラスをPythonでunittest
を使用しています。私が理解しているように、unittest
は、各テストの前にsetUp
関数を呼び出すので、ユニットテストオブジェクトの状態は同じで、テストの実行順序は関係ありません。Pythonのユニットテストオブジェクト - オブジェクトがセットアップで上書きされていません
今私は、私は、このテストでは、test_translateのために失敗した... ...
#! 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)
を以下のユニットテストと
#! 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
を、このクラスをテストしていています。
私はテストが成功させるために2つのことを行うことができます:
(1)コメントを解除し、セットアップ機能の2行目。または
(2)translate
が最初に発生するようにテストの名前を変更します。私はunittest
がアルファベット順にテストを実行することに気づいた。 translate
をたとえばatranslate
に変更すると、最初にすべてのテストが成功するようになります。
(1)については、これが最初の行setUp
の最初の行でself.stの新しいオブジェクトを作成するため、これがテストにどのように影響するかは想像もできません。 (2)については、setUp
に私がself.st
に新しいオブジェクトを割り当てているので、self.st
にtest_set
というように私はtest_translate
の結果に影響を与えてはならないので、私の苦情は似ています。
ここで私は何が不足していますか?
だから私をもう少し教えてください。 'None None'と' == None'の違いは何ですか?私はいつも 'is None'を使いました。 '== None'は動作しませんでした。 – skytreader
@skytreader:演算子 'is'はオブジェクトの同一性をテストします。 'None'値は、NoneTypeクラスの単一インスタンスによって表されます。値が「None」の場合は、同じオブジェクトへの参照を共有していることを意味します。 'numlist is None'は、同じオブジェクトが共有されているかどうかをテストしていることを意味します。 '=='演算子はもっと複雑です。 'numlist'が独自の' .__ eq__'メソッドを定義するクラスの(インスタンスへの)参照であった場合、 '=='は予期しないブール値を生成する可能性があります。しかし、単純なケースではほぼ同じです。 – pepr