Ich verwende das Unittest-Framework, um Integrationstests von Multi-Threaded Python-Code, externe Hardware und Embedded C zu automatisieren. Trotz meiner eklatanten Missbrauch eines Unittesting-Framework für Integrationstests, funktioniert es wirklich Gut. Bis auf ein Problem: Ich muss den Test fehlschlagen, wenn eine Ausnahme von einem der erzeugten Threads ausgelöst wird. Ist das mit dem Unittest-Framework möglich?Make Python Unittest fehlgeschlagen auf Ausnahme von jedem Thread
Eine einfache, aber nicht praktikable Lösung wäre, entweder den Code umzuformen, um Multithreading zu vermeiden, oder b) jeden Thread einzeln zu testen. Ich kann das nicht, weil der Code asynchron mit der externen Hardware interagiert. Ich habe auch überlegt, eine Art von Nachrichtenübergabe zu implementieren, um die Ausnahmen an den Haupt-Unittest-Thread weiterzuleiten. Dies würde erhebliche testbezogene Änderungen an dem getesteten Code erfordern, und das möchte ich vermeiden.
Zeit für ein Beispiel. Kann ich das folgende Testskript so ändern, dass es bei der Exception in my_thread ohne, die die x.ExceptionRaiser-Klasse ändert, fehlschlägt?
import unittest
import x
class Test(unittest.TestCase):
def test_x(self):
my_thread = x.ExceptionRaiser()
# Test case should fail when thread is started and raises
# an exception.
my_thread.start()
my_thread.join()
if __name__ == '__main__':
unittest.main()
Nein. Die Ausnahme, die im Thread auftritt, hat einen eigenen Kontext und Ausnahmen werden nicht an den Hauptthread weitergegeben.Ich denke, Sie können nicht vermeiden, dass eine Nachricht weitergegeben wird, wenn Sie das wirklich wollen. Überprüfen Sie http://stackoverflow.com/questions/2829329/catch-a-threads-exception-in-the-caller-thread-in-python –