self.attr在unittest.TestCase中的测试之间重置

时间:2012-05-13 08:24:05

标签: python unit-testing

我想使用self.attrunittest.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的实例是否在测试运行之间发生变化?为什么呢?

1 个答案:

答案 0 :(得分:9)

它的工作方式是因为unittest.main()为每个测试创建单独的对象(在这种情况下创建了两个对象)。

关于你的动机:测试不应该改变全球状态。您应该在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