7

self.attrクラスのを使用したいのですがunittest.TestCase、テスト間で永続的ではないようです。

import unittest

class TestNightlife(unittest.TestCase):
    _my_param = 0

    def test_a(self):
        print 'test A = %d' % self._my_param
        self._my_param = 1

    def test_b(self):
        print 'test B = %d' % self._my_param
        self._my_param = 2

if __name__ == "__main__":
    unittest.main()

これにより、次の出力が得られます。

test A = 0
test B = 0

unittest.TestCaseテスト実行間の変更のインスタンスはありますか?なんで?

4

1 に答える 1

9

unittest.main()はテストごとに個別のオブジェクトを作成するため(この場合は2つのオブジェクトが作成されます)、このように機能します。

あなたの動機について:テストはグローバルな状態を変えるべきではありません。tearDownでテストする前、またはそれ自体をテストする前に、グローバル状態を状態に戻す必要があります。テストがグローバル状態を変更している場合は非常に問題があり、遅かれ早かれ予測できないシナリオに陥ります。

import unittest

class TestNightlife(unittest.TestCase):
    _my_param = 0

    def test_a(self):
        print 'object id: %d' % id(self)
        print 'test A = %d' % self._my_param
        self._my_param = 1

    def test_b(self):
        print 'object id: %d' % id(self)
        print 'test B = %d' % self._my_param
        self._my_param = 2

if __name__ == "__main__":
    unittest.main()

出力:

object id: 10969360
test A = 0
.object id: 10969424
test B = 0
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
于 2012-05-13T08:46:37.413 に答える