Sie Dekorateure benutzen können, aber programmatisch, so dass Sie den Dekorateur nicht in jedem Verfahren setzen müssen.
ich einige Dinge in der nächsten Code gehe davon aus:
Die Testverfahren sind alle Namen wie: „testXXX()“ Der Dekorateur auf das gleiche Modul hinzugefügt wird, in dem Prüfverfahren durchgeführt werden.
def test1():
print ("Testing hello world")
def test2():
print ("Testing hello world 2")
#This is the decorator
class TestChecker(object):
def __init__(self, testfn, *args, **kwargs):
self.testfn = testfn
def pretest(self):
print ('precheck %s' % str(self.testfn))
def posttest(self):
print ('postcheck %s' % str(self.testfn))
def __call__(self):
self.pretest()
self.testfn()
self.posttest()
for fn in dir() :
if fn.startswith('test'):
locals()[fn] = TestChecker(locals()[fn])
Nun, wenn Sie die Testmethoden rufen ...
test1()
test2()
Die Ausgabe sollte so etwas wie sein:
precheck <function test1 at 0x10078cc20>
Testing hello world
postcheck <function test1 at 0x10078cc20>
precheck <function test2 at 0x10078ccb0>
Testing hello world 2
postcheck <function test2 at 0x10078ccb0>
Wenn Sie Testmethoden als Klassenmethoden haben, ist der Ansatz auch gültig. Zum Beispiel:
class TestClass(object):
@classmethod
def my_test(cls):
print ("Testing from class method")
for fn in dir(TestClass) :
if not fn.startswith('__'):
setattr(TestClass, fn, TestChecker(getattr(TestClass, fn)))
Der Aufruf TestClass.my_test()
druckt:
precheck <bound method type.my_test of <class '__main__.TestClass'>>
Testing from class method
postcheck <bound method type.my_test of <class '__main__.TestClass'>>
Ich möchte nicht jede Funktion einzeln markieren. Ich möchte etwas, das für alle Testfunktionen innerhalb eines Moduls gilt. –