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 .

  • Wie verwende ich unittest.TestResult?
  • Wie testet man, dass eine Python-Funktion eine Ausnahme auslöst?
  • Wie gehe ich auf eine Tkinter App?
  • Schreiben einer wiederverwendbaren (parametrisierten) unittest.TestCase-Methode [duplizieren]
  • Python unittest.TestCase-Objekt hat kein Attribut 'runTest'
  • Python - Test, der erfolgreich ist, wenn die Ausnahme nicht erhöht wird
  • Commit in git nur, wenn Tests passieren
  • Testen von Python-Deskriptoren
  • InvalidBasesError: Grundlagen für [<ModelState: 'users.GroupProxy'> können nicht aufgelöst werden
  • Sperren einer Klassenmethode, die über eine Instanz verwendet wird
  • Wie soll ich eine Log-Meldung beim Testen von Python-Code unter Nase überprüfen?
  • Python ist die beste Programmiersprache der Welt.