2009-07-27 3 views
2

In meiner Firma schreiben wir eine Reihe von Komponententests. Was wir gerne gemacht hätten, wäre, dass die Komponententests ausgeführt werden und wenn es am Ende des Tests gelingt oder scheitert, können wir das irgendwo schreiben, aber wir wollen diese Logik nicht bei jedem Test verwenden.Wie schreibe ich NUnit-Komponententests, ohne sie mit try catch-Anweisungen zu umgeben?

Irgendeine Idee, wie wir nur Tests schreiben könnten, ohne den Inhalt des Tests mit der Try-Catch-Logik zu umgeben, die wir verwendet haben?

Antwort

2

MSTest verfügt über TestCleanup, das nach jedem Test ausgeführt wird. In NUnit ist das zu verwendende Attribut TearDown (nach jedem Test) oder TestFixtureTearDown (nachdem alle Tests vollständig sind). Dies wird nach dem Ende jedes Tests ausgeführt.

Wenn Sie möchten, dass etwas nur für den Fall ausgeführt wird, dass ein Test bestanden wird, könnten Sie eine Membervariable shallRexerMethod haben, die vor jedem Test auf false initialisiert wird und am Ende des Tests in true geändert wird. Und auf dem TearDown, führen Sie es nur in Abhängigkeit von diesem Variablenwert

0

NUnit Assert-Anweisungen alle haben eine Option, eine Nachricht für jeden Test für den Fall zu drucken, wenn es fehlschlägt.

Obwohl, wenn Sie möchten, dass es irgendwo am Ende jedes Tests etwas ausgibt, können Sie es im Teardown jeder Methode einrichten. Setzen Sie die Zeichenkette einfach auf das, was Sie im Test selbst geschrieben haben möchten, und während des Teardowns (was nach jedem Test geschieht), kann es damit machen, was Sie wollen.

Ich bin ziemlich sicher Teardown tritt auf, selbst wenn eine Ausnahme ausgelöst wird. Das sollte tun, was du willst.

2

Ich bin mir nicht ganz sicher, was Sie hier zu tun versuchen. Willst du damit sagen, dass du es in eine try/catch packst, so dass du es abfangen kannst, wenn eine Ausnahme auftritt, und dies zu protokollieren? Wenn ja, dann ist es wahrscheinlich eine bessere Möglichkeit, NUnit dazu zu bringen, eine Ausgabedatei zu schreiben und diese zu verwenden. Ich habe NUnit seit ungefähr einem Jahr nicht mehr benutzt, aber IIRC kann seine Ausgabe mit der/out-Direktive in jede beliebige Datei umleiten.

Wenn es einen Grund gibt, warum Sie haben, um es so zu protokollieren, wie Sie sagen, dann müssen Sie entweder Ihren benutzerdefinierten Code zu jedem Test hinzufügen, oder haben einen gemeinsamen "Läufer", der Ihren Code (für jeder Test) als anonyme Methode und führt es in einem einzigen Versuch..Catch. Das würde verhindern, dass Sie das try..catch für jeden Test wiederholen müssen.

Entschuldigung, wenn ich die Frage missverstanden habe.

3

ich Ihnen raten, etwas tun, wie folgt aus:

[Test] 
public void FailBecauseOfException() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    catch (Exception e) 
    { 
     Assert.Fail(e.Message); 
    } 
} 

Es besteht keine Notwendigkeit dafür. Die Tests werden automatisch fehlschlagen, wenn sie eine Ausnahme auslösen. Beispielsweise liefert der folgende Test als Scheitern verurteilt:

[Test] 
public void FailBecauseOfException() 
{ 
    throw new Exception(); 
} 
1

Wenn Ihr Gerät Testmethode das Szenario umfasst, in dem Sie Ausnahmen geworfen werden, verwenden Sie das Attribut ExpectedException erwarten. Es gibt einen Beitrag hier auf SO über die Verwendung dieses Attributs.

Expect exceptions in nUnit...

0

Das Problem, das Sie haben, ist, dass die NUnit Assert * Methoden wird eine AssertionException werfen, wenn eine Assertion fehlschlägt -. Aber es tut nichts anderes. Es sieht also nicht so aus, als könnten Sie außerhalb des Komponententests prüfen, ob der Test fehlgeschlagen ist oder nicht.

Die einzige Alternative, die ich mir vorstellen kann, ist die Verwendung von AOP (Aspect Oriented Programming) mit einem Werkzeug wie PostSharp. Mit diesem Werkzeug können Sie Aspekte erstellen, die auf bestimmte Ereignisse einwirken können. Zum Beispiel:

public class ExceptionDialogAttribute : OnExceptionAspect 
{ 
    public override void OnException(MethodExecutionEventArgs eventArgs) 
    { 
    string message = eventArgs.Exception.Message; 
    Window window = Window.GetWindow((DependencyObject) eventArgs.Instance); 
    MessageBox.Show(window, message, "Exception"); 
    eventArgs.FlowBehavior = FlowBehavior.Continue; 
    } 
} 

Dieser Aspekt ist Code, der ausgeführt wird, wenn eine Ausnahme ausgelöst wird:

[ExceptionDialog] 
[Test] 
public void Test() 
{ 
    assert.AreEqual(2, 4); 
} 

Da der obige Test eine Ausnahme ausgelöst wird, läuft der Code in ExceptionDialogAttribute. Sie können Informationen über die Methode abrufen, z. B. ihren Namen, damit Sie sie in einer Datei protokollieren können.

Es ist schon lange her, seit ich PostSharp benutzt habe, also lohnt es sich, die Beispiele anzuschauen und damit zu experimentieren.

Verwandte Themen