我试图弄清楚如何装饰测试函数,以使装饰器中的信息可用于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功能,也很乐意对此进行了解。
装饰器工作良好,但是没有真正的“官方”方法来获取底层方法,所以我只是做了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()