visual testmethod studio net gui nunit

testmethod - ¿Cómo puedo ejecutar pruebas de NUnit en paralelo?



nunit.net core (12)

Ahora puede usar NCrunch para paralelizar las pruebas de su unidad e incluso puede configurar cuántos núcleos debe usar NCrunch y cuántos debe usar Visual Studio.

Además, obtienes pruebas continuas como un extra :)

Tengo un gran conjunto de pruebas de prueba de aceptación (~ 10 segundos por prueba) escrito usando NUnit. Me gustaría aprovechar el hecho de que mis máquinas son todas cajas de núcleos múltiples. Idealmente, podría realizar una prueba por núcleo, independientemente de otras pruebas.

Está PNUnit, pero está diseñado para probar problemas de sincronización de enhebrado y cosas así, y no vi una forma obvia de lograr esto.

¿Existe un interruptor / herramienta / opción que pueda usar para ejecutar las pruebas en paralelo?


Como el proyecto no se ha mencionado aquí, me gustaría NUnit.Multicore . No he probado el proyecto yo mismo, pero parece tener un enfoque interesante para el problema de prueba paralela con NUnit.


El hecho de que PNUnit pueda hacer la sincronización dentro del código de prueba no significa que realmente tenga que usar ese aspecto. Por lo que puedo ver, no hay nada que te impida simplemente engendrar un conjunto e ignorar el resto hasta que lo necesites.

Por cierto, no tengo tiempo para leer toda su fuente, pero tenía curiosidad por ver la clase Barrier y es un contador de cerraduras muy simple. Simplemente espera hasta que N hilos ingresen y luego envía el pulso para que todos sigan funcionando al mismo tiempo. Eso es todo: si no lo tocas, no te morderá.

Podría ser un poco contrario a la intuición para un desarrollo de subprocesos normal (los bloqueos se usan normalmente para serializar el acceso - 1 por 1) pero es una diversión bastante animada :-)


El nunit runner estándar no admite la ejecución de pruebas en paralelo. Puede crear su propio corredor de prueba para ejecutar las pruebas en paralelo (usando sus pruebas de nunidad actuales). No estoy seguro de por qué el equipo nunit aún no ha hecho esto.

Alternativamente, MBUnit tiene la opción de crear pruebas paralelizables, y como MBUnit tiene prácticamente la misma sintaxis que NUnit, no requerirá tanto esfuerzo hacer el cambio.

EDITAR: Como se señaló en los comentarios, aunque esta respuesta era correcta al momento de escribir, si desea ejecutar pruebas de NUnit en paralelo ahora, existen al menos 2 opciones:

  • NCrunch lo ofrece listo para usar (sin cambiar nada, pero es un producto comercial)
  • NUnit 3 ofrece un atributo paralelizable, que se puede utilizar para indicar qué pruebas se pueden ejecutar en paralelo

En este artículo se menciona que para acelerar las pruebas, el póster ejecuta varias instancias de NUnit con parámetros de comando que especifican qué pruebas debe ejecutar cada instancia.

FTA:

Me encontré con un problema extraño.

Usamos nunit-console para ejecutar pruebas en nuestro servidor de integración continua. Recientemente, nos movíamos de Nunit 2.4.8 a 2.5.5 y de .Net 3.5 a 4.0. Para acelerar la ejecución de pruebas, ejecutamos varias instancias de Nunit en paralelo con diferentes argumentos de línea de comando

  • Tenemos dos copias de nuestras asambleas de prueba y los binarios de nunidad en la carpeta A y B.
  • En la carpeta A, ejecutamos

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

  • En la carpeta B ejecutamos

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

Si ejecutamos los comandos en secuencia, ambos se ejecutan con éxito. Pero si los ejecutamos en paralelo, solo uno tiene éxito. Por lo que puedo decir, es el que primero carga los accesorios de prueba. El otro falla con el mensaje "No se puede ubicar el accesorio".

¿Este problema ya es conocido? No pude encontrar nada relacionado en la lista de errores en la plataforma de lanzamiento. Por cierto, nuestro servidor ejecuta Windows Server 2008 de 64 bits. También podría reproducir el problema en Windows 7 de 64 bits.

Suponiendo que este error está solucionado o no está ejecutando las versiones más recientes del software mencionado, debería poder replicar su técnica.

Actualizar

TeamCity parece una herramienta que puede usar para ejecutar automáticamente pruebas de NUnit. Tienen un lanzador de NUnit que se discute aquí que podría usarse para lanzar varias instancias de NUnit. Here hay una publicación de blog que analiza la fusión de múltiples resultados XML de NUnit en un único archivo de resultados.

