2009-08-04 7 views
5

Ich habe Code, wo assertRaises eine Ausnahme auslöst, wenn assertRaises fehlschlägt. Ich dachte, dass, wenn assertRaises fehlschlägt, der Test fehlschlagen würde und ich am Ende einen Bericht erhalten würde, der besagt, dass der Test fehlgeschlagen ist. Ich habe nicht erwartet, dass die Ausnahme ausgelöst wird. Unten ist mein Code. Ich mache etwas falsch? Ich benutze Python 2.6.2.python unittest assertRaises löst Ausnahme aus, wenn assertRaises fehlschlägt

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) 
+0

Was meinen Sie konkret mit "Assert Fails"? Können Sie einen Stacktrace oder eine Fehlermeldung posten? –

+0

Ich habe das Dokument erneut gelesen und eine Ausnahme ausgelöst, wenn assertRaises fehlschlägt, ist das erwartete Verhalten. Ich habe missverstanden, wie das Werkzeug funktioniert. Ich habe vergessen, dies im vorherigen Post zu erwähnen. Wenn ich die Ausnahme abfange, sagt der Bericht, dass der Test bestanden hat, obwohl dies nicht der Fall war. Ich habe meinen Code auf –

Antwort

6

Der Code wie gepostet ist falsch. Für einen Anfang, class myClass(): soll class myClass: sein. if name == "main": sollte auch sein:

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

Abgesehen von diesen Problemen, dies nicht gelingt, weil getName() Ausnahme Anheben myExcOne und Ihr Test erwartet Ausnahme myExcTwo.

Hier ist ein Code, der funktioniert. Bitte bearbeiten Sie den Code in Frage, so dass es leicht ist es für uns in eine Python-Session zum Ausschneiden und Einfügen:

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() 
+0

aktualisiert. Hi mhawke, Der __main__ wurde im Copy-and-Paste-Prozess durcheinander gebracht. Für die myClass(), die ursprüngliche Klasse geerbt, so habe ich vergessen, die() zu löschen, wenn ich den kleinen Testfall gemacht. Der Test soll fehlschlagen. Ich versuche zu verstehen, wie sich das Tool verhält, wenn eine Assert fehlschlägt. Für meinen ursprünglichen Beitrag missverstand ich, dass das Tool eine Ausnahme auslösen soll, wenn eine Assert fehlschlägt. Ich habe den Code aktualisiert, um die Ausnahme abzufangen und nichts damit zu tun. Obwohl die Assert fehlschlägt, sagt der Bericht, dass sie bestanden hat. Brian –

5

mit einer beiseite starten, die () nach dem Klassennamen in einer class Aussage ist vollkommen richtig in der modernen Python - kein Fehler.

Auf dem Fleisch des Themas wird assertRaises(MyException, foo) dokumentiert Ausnahmen durch den Aufruf foo(), deren Typ nicht eine Unterklasse von MyException angehoben zu propagieren - es fängt nur MyException und Subklassen davon. Da Ihr Code eine Ausnahme von einem Typ auslöst und Ihr Test einen anderen nicht verwandten Typ erwartet, wird die ausgelöste Ausnahme wie in den Dokumenten des Moduls , here, propagieren. Ich zitiere: "Test wird bestanden, wenn eine Ausnahme ausgelöst wird." ist ein Fehler, wenn eine andere Ausnahme ausgelöst wird, oder fehlschlägt, wenn keine Ausnahme ausgelöst wird "- und" ist ein Fehler "bedeutet" propagiert die andere Ausnahme ".

Wenn Sie die Ausnahme abfangen, die sich in Ihrem try/except-Block ausbreitet, annullieren Sie den Fehler und es gibt nichts mehr, was unittest diagnostizieren könnte. Wenn Ihr Zweck darin besteht, diesen Fehler in einen Fehler zu verwandeln (eine strittige Strategie ...), sollte Ihr except Block self.fail aufrufen.

+0

Vielen Dank für Ihre Hilfe !!! Ich habe mein Missverständnis des Komponententests erst nach der Veröffentlichung verstanden. Mit dem obigen Code, wenn ich es ausführe, bekomme ich die Nachricht . Ich würde erwarten, dass es scheitert, aber verstehe, warum es die Botschaft gibt. Wenn ich im Block "except" self.fail hinzugefügt habe, wird eine weitere Ausnahme ausgelöst. Irgendwelche Vorschläge, um alle Tests laufen zu lassen und die Fehler am Ende zu melden? Ich habe aber ich bin mir nicht sicher, wie (oder wenn ich kann) zu den Ergebnissen komme. –

+0

alle Testmethoden laufen und melden Fehler (E) und Fehler (F) [die durch spezielle Ausnahmen tatsächlich diagnostiziert werden] mit dem normalen Unit-Test-Runner (unittest.main) - Ich bin überrascht zu hören, dass sich TextTestRunner verhält anders für Sie, da dies genau das ist, was unittest.main verwendet (über die unittest.TestProgram-Klasse), überprüfen Sie die Quellen ... Sie erhalten die erwarteten Ergebnisse w/unittest.main, oder? –

+0

Wenn ich den try/except-Block ausschließe und dann stoppt mein Debugger die Ausführung. Ich habe das Programm von einer Befehlszeile ausgeführt, es führte alle Tests durch und gab die Ergebnisse, die ich erwarte. Das ist, was ich gesucht habe. Aber wenn ich den Code ausführen würde, wie es oben aufgeführt ist, sagt es mir, dass es passiert, obwohl es fehlschlagen sollte. Ich mache mir darüber keine Sorgen, da das Ausführen des Komponententests von der Befehlszeile aus mich dazu bringt, was ich will. Nochmals vielen Dank für Ihre Hilfe. –

Verwandte Themen