it-swarm.dev

Sollte ich try catch in meinen Testmethoden verwenden?

Ich mache Unit-Tests.

Ich versuche eine Funktion zu testen.

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

Sollte ich mir also Sorgen machen, dass meine Testerkomponente eine Ausnahme darstellt?

Vielen Dank.

EDIT :

PS:

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

OMG Ich habe ein Programmierzitat geschrieben !!

19
Vikas

Kurze Antwort: NEIN.

Fangen Sie keine Ausnahmen in Unit-Tests. Sie führen Unit-Tests durch, um Fehler und Situationen zu finden, in denen Ausnahmen ausgelöst werden.

Das Unit-Test-Framework sollte Ausnahmen auf vernünftige Weise behandeln. Die meisten (wenn nicht alle) xUnit-Frameworks haben ein Konstrukt für erwarten bestimmte Ausnahmen, die Sie verwenden, wenn Sie eine bestimmte Ausnahmebedingung im zu testenden System auslösen möchten, und haben einen Testdurchlauf, wenn die erwartete Ausnahme ausgelöst wird aber scheitern, wenn es nicht tut.

23
mcottle

(Im Gegensatz zu Mcottles Antwort) Lange Antwort: NEIN ... die meiste Zeit

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

Das ist nicht ganz das Gleiche 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, in einen Versuch/Fang einzuschließen mit einem Helfer.

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 etwas im zufälligen Setup-Material.

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

5
Frank Shearar

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


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

  1. Schreiben Sie 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 Ihren Code aufnehmen (für Sie später, wenn Sie es vergessen haben, oder für ein Teammitglied, das viel Zeit verliert, um das Problem herauszufinden)? Meine Richtlinie lautet also: "Wenn ein Fehler behoben werden muss, müssen Sie die Ausnahme abfangen".

1
KLE