Python unittest:在setUp中访问修饰的测试属性

问题描述 投票:0回答:1

我试图弄清楚如何装饰测试函数,以使装饰器中的信息可用于setUp。代码看起来像这样:

import unittest

class MyTest(unittest.TestCase):
    def setUp(self):
        stopService()
        eraseAllPreferences()
        setTestPreferences()
        startService()

    @setPreference("abc", 5)
    def testPreference1(self):
        pass

    @setPreference("xyz", 5)
    def testPreference2(self):
        pass

目标是让setUp了解它正在运行testPreference1,并知道它需要在启动服务之前将首选项“ abc”设置为5(并且类似地对于“ xyz”和testPreference2)。

我当然可以在测试名称(if self._testMethodName == "testPreference1")上使用条件,但是随着测试数量的增加,这种可维护性就不那么可维护了(+重构更容易出错)。我希望在setUp中解决此问题,而不是重写run实现。我也有

我正在运行python3.6,尽管如果有创造性的解决方案取决于较新的python功能,也很乐意对此进行了解。

python python-3.x python-3.6 python-unittest
1个回答
0
投票

装饰器工作良好,但是没有真正的“官方”方法来获取底层方法,所以我只是做了unittest源所做的事情:method = getattr(self, self._testMethodName)

import functools
import unittest

def setFoo(value):
    def inner(func):
        print(f"Changing foo for function {func}")
        func.foo = value

        @functools.wraps(func)
        def wrapper(self, *args, **kwargs):
            return func(self, *args, **kwargs)

        return wrapper
    return inner

class Foo(unittest.TestCase):
    def setUp(self):
        method = getattr(self, self._testMethodName)
        print(f"Foo = {method.foo}")

    @setFoo("abc")
    def testFoo(self):
        self.assertEqual(self.testFoo.foo, "abc")

    @setFoo("xyz")
    def testBar(self):
        self.assertEqual(self.testBar.foo, "xyz")

if __name__ == "__main__":
    unittest.main()
© www.soinside.com 2019 - 2024. All rights reserved.