2010-06-03 9 views
9

Pensé que entendía cómo funcionaba la ejecución de prueba paralela de MbUnit, pero el comportamiento que estoy viendo difiere bastante de mi expectativa de que sospecho que me estoy perdiendo algo.¿Cómo funcionan exactamente MbUnit [Parallelizable] y DegreeOfParallelism?

Tengo un conjunto de pruebas de IU que deseo ejecutar al mismo tiempo. Todas las pruebas están en el mismo ensamblaje, divididas en tres espacios de nombres diferentes. Todas las pruebas son completamente independientes entre sí, por lo que me gustaría que todas sean elegibles para la ejecución paralela.

A tal fin, pongo el siguiente en los AssemblyInfo.cs:

[assembly: DegreeOfParallelism(8)] 

[assembly: Parallelizable(TestScope.All)] 

Mi entendimiento es que esta combinación de atributos de ensamblado debe hacer todas las pruebas que deben ser considerados [Parallelizable], y que el corredor de prueba debería usar 8 hilos durante la ejecución. Mis pruebas individuales están marcadas con el atributo [Test], y nada más. Ninguno de ellos está basado en datos.

Sin embargo, lo que en realidad veo son como mucho 5-6 subprocesos en uso, lo que significa que mis ejecuciones de prueba tardan más de lo debido.

¿Echo de menos algo? ¿Debo hacer algo más para asegurarme de que mis 8 hilos estén siendo utilizados por el corredor?

N.B. El comportamiento es el mismo independientemente del corredor que use. La GUI, la línea de comandos y los corredores de TD.Net se comportan de la misma manera que la descrita anteriormente, lo que también me lleva a pensar que me he perdido algo.

EDIT: Como se señaló en los comentarios, estoy ejecutando v3.1 de MbUnit (actualización 2 compilación 397). El documentation sugiere que el atributo de nivel de ensamblaje [parallelizable] está disponible, pero también parece hacer referencia a v3.2 del marco a pesar de que aún no está disponible.

EDIT 2: Para aclarar aún más, la estructura de mi montaje es el siguiente:

assembly 
- namespace 
    - fixture 
     - tests (each carrying only the [Test] attribute) 
    - fixture 
     - tests (each carrying only the [Test] attribute) 
- namespace 
    - fixture 
     - tests (each carrying only the [Test] attribute) 
    - fixture 
     - tests (each carrying only the [Test] attribute) 
- namespace 
    - fixture 
     - tests (each carrying only the [Test] attribute) 
    - fixture 
     - tests (each carrying only the [Test] attribute) 

Datos 3: OK, ahora he notado que si yo sólo corro un accesorio en una vez, el número máximo de pruebas que se ejecutan simultáneamente es siempre 8. Tan pronto como selecciono varios aparatos, se reduce a 5 o 6. Si tomo el contenido de dos aparatos (actualmente contienen 12 pruebas cada uno) y los dejo caer en el mismo accesorio (para un total de 24 pruebas en ese accesorio) ese accesorio también ejecutará 8 pruebas al mismo tiempo.

Esto parece demostrar que no es un problema en las pruebas individuales, sino más bien en cómo los atributos de nivel de ensamblaje se filtran hacia el accesorio, o cómo el corredor de prueba consume esos atributos.

Además, también observé (cuando ejecuté dos dispositivos) que una vez que uno de los dos dispositivos se había ejecutado en su totalidad, el corredor comienza a ejecutar más pruebas al mismo tiempo cuando vuelve a ejecutar solo un dispositivo. En este momento, el primer dispositivo se ejecuta cuando faltan 7 pruebas para el segundo dispositivo. Tan pronto como eso suceda, el número de pruebas que se ejecutan simultáneamente salta desde el 5 o 6 anterior al máximo disponible de 7.

Respuesta

6

De acuerdo con release note de Gallio v3.0.6:

MbUnit le ayuda a obtener el máximo provecho de su CPU multi-core. Marque cualquier prueba [Parallelizable] y se le permitirá funcionar en paralelo con otras pruebas paralelizables en el mismo dispositivo.

