Wie gehe ich mit mehreren behauptet, in einem einzigen Python-unittest?
Dies ist ein problem, das kam bei der Durchführung einer einzelnen Prüfung, die hatten mehrere unabhängige Ausfall-Modi, durch die mehrere output-streams. Ich wollte auch zeigen die Ergebnisse auf die Geltendmachung der Daten auf alle diese Modi unabhängig davon, welche zunächst gescheitert. Python-unittest hat keine solche Funktion außerhalb der unter Verwendung einer Suite zur Darstellung der einzelnen Tests, die inakzeptabel war, da meine einzigen test immer erforderlich, um ausgeführt werden als eine einzige Einheit; es einfach nicht einfangen der Natur der Sache.
Einem praktischen Beispiel testen ist ein Objekt, das erzeugt auch ein Protokoll. Sie wollen geltend machen, die Ausgabe der Methoden, aber Sie wollen auch, um die für die Geltendmachung der log-Ausgabe. Die beiden Ausgänge erfordern unterschiedliche tests, die ordentlich ausgedrückt, in zwei Lager behauptet Ausdrücken, aber Sie auch nicht wollen, dass der Ausfall eines zu verbergen, die möglichen Fehler der anderen in den test. So dass Sie wirklich brauchen, um zu testen beide gleichzeitig.
Ich zusammengeschustert diese nützlichen kleinen widget mein problem zu lösen.
def logFailures(fnList):
failurelog = []
for fn in fnList:
try:
fn()
except AssertionError as e:
failurelog.append("\nFailure %d: %s" % (len(failurelog)+1,str(e)))
if len(failurelog) != 0:
raise AssertionError(
"%d failures within test.\n %s" % (len(failurelog),"\n".join(failurelog))
)
Welches verwendet wird, etwa so:
def test__myTest():
# do some work here
logFailures([
lambda: assert_(False,"This test failed."),
lambda: assert_(False,"This test also failed."),
])
Das Ergebnis ist, dass logFailures() wirft eine Ausnahme, die enthält ein Protokoll aller Behauptungen, die großgezogen wurden in Methoden innerhalb der Liste.
Die Frage: dies hat Zwar den job, ich bin Links Fragen, ob es einen besseren Weg um dies zu umgehen, anders als mit zu gehen, um die Länge der erstellen von verschachtelten Suiten von tests und so weiter?
"Sie wollen auch nicht den Fehler eines zu verbergen, die möglichen Fehler der anderen in die Prüfung". Ja - ich will: diese sind unit-tests. Wenn einer der Tests fehlschlägt, korrigieren Sie die fehlerhaften und re-führen Sie die tests aus.
InformationsquelleAutor Eric Anderton | 2012-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stimme ich mit der vorherrschenden Meinung, dass man schreiben sollte eine Prüfmethode für jede Behauptung. Es gibt Situationen, wo Sie wollen, um zu überprüfen, mehrere Dinge in einem test-Methode. Hier ist meine Antwort, wie es zu tun:
Und hier sind einige Situationen, wo ich denke, es ist nützlich und nicht riskant:
1) Wenn Sie wollen test-code für verschiedene Gruppen von Daten. Hier haben wir eine add () - Funktion, und ich möchte um es zu testen mit ein paar Beispiel-Eingänge. Schreiben 3 test-Methoden für die 3 Datensätze Mittel wiederholen sich, die schlecht ist. Vor allem, wenn der Anruf war aufwändiger.:
2) Wenn Sie überprüfen möchten, mehrere Ausgänge einer Funktion. Ich möchte prüfen Sie jede Ausgabe, aber ich glaube nicht, dass ein Erster Fehler zu maskieren die anderen beiden.
3) Testen mit dem schweren setup-Kosten. Tests müssen schnell laufen, oder dass die Leute aufhören, Sie zu verwenden. Einige tests erfordern, dass eine db-oder Netzwerk-Verbindung, die dauert eine Sekunde, das wäre wirklich verlangsamen Ihren test. Wenn Sie die Prüfung der db-Verbindung selbst, dann werden Sie wahrscheinlich benötigen, um die Geschwindigkeit Treffer. Aber wenn Sie etwas testen nichts zu tun haben, das wollen wir langsam das setup für eine ganze Reihe von Prüfungen durch.
InformationsquelleAutor Winston
Fühlt sich an wie " over-engineering zu mir. Entweder:
Zwei asserts in einem Testfall. Wenn die erste assert schlägt fehl, es ist wahr, Sie wissen nicht, ob der zweite Geltendmachung übergeben oder nicht. Aber du bist zu fix den code sowieso, so fix es, und dann finden Sie heraus, wenn die zweite assert übergeben.
Schreiben zwei tests, um zu überprüfen, jede Bedingung. Wenn Sie Angst duplizierten code in den tests, steckte der Großteil des Codes in eine helper-Methode, die Sie aufrufen, von den tests.
InformationsquelleAutor Ned Batchelder
Mit einem untertest, die Ausführung würde nicht aufhören, nach dem ersten Ausfall
https://docs.python.org/3/library/unittest.html#subtests
Hier ein Beispiel mit zwei fail behauptet:
Ausgabe:
Können Sie einfach wickeln Teilprüfungen wie folgt
InformationsquelleAutor Vitalii Blagodir