Estoy trabajando en una aplicación que es en su mayoría de una sola rosca, de un solo usuario.
Hay un par de hilos por aquí y por allí, y que sólo el uso de los subprocesos, los objetos y las clases. La unidad de pruebas son en realidad pruebas de aquellos con múltiples hilos (creado explícitamente para las pruebas), y que la prueba de multa.

Los VST unidad de pruebas fallan cuando las pruebas de los objetos de negocio y sub-sistemas que no son seguros para subprocesos. Que está bien no ser seguro para subprocesos, que es la forma en que la aplicación utiliza.

Pero el ‘hilo por TestMethod’ enfoque de MS pruebas nos mata. He tenido que implementar el objeto de bloqueos en muchos de la unidad de las clases de prueba para asegurarse de que las pruebas se ejecutan una después de la otra (yo realmente no se preocupan por el orden, pero no puedo tener dos métodos de prueba golpeando el mismo objeto al mismo tiempo).

El código se parece a esto:

[TestClass]
public class TestSomeObject
{
   static object turnStile = new object();
...
   [TestMethod]
   public void T01_TestThis()
   {
      lock(turnStile)
      {
      .. actual test code
      }
   }

   [TestMethod]
   public void T02_TestThat()
   {
      lock(turnStile)
      {
      -- actual test code
      }
   }

}

Hay mejor/forma más elegante de hacer la prueba se ejecutan de forma secuencial?

  • por lo que parece, estamos reutilizando una instancia de un objeto en todas sus pruebas?
  • Sí, básicamente. A veces es la base de datos, a veces es un singleton – se utiliza como es en la aplicación
  • Yo finalmente se utiliza la orden de método de prueba. Funciona bien. Sin embargo, yo tenía un infierno de un tiempo lo que es trabajar con el NAnt construir. Sólo ejecuta la prueba por orden de lista en la construcción exige el uso de la /testmetadata y /testlist interruptores en el MSTest invocación de bloque. La documentación es incompleta, para utilizar un tipo de descripción. I google todo para los ejemplos de «MSTest /testmetadata /testlist» a ningún efecto. El truco es sencillo, sin embargo, y me siento obligado a darle la espalda a la comunidad, en caso de que alguien se topa con el mismo problema. 1. Edición de la prueba de archivo de metadatos (con una .vsmdi extensión), un
  • ya que afirman que esta es la unidad de pruebas por su etiqueta, debe burlarse de auxiliar a cabo sus dependencias, especialmente las dependencias que no son seguros para subprocesos
  • así, la respuesta corta sería: NO. No hay manera de que lo haga, porque la unidad de pruebas no son fiables desde el uno del otro, puede darse el lujo de cambiar las pruebas de modo que puede crear y destruir dicha instancia en cada prueba?
  • En realidad, la respuesta es sí. Me fui junto con Frank sugerencia y crea un pedido de prueba
  • (sé que esto es viejo) @mxmissile – de hecho, la dependencia podría ser una función de la prueba arnés en lugar de la prueba de la unidad, es decir, si las pruebas son la herencia de una base de clase de prueba, y toda la reutilización de un anidada común variable/método (porque empezó más fácil reutilizar el código ya que todas las pruebas hasta que «ahora» se comportaban de la misma), entonces es más fácil ser capaz de ajustar que anidaba variable en la clase de prueba de duplicar el 95% de la prueba apenas así que usted puede utilizar una variable diferente. Pero el cambio es para una ejecución de prueba podría afectar a otras pruebas que se ejecutan en paralelo…

InformationsquelleAutor Sam Dahan | 2009-10-09

