2013-04-08 19 views
13

Stiamo eseguendo build notturni che alla fine eseguono tutti i nostri UnitTest utilizzando il framework MsTest.Come smettere di eseguire test MsTest al primo errore?

Dobbiamo avere una velocità di trasmissione del 100%, quindi se uno fallisce, non c'è motivo di eseguire gli altri; quindi ci piacerebbe interrompere l'esecuzione al primo test fallito.

C'è comunque la possibilità di raggiungerlo?

+0

sto avendo lo stesso problema. Chiunque? – Zambonilli

risposta

0

Sei davvero sicuro di voler buttare via i risultati dei test?

Dire che qualcuno ha una brutta giornata e introduce più errori A, B e C nel codice. Potresti scoprire solo su A il lunedì, quindi lo aggiusti e non sai del problema B fino a martedì, e quindi non aggiusti C fino a mercoledì. Ma dal momento che mancava la copertura dei test per mezza settimana, i bug introdotti lunedì non vengono scoperti fino a giorni dopo la loro introduzione, ed è più costoso e richiede più tempo per risolverli.

Se non ti costa molto continuare a eseguire i test dopo un errore, queste informazioni non sono utili?


Detto questo, l'hacking di una correzione nelle librerie di test non sarebbe così difficile. Sono tutte le possibili codepaths di fallimento del test impostare una variabile statica StopAssert.Failed = true; (probabilmente avvolgendo le chiamate al Assert e la cattura AssertFailedExceptions. Poi basta aggiungere [TestInitialize()] metodi per ogni classe di test per fermare ogni test dopo un fallimento!

public class StopAssert 
{ 
    public static bool Failed { get; private set; } 

    public static void AreEqual<T>(T expected, T actual) 
    { 
     try 
     { 
      Assert.AreEqual(expected, actual); 
     } 
     catch 
     { 
      Failed = true; 
      throw; 
     } 
    } 

    // ...skipping lots of methods. I don't think inheritance can make this easy, but reflection might? 

    public static void IsFalse(bool condition) 
    { 
     try 
     { 
      Assert.IsFalse(condition); 
     } 
     catch 
     { 
      Failed = true; 
      throw; 
     } 
    } 
} 


[TestClass] 
public class UnitTest1 
{ 
    [TestInitialize()] 
    public void Initialize() 
    { 
     StopAssert.IsFalse(StopAssert.Failed); 
    } 

    [TestMethod] 
    public void TestMethodPasses() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodFails() 
    { 
     StopAssert.AreEqual(0, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodPasses2() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 
} 

[TestClass] 
public class UnitTest2 
{ 
    [TestInitialize()] 
    public void Initialize() 
    { 
     StopAssert.IsFalse(StopAssert.Failed); 
    } 

    [TestMethod] 
    public void TestMethodPasses() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodFails() 
    { 
     StopAssert.AreEqual(0, 1 + 1); 
    } 

    [TestMethod] 
    public void TestMethodPasses2() 
    { 
     StopAssert.AreEqual(2, 1 + 1); 
    } 
} 
+0

Chiunque ha un modo per farlo con le impostazioni di configurazione? Abbiamo un sacco di codice che dovrebbe essere modificato :( – Steve

Problemi correlati