2016-11-06 8 views
5

Ich benutze Python unittest und möchte einen Test schreiben, der ein paar Threads startet und wartet auf sie zu beenden. Die Threads führen eine Funktion aus, die einige Assertionen hat (unittest). Wenn eine der Aussagen fehlschlägt, möchte ich, dass der Test fehlschlägt. Dies scheint nicht der Fall zu sein.Python Unittest und Multithreading

EDIT: Minimal runnable Beispiel (python3)

import unittest 
import threading 

class MyTests(unittest.TestCase): 

def test_sample(self): 
    t = threading.Thread(target=lambda: self.fail()) 
    t.start() 
    t.join() 

if __name__ == '__main__': 
    unittest.main() 

und der Ausgang ist:

sh-4.3$ python main.py -v                                                    
test_sample (__main__.MyTests) ... Exception in thread Thread-1:                                          
Traceback (most recent call last):                                                  
    File "/usr/lib64/python2.7/threading.py", line 813, in __bootstrap_inner                                        
    self.run()                                                       
    File "/usr/lib64/python2.7/threading.py", line 766, in run                                           
    self.__target(*self.__args, **self.__kwargs)                                              
    File "main.py", line 7, in <lambda>                                                 
    t = threading.Thread(target=lambda: self.fail())                                             
    File "/usr/lib64/python2.7/unittest/case.py", line 450, in fail                                          
    raise self.failureException(msg)                                                 
AssertionError: None                                                     

ok                                                          

----------------------------------------------------------------------                                         
Ran 1 test in 0.002s                                                     

OK  
+0

Ich denke, du gehst falsch rüber. Zeigen Sie uns eine Probe der zu testenden Funktion. – Dan

+0

@Dan: Es kann alles sein, auch die einfachste 'def test_fail (self): self.fail()' –

+0

So sollten Sie nie Threads in Ihren Testfällen auslösen müssen. Wenn die zu testende Funktion Threads absetzt, können Sie dieses Verhalten testen, indem Sie die Zielfunktion mokieren und Assertionen gegen die Aufrufe ausführen. Sie können sich sogar über die Threading-Klasse lustig machen. – Dan

Antwort

1

Python unittest Behauptungen von Ausnahmen mitgeteilt werden, so dass Sie sicherstellen müssen, dass die Ausnahmen enden im Hauptthread. Also für einen Thread, den Sie haben laufen .join() bedeutet, als dass die Ausnahme vom Faden über in den Haupt-Thread werfen:

t = threading.Thread(target=lambda: self.assertTrue(False)) 
    t.start() 
    t.join() 

auch sicher, dass Sie keine try/except Blöcke haben, die essen könnten am die Ausnahme vor der unittest kann sie registrieren.

Bearbeiten: self.fail() wird in der Tat nicht mitgeteilt, wenn von einem Thread aufgerufen wird, auch wenn .join() vorhanden ist. Nicht sicher, was los ist.

+1

Ich habe dein Beispiel versucht. Es funktioniert nicht für mich (python3.x) und liefert das gleiche Ergebnis wie mein Code. Der Test besteht noch immer. –

0

In meinem Haupt-Thread, erkenne ich Sub-Prozesse scheitern, indem Sie ihre Exit-Code (Nicht-Null ist fehlgeschlagen).

proc.join() 
self.assertEqual(proc.exitcode, 0, 'Sub-process failed, check output for stack trace') 
+1

Ein Unterprozess ist kein Thread. –