Soll ich try catch in meinen Testmethoden verwenden?

18

Ich mache Unit-Tests.

Ich versuche eine Funktion zu testen.

Ich rufe es von meiner Testkomponente aus auf. Aber wenn die Remote-Funktion die Ausnahme nicht verarbeiten kann, wird auch meine Testerkomponente eine Ausnahme erhalten, denke ich.

Muss ich mir also Sorgen machen, dass meine Testerkomponente Ausnahmen enthält?

Vielen Dank.

BEARBEITEN:

PS:

Einen Fehler auszulösen ist gut, aber nur für andere Funktionen, nicht für Endbenutzer, bis es eine letzte Option ist!

OMG Ich habe ein Programmierungszitat geschrieben !!

Vikas
quelle
Ich bin neu im Testen und sollte nur das Verhalten der Funktion testen. Ich denke, es heißt Blackbox- und Whitebox-Test. Oh ich erinnere mich daran. Das habe ich am College gelernt!
Vikas
Welche Sprache und welches xUnit-Framework verwenden Sie speziell? Ich würde ja in einigen Fällen argumentieren.
Greg K
Ich verwende MXUnit mit MockBox und ColdBox für ColdFusion.
Vikas

Antworten:

23

Kurze Antwort: NEIN.

Fange keine Ausnahmen in Unit-Tests. Sie führen Unit-Tests durch, um Fehler und Situationen zu ermitteln, in denen Ausnahmen auftreten.

Das Unit-Test-Framework sollte Ausnahmen auf vernünftige Weise behandeln. Die meisten (wenn nicht alle) xUnit-Frameworks verfügen über ein Konstrukt, das bestimmte Ausnahmen erwartet , die Sie verwenden, wenn Sie eine bestimmte Ausnahmebedingung im zu testenden System auslösen möchten, und über einen Testdurchlauf, wenn die erwartete Ausnahme ausgelöst wird, aber fehlschlägt, wenn dies nicht der Fall ist.

mcottle
quelle
Ich denke, das Advanced Testing Framework kann mit Ausnahmen sehr gut umgehen, auch wenn ich feststelle, dass wir in Visual Studio Ausnahmen testen können, wie Sie es als "erwartete Ausnahme" bezeichnet haben. Es ist also gut zu wissen und zu teilen. Vielen Dank ..
Vikas
Manchmal möchten Sie überprüfen, ob eine Ausnahme ausgelöst wurde, da bei guten Tests nicht nur Fälle getestet werden, in denen etwas funktioniert, sondern auch Fälle, in denen dies fehlschlägt.
Deadalnix
1
Sie möchten Ausnahmen abfangen, da Sie die Situationen testen möchten, in denen Ausnahmen auftreten (insbesondere Ihre eigenen Ausnahmen). Wenn Sie Code schreiben, der unter bestimmten Bedingungen mit einer Ausnahme fehlschlägt, sollten diese Bedingungen Teil Ihrer Testsuite sein und daher getestet werden. Im Rahmen dieser Tests sollten diese Ausnahmen erfasst und analysiert werden.
Jwenting
1
@Jwenting Lesen Sie den zweiten Absatz - Unit - Test - Frameworks , die Ausnahmen zu fangen und ermöglichen Tests , wenn bestimmte Ausnahmen angehoben werden passieren und nicht , wenn sie es nicht sind
mcottle
5

(Im Gegensatz zur Antwort von mcottle) Lange Antwort: NEIN ... die meiste Zeit

Wenn Sie sagen, dass Sie von einem Test erwarten, dass er eine bestimmte Ausnahme auslöst, wissen Sie, wann JEDE Zeile in diesem Test diese bestimmte Ausnahme auslöst.

Das ist nicht ganz dasselbe wie zu wissen, dass die getestete Methode die Ausnahme auslöst.

Wenn Ihr Test das Einrichten eines Objekts oder Kontexts umfasst (innerhalb des Tests, nicht innerhalb der Framework-Version von SetUp), ist es möglicherweise besser, die einzelne Zeile, die Sie tatsächlich testen möchten, mit einem Try / Catch-Befehl, möglicherweise mit einem Helfer, zu umschließen.

Zum Beispiel,

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

und dann

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

Wenn dieser Test fehlschlägt, weiß ich, dass meine getestete Methode die Ausnahme ausgelöst hat und nicht irgendetwas im zufälligen Setup-Zeug.

(Sie sollten versuchen, zufällige Setup-Aufgaben zu vermeiden. Manchmal ist es einfacher, Setup-Code im Test zu haben.)

Frank Shearar
quelle
Gutes Beispiel! Ich versuche sehr vorsichtig zu sein, wenn es darum geht, die "Test" -Phase nur auf den genauen Test zu beschränken, aber ich werde mich an diesen Trick erinnern, wenn ich einfach keinen Weg finde, das durchzuziehen (z. B. beim Testen auf Rennbedingungen) und müssen "Setup" in der Nähe der "Test", um die Bedingung zu treffen).
Ethel Evans
1

Im Allgemeinen sollten Sie nur die Ausnahme auslassen, und das Test-Framework gibt Ihnen einen schönen Bericht mit allen benötigten Informationen.


Es wird jedoch erwartet, dass wir in der TDD-Methodik die folgenden Schritte ausführen:

  1. Schreibe einen Test
  2. Beobachten Sie, wie es fehlschlägt, und machen Sie den Fehler verständlich
  3. Korrigieren Sie den Code
  4. Refactor den Code und den Test

Wenn Sie eine Ausnahme auslassen und der Fehler klar ist, ist dies in Ordnung. Aber manchmal ist die Ausnahme dunkel oder sogar irreführend. Wie können Sie das in Ihrem Code belassen (für Sie später, wenn Sie es vergessen haben, oder für ein Teammitglied, das viel Zeit verlieren wird, um das Problem herauszufinden)? Daher lautet meine Richtlinie: " Wenn es erforderlich ist, einen Fehler zu beheben, müssen Sie die Ausnahme abfangen ".

KLE
quelle