2016-06-06 7 views
1

Ich habe viele Tests in diesem Format writen:Verfahren zur Behandlung von Ausnahmen in mstest

[TestMethod] 
public void TestMethod1() 
{ 
    try 
    { 
     DoShomething(); 
    } 
    catch (Exception e) 
    { 
     WriteExceptionLogWithScreenshot(e); 
    } 
} 

[TestMethod] 
public void TestMethod2() 
{ 
    try 
    { 
     DoAnotherShomething(); 
    } 
    catch (Exception e) 
    { 
     WriteExceptionLogWithScreenshot(e); 
    } 
} 

würde Ich mag diese Ausnahmebehandlung so etwas wie

[TestCleanup] 
public void Cleanup() 
{ 
    // find out if an exception was thrown and run WriteExceptionLogWithScreenshot(e) 
} 

mit vereinigen Dann könnte ich mit dem Schreiben vermeiden Versuchen Sie, Blöcke in allen Methoden zu fangen.

Unterstützt mstest so etwas? Hat jemand eine Idee darüber, was ich tun könnte?

Antwort

3

Das ist einfacher:

private void TryTest(Action action) 
    { 
     try 
     { 
      action(); 
     } 
     catch (Exception e) 
     { 
      WriteExceptionLogWithScreenshot(e); 
      throw; 
     } 
    } 

    [TestMethod] 
    public void TestMethod1() 
    { 
     TryTest(new Action(() => 
     { 
      DoSomething(); 
     } 
     )); 
    } 

    [TestMethod] 
    public void TestMethod2() 
    { 
     TryTest(new Action(() => 
     { 
      DoAnotherSomething(); 
     } 
     )); 
    } 

Seien Sie sicher, dass die Ausnahme erneut zu werfen, damit der Test nicht bestanden. Beachten Sie den Wurf in den Fang.

+1

, wenn 'DoSomething()' ein Verfahren ist, dass Sie Aufruf des 'TryTest vereinfachen können()' verwenden Methodengruppe: 'TryTest (DoSomething)'; –

+0

Obwohl diese Lösung funktioniert, würde ich eine Lösung in MSTest bevorzugen. Abgesehen davon, dass meine realen Methoden Parameter mit verschiedenen Typen zwischen ihnen erhalten, würde ich dafür eine komplexere Struktur benötigen. – Thiago

+0

Ich werde diesen Vorschlag als Lösung markieren, denn schließlich habe ich das in meinen Tests gemacht. Vielen Dank! – Thiago

0

Während es eine einfache und (thread) sichere Alternative ist, den Testcode in ein Lambda wie Kip's Antwort zu übertragen, habe ich festgestellt, dass es den Stack-Trace etwas schwieriger zu lesen macht, da Sie immer das anonyme lmbda haben steckte dort drin. Außerdem erfordert es eine andere Verschachtelungsebene und es kitzelt nur meine OCD Nerven ein wenig.

Ich würde gerne dies in MSTest erweiterbar sein, und in etwas wie XUnit oder NUnit können Sie dies umgehen. Sie könnten diese Aspect Oriented-Methode sogar ausführen, indem Sie eine Wrapper-Methode für jede Methode verwenden, die mit PostSharp (siehe here) ausgeführt wird.

Wenn Sie aus irgendwelchen Gründen mit MSTest stecken bleiben (wir haben ein paar selbst, "Anhängen" von Dateien, CI-Skripte wurden eingerichtet etc) könnten Sie dies tun.

Verwenden Sie die FirstChanceException, die jede ausgelöste Ausnahme abfängt. Nun, was ich hier vorschlage, ist nicht threadsicher und ein bisschen verrückt, aber wenn Sie wie wir Single-Threaded-Tests ausführen und mehr Wert auf Benutzerfreundlichkeit als Leistung usw. legen, könnte es für Sie funktionieren. Sie könnten dies verbessern, indem Sie die Registrierungen bündeln usw. mit dem Testkontext.

Grundsätzlich habe ich eine globale Testklasse erstellt, die die FirstChanceExceptions hakt und die letzte ausgelöste Ausnahme "sicherstellt", dann referenziere ich dies in der Aufräummethode.

[TestClass] 
public static class GlobalSetup 
{ 
    [AssemblyInitialize] 
    public static void Setup(TestContext context) 
    { 
     AppDomain.CurrentDomain.FirstChanceException += (s, e) => LastException = e.Exception; 
    } 

    public static Exception LastException { get; private set; } 
} 

Dann in einer Basisklasse, die jede Prüfung zur Reinigung Logik enthält: Eigentlich

[TestCleanup] 
public virtual void Cleanup() 
{ 
    if (TestContext.CurrentTestOutcome != UnitTestOutcome.Passed && GlobalSetup.LastException != null) 
    { 
     var e = GlobalSetup.LastException; 
     Log.Error(GlobalSetup.LastException, $"{e.GetType()}: {e.Message}\r\n{e.StackTrace}"); 
    } 
} 
+0

Sie können mit MSTest keine Tests mit einzelnen Threads ausführen. – BartoszKP

+0

Sie haben Recht, wie hier zum Beispiel: http://stackoverflow.com/a/5037514/479632 Allerdings hatte ich keine Probleme von diesem Standpunkt mit der oben genannten Lösung, da die Tests zumindest ausgeführt werden der Reihe nach. – Almund

Verwandte Themen