Python unittest:在安装程序中访问修饰的测试属性

2024-09-30 18:23:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图弄清楚如何以一种方式来修饰测试函数,使来自修饰器的信息可供安装程序使用。代码如下所示:

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

安装程序的目标是了解它正在运行testPreference1,并知道在启动服务之前需要将首选项“abc”设置为5(与“xyz”和testPreference2类似)

当然,我可以在测试名(if self._testMethodName == "testPreference1")上使用一个条件,但随着测试数量的增加,这感觉不太容易维护(+重构更容易出错)。我希望在setUp中解决这个问题,而不是覆盖run实现。我也有

我正在运行python3.6,尽管如果有依赖于较新python特性的创造性解决方案,我也很乐意了解这一点


Tags: 代码importself信息def方式setuppass
1条回答
网友
1楼 · 发布于 2024-09-30 18:23:50

装饰器工作得很好,但是没有真正的“官方”方法来获取底层方法,所以我只做了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()

相关问题 更多 >