Estoy intentando realizar una prueba unitaria de un motor de administración de host WCF que he escrito. Básicamente, el motor crea instancias de ServiceHost sobre la marcha en función de la configuración. Esto nos permite reconfigurar dinámicamente qué servicios están disponibles sin tener que desactivarlos todos y reiniciarlos cada vez que se agrega un nuevo servicio o se elimina uno antiguo.
Sin embargo, me he encontrado con una dificultad en la prueba unitaria de este motor de administración de host debido a la forma en que funciona ServiceHost. Si ya se ha creado, abierto y no cerrado un ServiceHost para un punto final en particular, no se puede crear otro ServiceHost para el mismo punto final, lo que genera una excepción. Debido al hecho de que las plataformas modernas de pruebas unitarias paralelizan su ejecución de prueba, no tengo una forma efectiva de probar este código.
He usado xUnit.NET, esperando que debido a su extensibilidad, pueda encontrar una manera de forzarlo a ejecutar las pruebas en serie. Sin embargo, no he tenido suerte. Espero que alguien aquí en SO haya encontrado un problema similar y sepa cómo hacer que las pruebas unitarias se ejecuten en serie.
NOTA: ServiceHost es una clase WCF, escrita por Microsoft. No tengo la capacidad de cambiar su comportamiento. Alojar cada punto final de servicio solo una vez es también el comportamiento adecuado ... sin embargo, no es particularmente propicio para las pruebas unitarias.
fuente
TestServer
en la ventana acoplable. Entonces tuve que serializar las pruebas de integración.Respuestas:
Cada clase de prueba es una colección de prueba única y las pruebas debajo de ella se ejecutarán en secuencia, por lo que si coloca todas sus pruebas en la misma colección, se ejecutará secuencialmente.
En xUnit puede realizar los siguientes cambios para lograr esto:
Lo siguiente se ejecutará en paralelo:
Para que sea secuencial, solo necesita poner ambas clases de prueba en la misma colección:
Para obtener más información, puede consultar este enlace.
fuente
Como se indicó anteriormente, todas las buenas pruebas unitarias deben estar 100% aisladas. El uso de un estado compartido (por ejemplo, dependiendo de una
static
propiedad que se modifica en cada prueba) se considera una mala práctica.Habiendo dicho eso, su pregunta sobre la ejecución de pruebas xUnit en secuencia tiene una respuesta. Encontré exactamente el mismo problema porque mi sistema usa un localizador de servicio estático (que es menos que ideal).
De forma predeterminada, xUnit 2.x ejecuta todas las pruebas en paralelo. Esto se puede modificar por ensamblaje definiendo el
CollectionBehavior
en su AssemblyInfo.cs en su proyecto de prueba.Para uso de separación por ensamblaje:
o para ninguna paralelización en absoluto uso:
Este último es probablemente el que desea. Puede encontrar más información sobre la paralelización y la configuración en la documentación de xUnit .
fuente
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerClass, DisableTestParallelization = true)]
. Gracias a ti, @Squiggle, puedo hacer todas mis pruebas e ir a tomar un café. :)Para proyectos .NET Core, cree
xunit.runner.json
con:Además,
csproj
debe contenerPara proyectos antiguos .Net Core,
project.json
debe contenerfuente
<ItemGroup><None Include="xunit.runner.json" CopyToOutputDirectory="Always" /></ItemGroup>
o similar?<ItemGroup> <None Update="xunit.runner.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
dotnet test --no-build -c Release -- xunit.parallelizeTestCollections=false
pero no funcionó para mí.Para proyectos .NET Core, puede configurar xUnit con un
xunit.runner.json
archivo, como se documenta en https://xunit.github.io/docs/configuring-with-json.html .La configuración que debe cambiar para detener la ejecución de la prueba en paralelo es
parallelizeTestCollections
, que por defecto estrue
:Entonces, un mínimo
xunit.runner.json
para este propósito pareceComo se indica en los documentos, recuerde incluir este archivo en su compilación, ya sea por:
Añadiendo
a su
.csproj
archivo, oAñadiendo
a su
project.json
archivodependiendo de su tipo de proyecto.
Finalmente, además de lo anterior, si está utilizando Visual Studio, asegúrese de no haber hecho clic accidentalmente en el botón Ejecutar pruebas en paralelo , lo que hará que las pruebas se ejecuten en paralelo incluso si ha desactivado la paralelización en
xunit.runner.json
. Los diseñadores de UI de Microsoft han hecho que este botón no esté etiquetado, sea difícil de notar y esté a un centímetro del botón "Ejecutar todo" en el Explorador de pruebas, solo para maximizar la posibilidad de que lo presione por error y no tenga idea de por qué sus pruebas. están fallando repentinamente:fuente
xunit.runner.json
archivo? ¿Y qué tiene que ver especificar unaxunit.runner.json
con hacer que las pruebas se ejecuten en serie?Esta es una vieja pregunta, pero quería escribir una solución para las personas que buscan recientemente como yo :)
Nota: utilizo este método en las pruebas de integración de Dot Net Core WebUI con xunit versión 2.4.1.
Cree una clase vacía llamada NonParallelCollectionDefinitionClass y luego asigne el atributo CollectionDefinition a esta clase como se muestra a continuación. (La parte importante es DisableParallelization = true setting.)
Luego, agregue el atributo Collection a la clase que no desea que se ejecute en paralelo como se muestra a continuación. (La parte importante es el nombre de la colección. Debe coincidir con el nombre utilizado en CollectionDefinition)
Cuando hacemos esto, en primer lugar se ejecutan otras pruebas paralelas. Después de eso, se ejecutan las otras pruebas que tienen el atributo Colección ("Colección No Paralela").
fuente
puedes usar lista de reproducción
haga clic derecho en el método de prueba -> Agregar a la lista de reproducción -> Nueva lista de reproducción
luego puede especificar el orden de ejecución, el valor predeterminado es, ya que los agrega a la lista de reproducción, pero puede cambiar el archivo de la lista de reproducción como desee
fuente
No conozco los detalles, pero parece que está intentando hacer pruebas de integración en lugar de pruebas unitarias . Si pudiera aislar la dependencia de
ServiceHost
, eso probablemente haría sus pruebas más fáciles (y más rápidas). Entonces (por ejemplo) puede probar lo siguiente de forma independiente:IServiceHostFactory
y unaIConfiguration
Herramientas que ayudarían a incluir marcos de aislamiento (burla) y (opcionalmente) marcos de contenedores de IoC. Ver:
fuente
Tal vez puedas usar las pruebas unitarias avanzadas . Le permite definir la secuencia en la que ejecuta la prueba . Por lo tanto, es posible que deba crear un nuevo archivo cs para alojar esas pruebas.
A continuación, le mostramos cómo puede modificar los métodos de prueba para que funcionen en la secuencia que desee.
Hágame saber si funciona.
fuente
Para mí, en la aplicación .Net Core Console, cuando quería ejecutar métodos de prueba (no clases) sincrónicamente, la única solución que funcionó fue la que se describe en este blog: xUnit: Control del orden de ejecución de la prueba
fuente
Agregué el atributo [Colección ("Secuencial")] en una clase base:
fuente
Ninguna de las respuestas sugeridas hasta ahora funcionó para mí. Tengo una aplicación de dotnet core con XUnit 2.4.1. Logré el comportamiento deseado con una solución al poner un candado en cada prueba unitaria. En mi caso, no me importaba el orden de ejecución, solo que las pruebas fueran secuenciales.
fuente