Entonces, en teoría, usted podría hacer que TeamCity automáticamente inicie múltiples pruebas NUnit en función de cómo quiera dividir la carga de trabajo y luego combinar los resultados en un solo archivo para el procesamiento posterior a la prueba.

¿Es eso lo suficientemente automatizado para tus necesidades?


He utilizado con éxito NUnit 3.0.0 beta-4 para ejecutar pruebas en paralelo

  • Se ejecuta en el servidor de compilación
  • Ejecuta pruebas de selenio
  • Tiene soporte para Visual Studio
  • no hay soporte de Resharper todavía

Gracias por la respuesta de sus compañeros .

Gotchas:

  • El atributo paralelo no se hereda, por lo que debe especificarse en la clase de prueba.

La versión 3 de NUnit admitirá la ejecución de pruebas en paralelo:

Agregar el atributo a una clase: [Parallelizable(ParallelScope.Self)] ejecutará sus pruebas en paralelo.

• ParallelScope.None indica que la prueba no se puede ejecutar en paralelo con otras pruebas.

• ParallelScope.Self indica que la prueba en sí misma puede ejecutarse en paralelo con otras pruebas.

• ParallelScope.Children indica que los descendientes de la prueba se pueden ejecutar en paralelo uno con respecto al otro.

• ParallelScope.Fixtures indica que los dispositivos se pueden ejecutar en paralelo.

NUnit Framework-Parallel-Test-Execution


Puede usar el siguiente comando de PowerShell (para NUnit3, para NUnit2 cambiar el nombre del corredor):

PS> nunit3-console (ls -r */bin/Debug/*.Tests.dll | % FullName | sort-object -Unique)

El comando Presentado ejecuta todos los ensamblados de prueba en una sola instancia de nunit, lo que permite aprovechar la ejecución de prueba paralela incorporada del motor.

Observaciones

  1. Recuerde ajustar el patrón de búsqueda de directorio. El ejemplo dado solo ejecuta ensamblajes que terminan con los .Tests.dll y dentro /bin/Debug .

  2. Tenga en cuenta el filtrado Unique : es posible que no desee tenerlo.


Puedes probar mi pequeña herramienta TBox o consola paralela Runner o incluso el plugin para hacer calculos distribuidos, que también pueden ejecutar pruebas unitarias en el conjunto de PCs de SkyNet

TBox se creó para simplificar el trabajo con grandes soluciones, que contiene muchos proyectos. Es compatible con muchos complementos y uno de ellos proporciona la capacidad de ejecutar pruebas NUnit en paralelo. Este complemento no requiere ningún cambio en sus pruebas existentes.

También es compatible:

  • Clonación de la carpeta con prueba unitaria (si sus pruebas cambian datos locales),

  • Sincronizaciones de las pruebas (por ejemplo, si tus pruebas en testfixtureteardown matan todos los servidores de desarrollo o chromerunner para qunit)

  • modo x86 y privilegios de administrador para ejecutar pruebas

  • Lote de ejecución: puede ejecutar pruebas para muchos ensamblajes en paralelo

  • Incluso para ejecución de subproceso único, funciona más rápido que standart nunit runner, si tiene muchas pruebas pequeñas.

Además, esta herramienta es compatible con el corredor de pruebas de línea de comandos (para ejecución paralela) y puede usarlo con integración continua.


Sería un truco, pero podrías dividir las pruebas unitarias en varias categories . Luego, inicie una nueva instancia de NUnit para cada categoría.

Editar: parece que agregaron una opción / proceso a la aplicación de la consola. La ayuda de la línea de comandos indica que este es el "Modelo de proceso para las pruebas: único, separado, múltiple". El corredor de prueba también parece tener esta característica.

Edición 2: Desafortunadamente, aunque crea procesos separados para cada ensamblaje, la opción de aislamiento del proceso (/ proceso desde la línea de comandos) ejecuta los agentes uno a la vez.


Si su proyecto contiene varias DLL de prueba, puede ejecutarlas en paralelo con este script de MSBuild. Obviamente, tendrá que modificar las rutas para adaptarlas al diseño de su proyecto.

Para ejecutar con 8 núcleos ejecute 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>

Actualización Si estuviera respondiendo esta pregunta, recomendaría NCrunch y su herramienta de ejecución de prueba de línea de comando para obtener el máximo rendimiento de ejecución de prueba. No hay nada como eso y revolucionará tu ciclo de prueba de código-depuración al mismo tiempo.