【问题标题】:Python unittest: Accessing decorated test attributes in setUpPython unittest:在 setUp 中访问修饰的测试属性
【发布时间】:2020-03-23 19:25:54
【问题描述】:

我试图弄清楚如何以一种使来自装饰器的信息可用于设置的方式来装饰测试函数。代码如下所示:

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】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 1970-01-01
      • 2022-11-18
      • 2011-09-12
      • 2013-09-18
      • 2017-08-17
      • 1970-01-01
      • 2014-03-06
      • 2012-11-22
      相关资源
      最近更新 更多