2015-06-03 12 views
9

Warum hat TestNG die Möglichkeit zu prüfen, ob eine von mehreren Ausnahmen ausgelöst wird? Soweit ich weiß, unterstützt JUnit nur eine erwartete Ausnahme. Betrachten Sie die folgenden TestNG Dummy-Beispiele, in denen beiden Tests bestanden werden:Warum lässt TestNG mehrere erwartete Ausnahmen zu?

@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class }) 
public void throwsNullPointer() { 
    throw new NullPointerException(); 
} 

@Test(expectedExceptions = { NullPointerException.class, IllegalArgumentException.class }) 
public void throwsIllegalArgument() { 
    throw new IllegalArgumentException(); 
} 

Mein erster Eindruck ist, dass es möglich sein soll, aus dem im Test befindlichen Code abzuleiten genau die Ausnahme, die erwartet wird. Es muss jedoch eine Designentscheidung von den Leuten geben, die hinter TestNG stehen.

Ist es vielleicht Unterstützung für das Testen von Code mit zufälligen Features, die nicht abgespottet werden können? Hat jemand eine Idee und vorzugsweise ein realistisches Szenario?

Antwort

4

Warum lässt TestNG mehrere erwartete Ausnahmen zu?

Ich denke, dass der wahrscheinlichste Grund ist, dass Leute nach der Funktion gefragt haben ... und es ist eine vernünftige Sache zu bieten.

Ich kann an einige Anwendungsfälle denken.

  • Es benötigt werden, wenn Tests für das Schreiben von Code, der nicht-deterministisch ist, und die Nicht-Determinismus wirkt sich auf die geworfen Ausnahmen.

  • Es kann erforderlich sein, wenn mehrere Implementierungen einer API getestet werden, die sich möglicherweise in Bezug auf ausgelöste Ausnahmen anders verhalten. Die Implementierungen können verschiedene Klassen oder verschiedene Versionen derselben Klasse sein.

  • Es wird möglicherweise benötigt, wenn Code getestet wird, der von Software von Drittanbietern abhängt, und mehrere Versionen dieser Software mit unterschiedlichem Verhalten bewältigen muss, das für den Test sichtbar ist.

  • Dies kann erforderlich sein, wenn "Black Box" -Tests einer API durchgeführt werden, bei denen die Schnittstellenspezifikation unklar ist.


Mein erster Eindruck ist, dass es möglich sein sollte, genau aus dem im Test befindlichen Code abzuleiten, die Ausnahme, die erwartet wird.

Das setzt voraus, dass Sie Zugriff auf den Quellcode haben. Außerdem fehlt bei der Anpassung der Tests an den Code der Punkt, dass Sie mit der Spezifikation und nicht mit dem Code testen sollten.

Wenn Sie die Möglichkeit haben, mehrere Ausnahmen zuzulassen, vermeiden Sie dies. (Und Sie haben diese Option nicht, dann müssen Sie (der Testschreiber) Ausnahmen innerhalb des Testfalls abfangen und testen ... wenn mehrere Ausnahmen möglich sind.)

+0

Nun, _derive aus dem code_ war vielleicht schlecht von mir formuliert. Natürlich sollten Tests codiert werden, um den Vertrag zu testen. Ich habe es wahrscheinlich so ausgedrückt, da ich meistens Komponententests für meinen eigenen Code schreibe. Alle fairen und gültigen Punkte, +1 und höchstwahrscheinlich werde ich Ihre Antwort in Kürze annehmen. – Magnilex

4

Es ist nicht ungewöhnlich, dass Code in der Lage ist werfen verschiedene Arten von Ausnahmen, die einer der Gründe ist, warum es möglich, solche Ausnahmen in einer catch Anweisung zum Einsturz:

catch(IOException | InterruptedException ex) { 

Daher ist es mir natürlich zu spüren lassen expectedExceptions mehrere Ausnahmen zu ermöglichen.

Ich benutze dies nicht sehr oft, um ehrlich zu sein, und es kompliziert eine Funktion, die ich etwas später hinzugefügt, die Sie testen können, dass die Nachricht der Ausnahme eine reguläre Ausnahme entspricht. Es ist wahrscheinlich eine dieser Funktionen, die ich anders implementieren würde, wenn ich es wiederholen könnte.

+0

Es klingt wie Sie für diese Designentscheidung verantwortlich waren? Mein Hauptgedanke war, dass, auch wenn mehrere verschiedene Ausnahmen geworfen werden könnten, es in den meisten Fällen möglich sein sollte, genau zu bestimmen, welche Ausnahme zu erwarten ist. Nur aus Neugier, wie würdest du es heute umsetzen? – Magnilex

+2

Nun, ja, ich habe TestNG erstellt :-) Heute würde ich nur eine Ausnahme zulassen und Benutzer eine Testmethode pro Ausnahme schreiben lassen, um getestet zu werden. –

Verwandte Themen