2011-10-05 4 views
10

Usamos NUnit para ejecutar las pruebas de integración. Estas pruebas consumen mucho tiempo. A menudo, la única forma de detectar una falla es en un tiempo de espera.Cómo hacer que NUnit deje de ejecutar las pruebas en la primera falla

Me gustaría que las pruebas dejen de ejecutarse tan pronto como se detecte una falla.

¿Hay alguna manera de hacerlo?

+0

Creo que esto es una pregunta específica para el corredor de pruebas, entonces, ¿cómo se ejecutan las pruebas? NUnit-console, msbuild NUnit task, ¿otro corredor? – sll

Respuesta

1

Probablemente esta no sea la solución ideal, pero hace lo que necesita, es decir, Ignora las pruebas restantes si una prueba ha fallado.

[TestFixture] 
    public class MyTests 
    { 
     [Test] 
     public void Test1() 
     { 
      Ascertain(() => Assert.AreEqual(0, 1)); 
     } 

     [Test] 
     public void Test2() 
     { 
      Ascertain(() => Assert.AreEqual(1, 1)); 
     } 

     private static void Ascertain(Action condition) 
     { 
      try 
      { 
       condition.Invoke(); 
      } 

      catch (AssertionException ex) 
      { 
       Thread.CurrentThread.Abort(); 
      } 
     } 
    } 

Desde TestFixtureAttribute es heredable, por lo que potencialmente podría crear una clase base con este atributo decorada en él y tener la Averiguar Método protegido en ella y obtener todas las clases TestFixture de ella.

El único inconveniente es que tendrá que refactorizar todas sus afirmaciones existentes.

+0

Es un paso en la dirección correcta. Sin embargo, solo funcionará para Asserts, y no excepciones. Pero es una idea interesante ... Podría hacer algo similar por excepciones. – willem

+0

@willem Puede publicar su solución para las excepciones si tiene éxito primero. Yo seguiré intentándolo también. – Raghu

+0

¿No podría envolver todo el cuerpo del método de prueba en Determinar y solo capturar todas las excepciones? –

22

Usando nunit-console, puede lograrlo utilizando el parámetro de línea de comando/stoponerror.

Consulte here para obtener la referencia de línea de comando.

+4

Creo que este es un mejor enfoque. Dejó que NUnit maneje esto en lugar de intervenir en el proceso y también contaminar el código de prueba con cosas innecesarias. – mosu

+0

Con nunit ** 3 ** - console.exe --stoponerror –

6

Estoy usando NUnit 3 y el siguiente código funciona para mí.

public class SomeTests { 
    private bool stop; 

    [SetUp] 
    public void SetUp() 
    { 
     if (stop) 
     { 
      Assert.Inconclusive("Previous test failed"); 
     } 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed) 
     { 
      stop = true; 
     } 
    } 
} 

Alternativamente, puede hacer que esta clase sea abstracta y derivar de ella.

Cuestiones relacionadas