Sollte ich Ausnahmen erzwingen, um sie zu testen?

8

Ich habe diese Methode in meiner Datenzugriffsklasse und ich habe einen Komponententest, um sicherzustellen, dass es richtig funktioniert, aber mein Test testet die Ausnahme nicht, also ist meine Frage, sollte ich einen neuen Test erstellen, um die Ausnahme zu erzwingen oder sollte ich nur darauf vertrauen, dass der catch-Block im Falle einer Ausnahme gut funktioniert? Ist es die Mühe wert?

Hier ist ein Beispiel:

%Vor%     
Hannoun Yassir 26.09.2009, 18:16
quelle

8 Antworten

11

Idealerweise sollten Sie versuchen, jede mögliche Codezeile zu testen ... das würde bedeuten, eine Ausnahme zu erzwingen, um den Ausnahmebehandler zu testen und sicherzustellen, dass dies ordnungsgemäß funktioniert.

In der Praxis wird es immer einige Codezeilen geben, die nicht behandelt werden. Allerdings würde ich Ausnahmen durch Mocking erzwingen, um Ausnahmebehandler zu testen, die Ihrer Meinung nach besonders kritisch sind oder die möglicherweise in der Produktion passieren. p>     

Reed Copsey 26.09.2009, 18:21
quelle
9

Im Linux-Kernel befinden sich 80% der Fehler in den Treibern im Fehlerbehandlungscode.

Außergewöhnliche Behandlung ist die Quelle vieler Fehler, und Sie sollten sicher alle Ausnahmepfade testen.

Natürlich können Sie nicht jede Codezeile testen. Aber die Statistik sagt, dass Programmierer der Ausnahmebehandlung weniger Aufmerksamkeit schenken, also müssen Sie sie gründlich testen.

    
Pavel Shved 26.09.2009 18:30
quelle
4

Hier sind meine Regeln für das ideale Testen des Fehlerverhaltens:

  • Wenn Sie Abhängigkeiten verwenden, die Ausnahmen auslösen könnten, sollten Sie Komponententests einschließen, die dafür sorgen, dass Ihre Mocks Ausnahmen auslösen.
  • Wenn Ihr Code unter bestimmten Bedingungen eine Ausnahme auslöst, sollten Sie Komponententests einschließen, die solche Bedingungen festlegen.

Der erste zeigt Ihnen, wie sich Ihr Code bei einem externen Fehler verhält, und führt häufig zu Überlegungen, was zu tun ist. In allen Situationen ist es gut zu sehen, was tatsächlich passiert. Das zweite stellt nur sicher, dass Sie halten, was Sie versprechen, soweit die Fehler, die Ihr Code erkennen sollte, als außergewöhnlich gelten. Es ist nicht anders als andere Funktionen in Ihrem Code zu testen.

Bevor Sie die Unit-Test-Suite vollständig betrachten, sollten Sie einen Blick auf Code-Coverage des getesteten Codes werfen. Für nicht-trivialen Code gibt es fast immer eine Möglichkeit, meinen Code-Zweig, den meine Unit-Tests nicht abdecken, oder schlimmer noch, ein Verhalten, das ich nicht beabsichtigt habe. Überraschenderweise ist die Lösung, diesen Code zu entfernen, anstatt weitere Tests hinzuzufügen. Nur Craft zurückgelassen, wenn es früher flügelte.

Ich sage nicht unbedingt, dass man eine 100% ige Abdeckung erreichen sollte, aber man sollte Code-Coverage-getriebene Unit-Tests durchführen, weil es ein visueller Weg ist, das existierende Code-Verhalten zu verstehen und aufzudecken. Wenn Sie es sich einmal anschauen, können Sie neue Ideen bekommen, wie Code umstrukturiert werden kann, um Prinzip der einfachen Verantwortlichkeit und Trennung von Bedenken .

    
Christian 26.09.2009 19:41
quelle
3

Sie könnten Ihre Sitzung dazu bringen, sich über das Auslösen einer Ausnahme lustig zu machen, aber es ist wenig nötig zu testen, dass ein Catch funktioniert.

Es ist nicht falsch, einen Test zu schreiben, um zu überprüfen, ob eine Transaktion rückgängig gemacht wird, wenn ein Update eine Ausnahme auslöst, aber ich denke, dass es zu weit geht.

Vielleicht würde ein ausgeklügelter Fall es rechtfertigen.

Würdest du bei einer bestimmten Ausnahme nicht zurückrollen?

    
dove 26.09.2009 18:21
quelle
3

Ich hoffe, die Transaktion wird Rollback sein, wenn Displose () vor Commit () aufgerufen wird, brauchen Sie den Catch überhaupt?

Wie in anderen Fällen, wenn Ihr Fang mehr tut als nur das Problem zu protokollieren, denke ich, dass es Unit-getestet werden sollte. Lassen Sie sich jedoch nicht davon abhalten, einen Unit-Test durchzuführen.

    
Ian Ringrose 26.09.2009 19:06
quelle
1

Aus dem Namen der Ausnahme (HibernateException) würde ich denken, dass es kein Ausnahmefall ist. So kann es während des normalen Betriebs passieren. Wenn das der Fall ist, würde ich einen Test machen, der die Ausnahme verursacht, um sicherzustellen, dass es richtig gehandhabt wird.

    
grigy 26.09.2009 18:22
quelle
1

Ich würde sicherlich jede spezielle Ausnahme testen, die abgefangen und behandelt wird. Zumindest haben Sie einen Ausführungspfad durch Ihren Abwicklungscode, der Ihnen etwas Trost geben sollte, dass nichts Seltsames passieren wird, wenn Sie jemals während der Laufzeit auf eine solche Ausnahme stoßen.

Denken Sie daran, dass Sie nur den Code testen müssen, den Sie verwenden möchten.

    
MikeJ 26.09.2009 19:11
quelle
1

Ich hoffe, Sie würden transaction.Rollback() separat mit den Tests testen, die alle denkbaren Situationen ausschöpfen. Vorausgesetzt, dass die Tests erschöpfend sind, würde ich wahrscheinlich keine Ausnahme machen, da es nichts anderes im Handler gibt.

    
ilya n. 26.09.2009 19:40
quelle

Tags und Links