Bonjour,

j'ai un petit problème qui mérite un oeil externe

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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()