Sto utilizzando il framework unittest per automatizzare i test di integrazione di codice python multi-thread, hardware esterno e C. incorporato Nonostante il mio palese abuso di un framework per test di integrazione non funziona, funziona davvero bene. Tranne un problema: ho bisogno che il test fallisca se viene sollevata un'eccezione da uno qualsiasi dei thread spawn. Questo è possibile con la struttura più semplice?Rendi Python unittest fail su eccezione da qualsiasi thread
Una soluzione semplice ma non lavorabile sarebbe a) refactoring del codice per evitare il multi-threading o b) testare ciascun thread separatamente. Non posso farlo perché il codice interagisce in modo asincrono con l'hardware esterno. Ho anche preso in considerazione l'implementazione di un tipo di messaggio che passa per inoltrare le eccezioni al thread di unittest principale. Ciò richiederebbe modifiche significative del test al codice in fase di test, e voglio evitarlo.
Tempo per un esempio. Posso modificare lo script di test qui sotto per fallire nell'eccezione sollevata in my_thread senza modificando la classe x.ExceptionRaiser?
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()
No. L'eccezione che si verifica nel thread ha il proprio contesto e le eccezioni non si propagano al thread principale.Penso che non si possa evitare di passare qualche messaggio se si vuole davvero farlo. Controlla http://stackoverflow.com/questions/2829329/catch-a-threads-exception-in-the-caller-thread-in-python –