Testing in Python – wie man assertRaises bei der Prüfung mit unittest verwenden?

Ich versuche, einen einfachen Test in Python mit unittest zu machen, um zu sehen, ob eine Klasse eine Ausnahme auslöst, wenn es einen ungeeigneten Eingang für den Konstruktor erhält. Die Klasse sieht so aus:

class SummaryFormula: def __init__( self, summaryFormula): self.atoms = {} for atom in re.finditer( "([AZ][az]{0,2})(\d*)", summaryFormula): symbol = atom.group(1) count = atom.group(2) if pocet != "": self.atoms[ symbol] = int(count) else: self.atoms[ symbol] = 1 

Mein Test folgt:

  class ConstructorTestCase(unittest.TestCase): def testEmptyString(self): self.assertRaises(TypeError, ukol1.SummaryFormula(), "testtest") if __name__ == '__main__': unittest.main() 

Alles was ich will ist der Test zu scheitern, was bedeutet, dass die Ausnahme von ungeeigneten Input für Konstruktor nicht behandelt wird.

Stattdessen bekomme ich einen Fehler: __init__() takes exactly 2 arguments (1 given) .

Was vermisse ich? Was ist das zweite Argument, das ich angeben sollte?

Auch welche Art von Error sollte ich verwenden, um Ausnahme zu behandeln, dass eine Eingabe, die nicht durch meine regexp übereinstimmt, an den Konstruktor übergeben wurde?

Vielen Dank, Tomas

4 Solutions collect form web for “Testing in Python – wie man assertRaises bei der Prüfung mit unittest verwenden?”

Das ist, weil deine Klasse einen Parameter benötigt, während sie das Objekt instanziiert

Während du vorüberkommst

 ukol1.SummaryFormula() 

Du hättest den Parameter summaryFormula an sie weitergeben sollen.

 ukol1.SummaryFormula(someSummaryFormula) 

Auch die Verwirrung ist, weil dein Klassenname SummaryFormula ist und der Parameter, den du an __init__ ist auch SummaryFormula

Oder sollte das sein

 self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest") 

assertRaises ist ein wenig verwirrend, weil man es dem assertRaises geben muss, kein Ausdruck, der den Anruf macht.

Ändern Sie Ihren Code zu:

 self.assertRaises(TypeError, ukol1.SummaryFormula, "testtest") 

In deinem Code rufst du den Konstruktor selbst auf und es wirft eine Ausnahme auf, nicht genug Argumente zu haben. Stattdessen musst du assertRaises die aufrufbare (ukol1.SummaryFormula) geben, und die Argumente, um es mit ("testtest") zu nennen. Dann kann man es anrufen, fangen und auf Ausnahmen prüfen.

Eine mehr pythonische Art ist, with Befehl zu verwenden (hinzugefügt in Python 2.7):

 with self.assertRaises(SomeException): do_something() 

Dokumentation: https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertRaises

Ein allgemeiner alternatives Format ist

 args=['testtest'] kwargs = {} self.assertRaises(TypeError, ukol1.SummaryFormula, *args, **kwargs) 

Dies ist nützlich, wenn Ihr Konstruktor polymorph ist und Sie wollen eine Liste von verschiedenen Möglichkeiten der falschen Schreibweise der Argumente, zB:

 arg_lists = [ ['testtest'], ['anothertest'], ['YAT'], ] for args in arg_lists: self.assertRaises(TypeError, ukol1.SummaryFormula, *args) 
  • Gleiche Tests über viele ähnliche Datendateien
  • Python unittest.TestCase Ausführungsauftrag
  • Fortsetzung in Pythons Unbekannter, wenn eine Behauptung fehlschlägt
  • Python unbestimmt vorübergehende Argumente
  • Lernen Sie Python die Hard Way, Ex 49: Vergleichen von Objekten mit assert_equal
  • Python unittest: Reporting Ausnahme als Misserfolg
  • Python Unittest Reporting in HTML
  • Was ist der richtige Weg, um Python-Units in Suiten zu organisieren?
  • Übergeben Sie einen Python-Unit-Test, wenn eine Ausnahme nicht erhöht wird
  • Unertest setUp / tearDown für mehrere Tests
  • Ist es möglich, dass ein Unit-Test behauptet, dass eine Methode sys.exit ()
  • Python ist die beste Programmiersprache der Welt.