Ich möchte einen Test schreiben, um festzustellen, dass eine Ausnahme unter bestimmten Umständen nicht ausgelöst wird.
Es ist einfach zu testen, ob eine Ausnahme ausgelöst wird ...
sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
... aber wie kann man das Gegenteil tun .
So etwas wie das, wonach ich suche ...
sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath)
python
unit-testing
Glaukon
quelle
quelle
assertNotRaises
Methode implementieren können, die 90% ihres Codes / Verhaltens mitassertRaises
ungefähr 30 Codezeilen teilt. Siehe meine Antwort unten für Details.hypothesis
, um sicherzustellen, dass sie für alle Arten von Eingaben dieselbe Ausgabe erzeugen, während ich die Fälle ignoriere, in denen das Original eine Ausnahme auslöst.assume(func(a))
funktioniert nicht, da die Ausgabe ein Array mit einem mehrdeutigen Wahrheitswert sein kann. Ich möchte also nur eine Funktion aufrufen und abrufen,True
wenn sie nicht fehlschlägt.assume(func(a) is not None)
funktioniert ich denkeAntworten:
quelle
ValueError
, aberValueError
stattdessen ausgelöst wird , muss Ihr Test mit einer Fehlerbedingung beendet werden, nicht mit einer Fehlerbedingung. Wenn Sie dagegen denselben Code ausführen würdenKeyError
, wäre dies ein Fehler und kein Fehler. In Python werden - anders als in einigen anderen Sprachen - Ausnahmen routinemäßig für den Kontrollfluss verwendet. Deshalb haben wir in derexcept <ExceptionName>
Tat die Syntax. In dieser Hinsicht ist die Lösung von user9876 einfach falsch.Dies ist die Standardannahme - Ausnahmen werden nicht ausgelöst.
Wenn Sie nichts anderes sagen, wird dies in jedem einzelnen Test vorausgesetzt.
Sie müssen dafür keine Behauptung schreiben.
quelle
Rufen Sie einfach die Funktion auf. Wenn eine Ausnahme ausgelöst wird, kennzeichnet das Unit-Test-Framework dies als Fehler. Möglicherweise möchten Sie einen Kommentar hinzufügen, z.
quelle
xfail
Dekorateur in pytest.Ich bin das Originalplakat und habe die obige Antwort von DGH akzeptiert, ohne sie zuvor im Code verwendet zu haben.
Als ich es benutzte, wurde mir klar, dass es ein wenig optimiert werden musste, um das zu tun, wofür ich es brauchte (um der DGH gegenüber fair zu sein, sagte er / sie "oder ähnliches"!).
Ich dachte, es lohnt sich, den Tweak hier zum Nutzen anderer zu veröffentlichen:
Ich habe hier versucht sicherzustellen, dass pySourceAidExceptions.PathIsNotAValidOne ausgelöst wird, wenn versucht wird, ein Anwendungsobjekt mit einem zweiten Argument von Leerzeichen zu instanziieren.
Ich glaube, dass die Verwendung des obigen Codes (der stark von der Antwort der DGH abhängt) dies tun wird.
quelle
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath)
sollte den Job in diesem Fall machen.Sie können definieren,
assertNotRaises
indem Sie etwa 90% der ursprünglichen Implementierung vonassertRaises
imunittest
Modul wiederverwenden . Mit diesem Ansatz erhalten Sie eineassertNotRaises
Methode, die sich, abgesehen von ihrem umgekehrten Fehlerzustand, identisch verhältassertRaises
.TLDR und Live-Demo
Es stellt sich als überraschend einfach heraus, eine
assertNotRaises
Methode hinzuzufügenunittest.TestCase
(ich habe ungefähr viermal so lange gebraucht, um diese Antwort zu schreiben wie den Code). Hier ist eine Live-Demo derassertNotRaises
Methode in Aktion . Genau wieassertRaises
können Sie entweder eine aufrufbare und args passieren zuassertNotRaises
, oder Sie können es in einer verwendenwith
Aussage. Die Live-Demo enthält Testfälle, die dies demonstrierenassertNotRaises
wie beabsichtigt funktioniert.Einzelheiten
Die Umsetzung von
assertRaises
inunittest
ist ziemlich kompliziert, aber mit ein wenig cleverer Unterklasse können Sie den Fehlerzustand überschreiben und umkehren.assertRaises
ist eine kurze Methode, die im Grunde nur eine Instanz derunittest.case._AssertRaisesContext
Klasse erstellt und zurückgibt (siehe Definition imunittest.case
Modul). Sie können Ihre eigene_AssertNotRaisesContext
Klasse definieren, indem Sie_AssertRaisesContext
ihre__exit__
Methode unterordnen und überschreiben :Normalerweise definieren Sie Testfallklassen, indem Sie sie erben lassen
TestCase
. Wenn Sie stattdessen von einer Unterklasse erbenMyTestCase
:Allen Ihren Testfällen steht jetzt die
assertNotRaises
Methode zur Verfügung.quelle
traceback
deineelse
Aussage?import
. Es ist festkann geändert werden, wenn Sie Parameter akzeptieren müssen.
Anruf wie
quelle
Ich fand es nützlich, Affen
unittest
wie folgt zu patchen :Dies verdeutlicht die Absicht beim Testen auf das Fehlen einer Ausnahme:
Dies vereinfacht auch das Testen in einer Schleife, was ich oft mache:
quelle
assertMayRaise
zuunittest.TestSuite
Ihnen kann es nur einen Teil der so tutunittest
Bibliothek.Wenn Sie eine Ausnahmeklasse übergeben,
assertRaises()
wird ein Kontextmanager bereitgestellt. Dies kann die Lesbarkeit Ihrer Tests verbessern:Auf diese Weise können Sie Fehlerfälle in Ihrem Code testen.
In diesem Fall testen Sie das
PathIsNotAValidOne
wird ausgelöst, wenn Sie ungültige Parameter an den Anwendungskonstruktor übergeben.quelle
Sie können so versuchen. try: self.assertRaises (None, function, arg1, arg2) außer: pass Wenn Sie keinen Code in den try-Block einfügen, wird die Ausnahme 'AssertionError: None not ausgelöst "und der Testfall wird fehlgeschlagen. Der Testfall wird bestanden Wenn es in den Try-Block gestellt wird, ist das erwartete Verhalten.
quelle
Eine einfache Möglichkeit, um sicherzustellen, dass das Objekt fehlerfrei initialisiert wird, besteht darin, die Typinstanz des Objekts zu testen.
Hier ist ein Beispiel :
quelle