2012-02-09 15 views
12

He escrito los casos de prueba xUnit en C#. Esa clase de prueba contiene tantos métodos. Necesito ejecutar todos los casos de prueba en una secuencia. ¿Cómo puedo establecer la secuencia de casos de prueba en xUnit?Cómo establecer la secuencia de casos de prueba en xUnit

+5

¿Por qué se preocupa por el orden en que se ejecutan las pruebas? Por lo general, es una mala idea que las pruebas dependan unas de otras de alguna manera; deben ser independientes entre sí. –

+7

Si bien eso es cierto para las pruebas unitarias, este no es el caso para las pruebas de integración. –

Respuesta

0

No puede, por diseño. Es deliberadamente aleatorio para evitar que cualquiera obtenga uno por deseo o por accidente.

La aleatoriedad es solo para una clase de prueba determinada, por lo que puede lograr sus objetivos al envolver los elementos que desea controlar dentro de una clase anidada, pero en ese caso, aún así terminará con orden aleatorio siempre que tenga más de dos métodos de prueba en una clase.

Si está tratando de gestionar la construcción de dispositivos o el contexto, el mecanismo incorporado IUseFixture<T> puede ser apropiado. Vea el xUnit Cheat Sheet para ejemplos.

Pero realmente necesita decirnos más acerca de lo que está tratando de hacer o tendremos que hacer especulaciones.

14

Prioridad de prueba: en la parte inferior de la página this.

[PrioritizedFixture] 
public class MyTests 
{ 
    [Fact, TestPriority(1)] 
    public void FirstTest() 
    { 
     // Test code here is always run first 
    } 
    [Fact, TestPriority(2)] 
    public void SeccondTest() 
    { 
     // Test code here is run second 
    } 
} 

Por cierto, tengo el mismo problema en este momento. Y sí, no es el arte limpio ... pero la QA quería una prueba manual ... por lo que una prueba automatizada con un orden específico ya es un gran salto para ellos ... (tos) y sí, en realidad no es una prueba unitaria ...

+0

Exactamente la respuesta que habría dado. ;) – bricelam

+0

En realidad, ahora que veo tu comentario ... Lo recuerdo. :) TestPriority solo funciona por base de módulo/clase. Por lo tanto, las diferentes clases se siguen ejecutando en orden aleatorio. (El compilador de C# inserta las clases en un orden no predecible en el ensamblaje). Para hacer que la secuencia de prueba (los probadores tengan un protocolo de prueba) sea más fácil y repetible, agregué ordenamiento alfabético. Así que creé una versión modificada de xunit 1.9 que ejecuta clases de prueba en orden alfabético. Eche un vistazo a http://www.andreas-reiff.de/2012/06/xunit-with-alphabetically-sorted-classes-and-proper-display-list-matching-execution-order/. –

+0

@bricelam, ese enlace parece estar roto, entra en algún bucle de redirección. –

12

En xUnit 2. * esto se puede lograr utilizando el atributo TestCaseOrderer para designar una estrategia de ordenamiento, que se puede utilizar para hacer referencia a un atributo que se anota en cada prueba para denotar un orden.

Por ejemplo:

pedidos Estrategia

public class PriorityOrderer : ITestCaseOrderer 
{ 
    public IEnumerable<TTestCase> OrderTestCases<TTestCase>(IEnumerable<TTestCase> testCases) where TTestCase : ITestCase 
    { 
     var sortedMethods = new SortedDictionary<int, List<TTestCase>>(); 

     foreach (TTestCase testCase in testCases) 
     { 
      int priority = 0; 

      foreach (IAttributeInfo attr in testCase.TestMethod.Method.GetCustomAttributes((typeof(TestPriorityAttribute).AssemblyQualifiedName))) 
       priority = attr.GetNamedArgument<int>("Priority"); 

      GetOrCreate(sortedMethods, priority).Add(testCase); 
     } 

     foreach (var list in sortedMethods.Keys.Select(priority => sortedMethods[priority])) 
     { 
      list.Sort((x, y) => StringComparer.OrdinalIgnoreCase.Compare(x.TestMethod.Method.Name, y.TestMethod.Method.Name)); 
      foreach (TTestCase testCase in list) 
       yield return testCase; 
     } 
    } 

    static TValue GetOrCreate<TKey, TValue>(IDictionary<TKey, TValue> dictionary, TKey key) where TValue : new() 
    { 
     TValue result; 

     if (dictionary.TryGetValue(key, out result)) return result; 

     result = new TValue(); 
     dictionary[key] = result; 

     return result; 
    } 
} 

Atributo

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] 
public class TestPriorityAttribute : Attribute 
{ 
    public TestPriorityAttribute(int priority) 
    { 
     Priority = priority; 
    } 

    public int Priority { get; private set; } 
} 

casos de prueba

[TestCaseOrderer("FullNameOfOrderStrategyHere", "OrderStrategyAssemblyName")] 
public class PriorityOrderExamples 
{ 
    [Fact, TestPriority(5)] 
    public void Test3() 
    { 
     //called third 
    } 

    [Fact, TestPriority(0)] 
    public void Test2() 
    { 
     //called second 
    } 

    [Fact, TestPriority(-5)] 
    public void Test1() 
    { 
     // called first 
    } 

} 

xUnit 2. * Las muestras de ordenamiento here

Cuestiones relacionadas