Problème de decorateur entre unittest et nosetests
Bonjour,
j'ai un petit problème qui mérite un oeil externe :roll:
J'ai une classe de test avec des méthodes de test.
Chaque méthode de test possède un décorateur timeout
La definition du décorateur se fait en déhors de la classe de test.
Quand je lance unittest, aucun soucis, les tests se lance et j'ai bien le timeout qui fonctionne ... par contre avec nosetest plus rien ne se lance :(
(et bien sûr en enlevant les décorateurs tout fonctionne bien :-/ )
Si vous avez une idée je suis preneur
Voici le bout de code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
import unittest
import signal
import time
class TimeoutException(Exception):
pass
def timeout(timeout_time):
"""
decorator function catching the argument
"""
def timeout_function(func):
"""
decorator function
"""
def _timeout_function(self):
"""
create a signal handler
set the timeout with the argument given while calling the decorator @timeout
call the function
catch a timeout exception if necessary
"""
def timeout_handler(signum, frame):
print 'Timeout (%s sec) reached' % str(timeout_time)
raise TimeoutException()
old_handler = signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(timeout_time) # triger alarm in timeout_time seconds
try:
retval = func(self)
except TimeoutException:
return 'Timeout (%s sec) reached' % str(timeout_time)
finally:
signal.signal(signal.SIGALRM, old_handler)
signal.alarm(0)
return retval
return _timeout_function
return timeout_function
class Test_MaclasseDeTest(unittest.TestCase):
@timeout(5)
def test_OK(self):
print 'dummy test ok'
#content of the test
pass
@timeout(5)
def test_KO(self):
print 'dummy test ko'
time.sleep(10)
#content of the test
pass
if __name__ == "__main__":
unittest.main() |