1230 Stimmen

Wie testet man, dass eine Python-Funktion eine Ausnahme auslöst?

Wie kann man einen Unittest schreiben, der nur dann fehlschlägt, wenn eine Funktion keine erwartete Ausnahme auslöst?

2voto

mobius-crypt Punkte 57

Dies wird TypeError auslösen, wenn stock_id in dieser Klasse auf einen Integer gesetzt wird. Der Test ist erfolgreich, wenn dies der Fall ist und schlägt ansonsten fehl.

def set_string(prop, value):
   if not isinstance(value, str):
      raise TypeError("i told you i take strings only ")
   return value

class BuyVolume(ndb.Model):
    stock_id = ndb.StringProperty(validator=set_string)

from pytest import raises
buy_volume_instance: BuyVolume = BuyVolume()
with raises(TypeError):
  buy_volume_instance.stock_id = 25

-1voto

Joy Singhal Punkte 1

Unit-Tests mit Unittest wären vorzuziehen, aber wenn Sie eine schnelle Lösung wünschen, können wir die Ausnahme abfangen, sie einer Variablen zuweisen und prüfen, ob diese Variable eine Instanz der Ausnahmeklasse ist.

Gehen wir davon aus, dass unsere schlechte Funktion einen ValueError auslöst.

    try:
      bad_function()
    except ValueError as e:
      assert isinstance(e, ValueError)

-6voto

RUser4512 Punkte 978

Während alle Antworten völlig in Ordnung sind, suchte ich nach einer Möglichkeit zu testen, ob eine Funktion eine Ausnahme ausgelöst hat, ohne sich auf Unit-Testing-Frameworks zu verlassen und Testklassen schreiben zu müssen.

Am Ende habe ich Folgendes geschrieben:

def assert_error(e, x):
    try:
        e(x)
    except:
        return
    raise AssertionError()

def failing_function(x):
    raise ValueError()

def dummy_function(x):
    return x

if __name__=="__main__":
    assert_error(failing_function, 0)
    assert_error(dummy_function, 0)

Und es scheitert an der richtigen Linie:

Traceback (most recent call last):
  File "assert_error.py", line 16, in <module>
    assert_error(dummy_function, 0)
  File "assert_error.py", line 6, in assert_error
    raise AssertionError()
AssertionError

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X