Python unittest assertRaises wirft aus, wenn assertRaises ausfällt

Ich habe Code, wo assertRaises eine Ausnahme auslöst, wenn assertRaises ausfällt. Ich dachte, wenn AssertRaises scheitert, dann würde der Test fehlschlagen und ich würde einen Bericht am Ende bekommen, der sagt, dass der Test fehlgeschlagen ist. Ich habe nicht erwartet, dass die Ausnahme geworfen wird. Unten ist mein Code. Ich mache etwas falsch Ich benutze Python 2.6.2.

import unittest class myClass: def getName(self): raise myExcOne, "my exception one" #raise myExcTwo, "my exception two" #return "a" class myExcOne(Exception): "exception one" class myExcTwo(Exception): "exception two" class test_myClass(unittest.TestCase): def setUp(self): self.myClass = myClass() def testgetNameEmpty(self): #self.assertRaises(myExcOne,self.myClass.getName) #self.assertRaises(myExcTwo,self.myClass.getName) try: self.assertRaises(myExcTwo,self.myClass.getName) except Exception as e: pass if __name__ == "__main__": #unittest.main() suite = unittest.TestLoader().loadTestsFromTestCase(test_myClass) unittest.TextTestRunner(verbosity=2).run(suite) 

2 Solutions collect form web for “Python unittest assertRaises wirft aus, wenn assertRaises ausfällt”

Der gebuchte Code ist falsch. Für einen Anfang, class myClass(): shoudl be class myClass: Auch if name == "main": sollte sein:

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

Abgesehen von diesen Problemen, scheitert dies, weil getName() die Ausnahme myExcOne und Ihr Test erwartet Ausnahme myExcTwo .

Hier ist ein Code, der funktioniert. Bitte bearbeiten Sie den Code in Ihrer Frage, so dass es einfach für uns zu schneiden und fügen Sie es in eine Python-Sitzung:

 import unittest class myExcOne(Exception): "exception one" class myExcTwo(Exception): "exception two" class myClass: def getName(self): raise myExcTwo class test_myClass(unittest.TestCase): def setUp(self): self.myClass = myClass() def testgetNameEmpty(self): #self.assertRaises(myExcOne,self.myClass.getName) self.assertRaises(myExcTwo,self.myClass.getName) if __name__ == "__main__": unittest.main() 

Ausgehend von einer beiseite, ist das () nach dem klassennamen in einer class im modernen Python vollkommen korrekt – kein Fehler überhaupt.

Auf dem Fleisch des Problems ist assertRaises(MyException, foo) dokumentiert, um Ausnahmen zu verbreiten, die durch den Aufruf von foo() assertRaises(MyException, foo) dessen Typ NICHT eine Unterklasse von MyException – es fängt nur MyException und Unterklassen davon auf. Wenn Ihr Code eine Ausnahme von einem Typ auslöst und Ihr Test einen von einem anderen unabhängigen Typ erwartet, wird sich die angehobene Ausnahme dann, wie in den Dokumenten des unittest Moduls, hier ausbreiten, und ich zitiere: "Test geht, wenn Ausnahme ausgelöst wird, Ist ein Fehler, wenn eine andere Ausnahme ausgelöst wird oder fehlschlägt, wenn keine Ausnahme erhoben wird "- und" ist ein Fehler "bedeutet" propagiert die andere Ausnahme ".

Wenn du die Ausnahme fängst, die dich in deinem try / except Block ausbreitet, ziehst du den Fehler auf, und es ist nichts mehr übrig geblieben, um zu diagnostizieren. Wenn Ihr Ziel ist, diesen Fehler in einen Fehler zu verwandeln (eine umstrittene Strategie …), sollte Ihr except Block sich selbst self.fail .

  • Kontinuierliche Einheitsprüfung mit Pydev (Python und Eclipse)
  • Python sprudelnden rohen eingang in unittests
  • Python-Test-Entdeckung mit Doctests, Coverage und Parallelität
  • Python-Test mit Mock-Bibliothek für Benutzer-Eingabe in einer Schleife
  • Testen Sie Django-Ansichten, die eine Anmeldung mit RequestFactory benötigen
  • Stoppen Sie Testsuite, wenn ein Testfall einen Fehler findet
  • Ein Weg zur Ausgabe von pyunit test name in setup ()
  • In python, gibt es eine gute idiom für die Verwendung von Kontext-Manager in Setup / Teardown
  • Python unerträglich und entdeckung
  • Überschreiben Sie auto_now für unittest
  • Django Testing: Siehe Traceback, wo falsche Response erstellt wird
  • Python ist die beste Programmiersprache der Welt.