Las luminarias también se pueden marcar en paralelo para permitir que se ejecuten en paralelo con otros accesorios paralelizables.

alt text

Tenga en cuenta que si desea que todas las pruebas dentro de un accesorio que se considerarán paralelizable entonces usted todavía necesita agregar [Parallelizable] a cada uno de ellos. (Podríamos agregar una función para configurar esto en el dispositivo o en el nivel de ensamblaje más tarde en función de los comentarios del usuario.)

También tenga en cuenta que el hecho de que una prueba o dispositivo esté marcado como paralelizable no significa que se ejecutará en paralelo con otras pruebas especial. En aras de la eficiencia, limitamos el número de hilos de prueba activos en función del grado de paralelismo configurado. Si desea que se ejecute un número específico de instancias de una prueba en paralelo, considere usar [ThreadedRepeat].

El grado de configuración de paralelismo controla el número máximo de pruebas que MbUnit intentará ejecutar en paralelo entre sí. Por defecto, el grado de paralelismo es igual al número de CPU que tiene, o 2 como mínimo.

Si no te gusta el valor por defecto a continuación, se puede anular el grado de paralelismo en el nivel de ensamblado de esta manera:

alt text

No sé si ayuda. Tal vez Jeff podría dar más detalles ya que había implementado esa característica.

+0

Creo que el atributo Parallelizable en el nivel de ensamblaje ya está implementado a partir de 3.1 –

+0

3.1 es la versión que estoy usando.La documentación (http://www.gallio.org/api/index.aspx) sugiere que se puede hacer en el nivel de ensamblaje. Lo único que noto es que la documentación menciona la versión 3.2 no 3.1. Pero 3.2 aún no ha terminado por lo que puedo ver. – BenA

+0

Por lo que puedo decir, estás usando la API paralelamente correcta. Tenga en cuenta que DegreeOfParallelism solo especifica el número máximo de subprocesos para usar. Existen varias razones por las cuales las pruebas no se pueden ejecutar en paralelo, como la estructura de anidación de prueba, el pedido de prueba y las dependencias de prueba. Algunas construcciones como [Repetir] no están paralelizadas por [Paralelamente]. Del mismo modo, las filas individuales de pruebas basadas en datos no están paralelizadas entre sí. (¡Sería una buena característica para agregar!) Si establece [DegreeOfParallelism (32)], ¿verá que se ejecutan más pruebas simultáneas en promedio? –

0

se encontró con el mismo problema, mis hallazgos

  • [assembly: paralelizable (...)] en las anulaciones a nivel de conjunto de aplique atributos Parallelizable y resultará en Ensayo del punto que se está ejecutando uno a la vez, pero a un accesorio nivel paralelo. Parece tener un máximo de entre 5-6 aparatos en paralelo.
  • [Parallelizable (TestScope.Descendants)] a nivel de dispositivo provocará que los dispositivos se ejecuten de uno en uno, pero las pruebas se ejecutan en paralelo. Parece que no tiene max en las pruebas en paralelo.

En última instancia, debido a la restricción del nivel de ensamblaje en los límites paralelos del dispositivo, la única forma es usar atributos de nivel de dispositivo y realizar pruebas de dispositivos en paralelo.

Sugeriría crear menos fijaciones y más pruebas por dispositivo para evitar este problema. Siempre puedes lanzar múltiples corredores por accesorio de ensamblaje.

Vergüenza este es el caso.

-1

La anulación no funciona para más de 5 pruebas para ejecutar a la vez. Tenemos 25 sistemas en los laboratorios Sauce disponibles para ejecutar 25 secuencias de comandos a la vez, sobrepasamos el DegreeOfParallelism a 20 solo 5 ejecuciones a la vez. [assembly: DegreeOfParallelism (20)] - No funciona para Mbunit

+0

El OP no está de acuerdo con esto junto con la mayoría de las otras respuestas –

Cuestiones relacionadas