2009-09-02 10 views

Antwort

13

Die nächste Übereinstimmung ist Assert.Inconclusive() - es macht nicht den Test Fehler als solche, aber es ist auch nicht erfolgreich. Es fällt in eine dritte Stufe namens Inconclusive.

Ein einzelner nicht eindeutiger Test führt dazu, dass eine ganze Testsuite nicht eindeutig ist.

Es gibt Überlastungen, die benutzerdefinierte Nachrichten und unterstützt:

Assert.Inconclusive("Ploeh"); 
+6

Ärgerlich ist ein inconclusive Test genug, um zu verursachen, MSTEST.EXE denselben Statuscode (1) als einen Fehler zurückzugeben, wenn Sie eine Stapeldatei verwenden, um alles zu deaktivieren, werden Sie nicht in Lage sein, den Unterschied zu erkennen ohne mehr Arbeit. –

3

ich ein ähnliches Problem haben, wie ich NUnit für einige Projekte verwenden. Versuchen Sie es mit

Console.Write("Some Warning"); 
+3

Assert.Inconclusive(); wird von NUnit tatsächlich unterstützt. http://www.nunit.org/index.php?p=utilityAsserts&r=2.5.8 –

1

Hier ist mein hacken, wie man haben Warnungen mit nunit (ich weiß, diese Frage war über mstest, aber dies sollte funktionieren auch). Wie immer bin ich an Verbesserungen interessiert. Diese Methode funktioniert für mich.

Hintergrund: Ich habe einen Code, der die Tests selbst auf korrekte Kommentare überprüft und Logik erkennt, ob jemand einen anderen Test kopiert und eingefügt hat, ohne Kommentare zu ändern. Diese sind Warnungen Ich möchte dem Entwickler ohne normale Assert.Inconclusive gezeigt werden, die den eigentlichen Test blockiert. Einige konzentrieren sich auf den Test und die Bereinigungseffaktorierungsphase dient dazu, die Warnungen zu entfernen.

Mission: Warnungen haben, nachdem alle anderen Bestätigungen ausgeführt wurden. Dies bedeutet, dass sogar die Warnungen nach Assert.Fail angezeigt werden, die normalerweise bei Tests während der Entwicklung auftreten.

Implementierung: (am besten eine Basisklasse für alle Testdateien erstellen):

public class BaseTestClass 
{ 
    public static StringBuilder Warnings; 

    [SetUp] 
    public virtual void Test_SetUp() 
    { 
      Warnings = new StringBuilder(); 
    } 

    [TearDown] 
    public virtual void Test_TearDown() 
    { 
     if (Warnings.Length > 0) 
     { 
      string warningMessage = Warnings.ToString(); 

      //-- cleared if there is more than one test running in the session 
      Warnings = new StringBuilder(); 
      if (TestContext.CurrentContext.Result.Status == TestStatus.Failed) 
      { 
       Assert.Fail(warningMessage); 
      } 
      else 
      { 
       Assert.Inconclusive(warningMessage); 
      } 
     } 
    } 

Testing Nutzungs

[Test] 
public void Sample_Test() 
{ 
    if (condition) Warning.AppendLine("Developer warning"); 
    Assert.Fail("This Test Failed!"); 
} 

Tatsächliches Ergebnis:

"This Test Failed!" 
"Developer warning" 

Status des Tests ist fehlgeschlagen - ROT

Wenn der Test bestanden wurde und eine Warnung angezeigt wurde, erhalten Sie den Status Inconclusive - GELB.

0

Sie können eine benutzerdefinierte Ausnahme verwenden.

Das Problem mit Assert.Inconclusive ist, dass Test Explorer angibt, dass der Test nicht einmal ausgeführt wurde. Dies kann irreführend sein, wenn der Test in der Zukunft ausgeführt wird, vor allem, wenn der Test von anderen Entwicklern ausgeführt wird:

enter image description here

Die Art, wie ich gekommen bin ist zu bevorzugen wie folgt. Definieren Sie zuerst eine benutzerdefinierte UnitTestWarningException. Ich habe mir einen zusätzlichen Konstruktor gegeben, damit ich meine Warnmeldung String übergeben kann.Format-Stil mit Argumenten:

public class UnitTestWarningException : Exception 
{ 
    public UnitTestWarningException(string Message) : base(Message) { } 

    public UnitTestWarningException(string Format, params object[] Args) : base(string.Format(Format, Args)) { } 
} 

Dann wird an dem Punkt, an dem Sie einen Komponententest mit einer Warnung enden sollen, wirft ein UnitTestWarningException statt:

[TestMethod] 
public void TestMethod1() 
{ 
    . 
    . 
    . 
    try 
    { 
    WorkflowInvoker.Invoke(workflow1, inputDictionary); 
    } 
    catch (SqlException ex) 
    { 
    if (ex.Errors.Count > 0 
     && ex.Errors[0].Procedure == "proc_AVAILABLEPLACEMENTNOTIFICATIONInsert") 
    { 
     //Likely to occur if we try to repeat an insert during development/debugging. 
     //Probably not interested--the mail has already been sent if we got as far as that proc. 

     throw new UnitTestWarningException("Note: after sending the mail, proc_AVAILABLEPLACEMENTNOTIFICATIONInsert threw an exception. This may be expected depending on test conditions. The exception was: {0}", ex.Message); 
    } 
    } 
} 

Das Ergebnis: Test Explorer dann zeigt, dass der Test durchgeführt wurde, scheiterte aber mit einem UnitTestWarningException, das zeigt Ihre Warnung:

enter image description here