6 Comentarios

  1. 19

    Existe la noción de un «Ordenado» en el que se puede hacer una lista de las pruebas en la secuencia. Es más orientado a la consecución de un cierto orden secuencial, pero no puedo ver cómo eso sería posible si B no espere a completar.

    Aparte de eso, es lamentable que los tests de interferir el uno con el otro. Hay de Instalación /Desmontaje de los métodos que pueden ser utilizados por prueba en la que, después de todo ser posible aislar las pruebas de cada uno de los otros.

    • Es lamentable que MSTest ejecuta todas las pruebas en el mismo dominio de la aplicación, haciendo posible que las pruebas de interferir el uno con el otro en el primer lugar.
  2. 27

    Utilizar un Ordenó Prueba.

    Prueba > Nueva Prueba > Ordenó la Prueba de

    Es allí una manera de ejecutar las pruebas unitarias de forma secuencial con MSTests?

    Es allí una manera de ejecutar las pruebas unitarias de forma secuencial con MSTests?

    • Grandes cosas. Yo sabía que TENÍA que haber una manera más fácil… 🙂
    • ¿Cómo se puede especificar una .runsettings archivo cuando se utiliza una prueba por orden? En concreto, necesito para acceder a la TestContext con los parámetros especificados en la .runsettings.
    • Suena como un buen candidato para un nuevo Desbordamiento de Pila pregunta. Buscar primero para asegurarse de que su pregunta no ha sido ya formuladas y contestadas, y hacen referencia a esta cuestión cuando la escritura de su nueva pregunta.
    • «MSTest V2 basada en pruebas no pueden ser utilizados en una prueba por orden» aparece en la parte inferior de la ventana. De niza.
  3. 18

    puede Utilizar lista de Reproducción

    clic derecho en el método de prueba -> Añadir a la lista de reproducción -> Nueva lista de reproducción

    a continuación, puede especificar el orden de ejecución
    Es allí una manera de ejecutar las pruebas unitarias de forma secuencial con MSTests?

    • Siento que esta es la mejor respuesta a la pregunta.
    • Funcionó mejor, y fue lo suficientemente fácil para la instalación en menos de un minuto.
  4. 13

    Que específicamente se puede requerir un mutex para cada ejecución de la prueba, ya sea en las pruebas específicas que usted desea serializar, o para todas las pruebas en una clase (lo que comparte el mismo mutex cadena).

    Para toda una clase de prueba, puede utilizar el TestInitialize y TestCleanup atributos como:

    private readonly Mutex testMutex = new Mutex(true, "MySpecificTestScenarioUniqueMutexString");
    
    [TestInitialize]
    public void Initialize()
    {
        testMutex.WaitOne(TimeSpan.FromSeconds(1));
    }
    
    [TestCleanup]
    public void Cleanup() {
        testMutex.ReleaseMutex();
    }

    Tener claro que esto no es una característica de las pruebas, CUALQUIER estructura de fijación deben trabajar. Estoy usando el sistema de Mutexes, en este caso:
    https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs 110).aspx

    • Hola, podría usted comentar? Por ejemplo, yo necesito una aclaración sobre este «…lo que se comparte el mismo mutex de la cadena». También, se declara la testMutex Privado ReadOnly pero en Inicializar y la Limpieza está utilizando FileTestMutex… thx
    • Hola! La incompatibilidad de referencia fue un error, lo he reparado. También he añadido un enlace a la clase Mutex para su aclaración. Objeto Mutex es proporcionado por Microsoft estructura de fijación que utiliza un sistema de cadena para el bloqueo, así que quiero que la cadena sea único para cada conjunto-de-cosas-que-quiere-a-serializar, que podría ser por prueba, o para diferentes totalidad de las clases de prueba. Si usted copiar/pegar la cadena en todas partes, cada vez que se utilice será serializado. También tenga en cuenta el ‘OrderedTest las sugerencias de los de arriba, que es probablemente una mejor idea de si funciona para usted. La exclusión Mutua (o de otro manual de bloqueo de enfoque es complicado.
    • Yo no era capaz de utilizar ordenado de la prueba ya que estoy usando MSTest v2. Yo estaba tratando de usar la exclusión Mutua enfoque, que parece muy sencillo pero no dejo de golpear la AbandonedMutex excepción, no la TestCleanup de ejecución y liberación de exclusión mutua antes de que otros subprocesos son capaces de entrar?
  5. 8

    Usé finalmente la orden de método de prueba. Funciona bien.

    Sin embargo, yo tenía un infierno de un tiempo lo que es trabajar con el NAnt construir.
    Ejecución de sólo la prueba por orden de lista en la construcción exige el uso de la /testmetadata y /testlist interruptores en el MSTest invocación de bloque.
    La documentación es incompleta, para utilizar un tipo de descripción. I google todo para los ejemplos de «MSTest /testmetadata /testlist» a ningún efecto.

    El truco es sencillo, sin embargo, y me siento obligado a darle la espalda a la comunidad, en caso de que alguien se topa con el mismo problema.

    1. Edición de la prueba de archivo de metadatos (con una .vsmdi extensión), y agregar una nueva lista
      a la lista de pruebas (el primer nodo en el árbol de la izquierda
      panel. Le damos el nombre que queramos, por ejemplo «SequentialTests’.
    2. Si usted usa un /testcontainer interruptor para la MSTest invocación, eliminarlo.
    3. Agregar un interruptor para MSTest
      -> /testmetadata:
    4. Agregar un interruptor para MSTEst
      /testlist:SequentialTests (o cualquier nombre que se utiliza)

    Luego MSTest sólo ejecuta las pruebas que se enumeran en la lista de pruebas que ha creado.

    Si alguien tiene un método mejor, me gustaría oír hablar de eso!

  6. 2

    He utilizado ordenado pruebas, también se configura fácilmente en jenkins solo comando use

    MSTest /testcontainer:»orderedtestfilename.orderedtest» /resultsfile:»resultados.trx»

Dejar respuesta

Please enter your comment!
Please enter your name here