Python unittest的setUpClass不起作用

时间:2019-10-24 00:51:29

标签: python unit-testing

我有以下代码:

import unittest

class TestFMP(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        FMP_object = MyClass1(path, {})
        Locator_object = MyClass2(path)

    @classmethod
    def tearDownClass(cls):
        print('YYY')

    def test_method(self):

        self.assertEqual(FMP_object.method1(), Locator_object.method2())

我的理解是,setUpClass()应该在TestFMP类实例化时执行一次,并提供对FMP_object和Locator_object的恒定访问。但是,当我运行test_method时,出现以下错误:

testcase = TestFMP()
testcase.test_method()

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-277-b11e25b4803c> in <module>
      1 testcase = TestFMP()
----> 2 testcase.test_method()

<ipython-input-276-dba1c1e55b1a> in test_method(self)
     12     def test_method(self):
     13 
---> 14         self.assertEqual(FMP_object.method1(), Locator_object.method2())

NameError: name 'FMP_object' is not defined

当我尝试使用self访问FMP_object / Locator_object时,我得到相同的结果。 test_method()中的前缀。

关于我在做什么错的任何想法吗?

我在Python 3.6上得到了这个。

1 个答案:

答案 0 :(得分:1)

setupClass(cls)被调用,但是您的计算结果未存储。您需要将结果分配给clsTestFMP类)上的一个属性,而不仅仅是将其分配为变量,然后可以通过selfself的形式获取这些结果。可以访问cls属性(但不能访问逆属性)。

类似以下内容将实现您的追求:

import unittest

class TestFMP(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # set `fmp` and `locator` onto the class through `cls` 
        cls.fmp = MyClass1(path, {})
        cls.locator = MyClass2(path)

    @classmethod
    def tearDownClass(cls):
        # Dispose of those resources through `cls.fmp` and `cls.locator`
        print('YYY')

    def test_method(self):
        # access through self: 
        self.assertEqual(self.fmp.method1(), self.locator.method2())