73 votos

¿Cómo puedo ejecutar NUnit pruebas en paralelo?

Tengo una gran prueba de aceptación (~10 segundos por prueba) de la suite de prueba por escrito el uso de NUnit. Me gustaría aprovechar el hecho de que mis máquinas son múltiples núcleos cajas. Idealmente, me gustaría ser capaz de tener una prueba de ejecución por núcleo, de forma independiente de otras pruebas.

Hay PNUnit, pero está diseñado para realizar pruebas para el roscado de los problemas de sincronización y cosas así, y yo no veo una manera obvia de lograr esto.

Hay un interruptor/herramienta/opción que puede utilizar para ejecutar las pruebas en paralelo?

46voto

David_001 Puntos 2825

El estándar de nunit corredor no admite la ejecución de pruebas en paralelo. Usted puede crear su propio ejecutor de pruebas para ejecutar las pruebas en paralelo (con su actual nunit test). No estoy seguro de por qué el nunit equipo no se ha hecho ya.

Alternativamente, MBUnit tiene la opción de crear parallelizable pruebas, y como MBUnit tiene casi la misma sintaxis que NUnit, que no podría tomar mucho esfuerzo para hacer el cambio.

10voto

chillitom Puntos 5731

Si el proyecto contiene varias pruebas archivos Dll se pueden ejecutar en paralelo mediante este script de MSBuild. Obviamente, usted tendrá que ajustar las rutas de acceso a adaptarse a su proyecto de diseño.

Para ejecutar con 8 núcleos de ejecución con: c:\proj> msbuild /m:8 RunTests.xml

RunTests.xml

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="RunTestsInParallel" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <Nunit Condition=" '$(Nunit)' == '' ">$(MSBuildProjectDirectory)\..\tools\nunit-console-x86.exe</Nunit>
  </PropertyGroup>

  <!-- see http://mikefourie.wordpress.com/2010/12/04/running-targets-in-parallel-in-msbuild/ -->

  <Target Name="RunTestsInParallel">
    <ItemGroup> 
      <TestDlls Include="..\bin\Tests\$(Configuration)\*.Tests.dll" />
    </ItemGroup>

    <ItemGroup> 
      <TempProjects Include="$(MSBuildProjectFile)" > 
        <Properties>TestDllFile=%(TestDlls.FullPath)</Properties> 
      </TempProjects> 
    </ItemGroup> 

    <MSBuild Projects="@(TempProjects)" BuildInParallel="true" Targets="RunOneTestDll" /> 
  </Target>

  <Target Name="RunOneTestDll"> 
    <Message Text="$(TestDllFile)" />
    <Exec Command="$(Nunit) /exclude=Integration $(TestDllFile)  /labels /xml:$(TestDllFile).results.xml"
      WorkingDirectory="$(MSBuildProjectDirectory)\..\bin\Tests\$(Configuration)" /> 
  </Target>

</Project>

4voto

kniemczak Puntos 354

En este artículo se menciona que en el fin de acelerar las pruebas de que el cartel se ejecuta varias instancias de NUnit con los parámetros de comando que especifica que las pruebas de cada instancia debe ejecutar.

TLC:

Me encontré con un extraño problema.

Utilizamos nunit-console para ejecutar la prueba en nuestro servidor de integración continua. Recientemente nos estábamos moviendo de Nunit 2.4.8 para 2.5.5 .Net 3.5 a 4.0. Para acelerar la ejecución de la prueba nos la ejecución de múltiples instancias de Nunit en en paralelo con la línea de comandos diferentes los argumentos

  • Tenemos dos copias de nuestra prueba de asambleas y de las nunit binarios en carpeta a y B.
  • En la carpeta ejecutamos

nunit-console-x86.exe Model.dll Test.dll /exclude:MyCategory /xml=TestResults.xml /marco=net-4.0 /noshadow

  • En la carpeta B ejecutamos

nunit-console-x86.exe Model.dll Test.dll /incluir:MyCategory /xml=TestResults.xml /marco=net-4.0 /noshadow

Si hemos de ejecutar los comandos en secuencia ambos se ejecutan correctamente. Pero si nos ejecutar en paralelo a sólo uno se realiza correctamente. Como de lo que puedo decir es la primera que la carga de la prueba accesorios. La otra falla con el mensaje "no se puede encontrar el accesorio".

Es este problema ya conocido? Yo podría no encuentro nada relacionado en el error lista de launchpad. Por CIERTO, Nuestro servidor se ejecuta Windows Server 2008 de 64 bits. Yo podría también reproducir el problema en Windows 7 de 64 bits.

Suponiendo que este error se corrige o no está ejecutando la versión más reciente(s) de software que se mencionan usted debe ser capaz de replicar su técnica.

Actualización

TeamCity se ve como una herramienta que se puede utilizar para ejecutar automáticamente NUnit pruebas. Ellos tienen un NUnit lanzador discutido aquí que podría ser utilizado para lanzar múltiples NUnit instancias. Aquí un artículo de un blog discutiendo el mergind de múltiples NUnit XML resultados en un único archivo.

Así que, en teoría podría tener TeamCity automáticamente lanzar múltiples NUnit pruebas basadas en sin embargo desea dividir la carga de trabajo y, a continuación, combinar los resultados en un único archivo para la prueba post procesamiento.

Es automatizado que suficiente para sus necesidades?

3voto

ZXX Puntos 3216

Sólo porque PNUnit puede hacer la sincronización dentro del código de pruebas no significa que tienes que usar ese aspecto. Por lo que puedo ver no hay nada para evitar que usted acaba de desove de un conjunto e ignorando el resto hasta que la necesita.

Por CIERTO no tengo el tiempo para leer todo de su origen, pero fue curioso comprobar fuera de la Barrera de la clase y es una manera muy simple bloqueo del contador. Sólo espera hasta que N hilos de entrar y, a continuación, envía el pulso de todos ellos para continuar ejecutando al mismo tiempo. Ése es todo allí está a él - si no lo toques, no te va a morder.

Podría ser un poco de sentido común para un normal de rosca de desarrollo (cerraduras normalmente se utilizan para secuenciar el acceso - 1 de 1) pero es un buen espíritu de desviación :-)

2voto

Pedro Puntos 5225

Sería un poco de un hack, pero se podría dividir la unidad de pruebas en un número de categorías. Entonces, inicia una nueva instancia de NUnit para cada categoría.

Edit: parece que han añadido un /opción de proceso para la aplicación de consola. El comando de la línea de ayudar a los estados a que este es el "modelo de Proceso para las pruebas de: Soltero, Separado, Varios". El test runner también parece tener esta característica.

Edit 2: por Desgracia, a pesar de crear procesos independientes para cada asamblea, el proceso de aislamiento de la opción (/proceso desde la línea de comandos), que corre a los agentes de una en una.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X