xunit.net

xunit.net - ¿Cómo omitir dinámicamente una prueba con Xunit 2.0?



(3)

Esto finalmente se ha solucionado en el problema xunit/samples.xunit#8 .

El asombroso @BradWilson puso a disposición como una muestra completa y detallada en el repositorio samples.xunit .

Xunit 1.9.x proporciona al usuario el ejemplo DynamicSkipExample.cs para ayudarlo a configurar la omisión dinámica de un [Fact] .

Esto ha demostrado ser bastante útil cuando se realiza un desarrollo multiplataforma. Esto permite que una prueba se ignore temporalmente cuando no se puede ejecutar correctamente debido al contexto subyacente (SO, sistema de archivos, ...).

Sin embargo, este ejemplo se ha eliminado en commit 2deeff5 en el camino a la versión 2.0.

¿Cómo se puede volver a implementar dicha funcionalidad a través de uno de los puntos de extensibilidad de Xunit 2.0?

Nota: Se ha planteado un problema sobre este tema en el seguimiento de xUnit. Ver xunit/xunit#250 .


También puedes buscar SkippableFact en Nugget Manager, luego puedes usar todas las funciones con [SkippableFact]


[Actualización: XUnit v2.0 (RTM) ahora está disponible y las pruebas que se pueden omitir son compatibles con él directamente. Utilice [Fact (Skip = "specific reason")] ]

Tenga en cuenta que XUnit v2.0 no se ha enviado. Este ejemplo es compatible con Xunit 2.0 beta5, que puede encontrar en nuget.org. Puede haber otras formas de lograr esto (ya que este es solo el ejemplo al que llegué).

1) Define un atributo que decorará tus pruebas.

/// <inheritdoc/> [AttributeUsage( AttributeTargets.Method, AllowMultiple = false )] [XunitTestCaseDiscoverer( "SkippableTestCaseDiscoverer", "assemblynamehere" )] public sealed class SkippableTestAttribute : FactAttribute { public SkippableTestAttribute() { } }

2) Crea tu descubridor. (Seguimos el ejemplo del código en https://github.com/xunit/xunit/blob/2d9ce6fbd75e91a69a0cc83e1bc3d4eab18b2c6c/src/xunit.execution/Sdk/Frameworks/TheoryDiscoverer.cs )

/// <summary> /// Implementation of <see cref="IXunitTestCaseDiscoverer"/> that supports finding test cases /// on methods decorated with <see cref="SkippableTestAttribute"/>. /// </summary> public class SkippableTestCaseDiscoverer : IXunitTestCaseDiscoverer { /// <inheritdoc/> [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Needs to return test case." )] public IEnumerable<IXunitTestCase> Discover( ITestMethod testMethod, IAttributeInfo factAttribute ) { // some of this code is from https://github.com/xunit/xunit/blob/2d9ce6fbd75e91a69a0cc83e1bc3d4eab18b2c6c/src/xunit.execution/Sdk/Frameworks/TheoryDiscoverer.cs if ( factAttribute.GetNamedArgument<string>( "Skip" ) != null ) return new[] { new XunitTestCase( testMethod ) }; var dataAttributes = testMethod.Method.GetCustomAttributes( typeof( DataAttribute ) ); try { var results = new List<XunitTestCase>(); foreach ( var dataAttribute in dataAttributes ) { var discovererAttribute = dataAttribute.GetCustomAttributes( typeof( DataDiscovererAttribute ) ).First(); var discoverer = ExtensibilityPointFactory.GetDataDiscoverer( discovererAttribute ); if ( !discoverer.SupportsDiscoveryEnumeration( dataAttribute, testMethod.Method ) ) return new XunitTestCase[] { new XunitTheoryTestCase( testMethod ) }; // These lines are our "custom dynamic logic" that determines if we should skip the test. IEnumerable<object[]> data = discoverer.GetData( dataAttribute, testMethod.Method ); if ( data == null ) { var test = new SkippableTestCase( testMethod ); test.SkipTest( "Test not configured with any " ); return new[] { test }; } foreach ( var dataRow in data ) { // Attempt to serialize the test case, since we need a way to uniquely identify a test // and serialization is the best way to do that. If it''s not serializable, this will // throw and we will fall back to a single theory test case that gets its data // at runtime. var testCase = new XunitTestCase( testMethod, dataRow ); SerializationHelper.Serialize( testCase ); results.Add( testCase ); } } if ( results.Count == 0 ) results.Add( new LambdaTestCase( testMethod, () => { throw new InvalidOperationException( String.Format( "No data found for {0}.{1}", testMethod.TestClass.Class.Name, testMethod.Method.Name ) ); } ) ); return results; } catch { return new XunitTestCase[] { new XunitTheoryTestCase( testMethod ) }; } } }

3) Cree una clase que implemente IXunitTestCase (ya que la clase base predeterminada no permite modificar el motivo de omisión).

// Class is similar to XunitTestCase [Serializable] public class SkippableTestCase : TestMethodTestCase, IXunitTestCase { [EditorBrowsable(EditorBrowsableState.Never)] [Obsolete("Called by the de-serializer", error: true)] public SkippableTestCase() { } /// <summary> /// Initializes a new instance of the <see cref="SkippableTestCase"/> class. /// </summary> /// <param name="testMethod">The test method this test case belongs to.</param> /// <param name="testMethodArguments">The arguments for the test method.</param> public SkippableTestCase(ITestMethod testMethod, object[] testMethodArguments = null) : base(testMethod, testMethodArguments) { } /// <inheritdoc /> protected SkippableTestCase(SerializationInfo info, StreamingContext context) : base(info, context) { } public void SkipTest( string reason ) { base.SkipReason = reason; } /// <inheritdoc/> public virtual Task<RunSummary> RunAsync( IMessageBus messageBus, object[] constructorArguments, ExceptionAggregator aggregator, CancellationTokenSource cancellationTokenSource ) { return new XunitTestCaseRunner( this, DisplayName, SkipReason, constructorArguments, TestMethodArguments, messageBus, aggregator, cancellationTokenSource ).RunAsync(); } }

Tienes muchas opciones para configurar la base.SkipReason. En esta muestra, se creó un método público.

Este ejemplo omitirá las pruebas que tengan un MemberDataAttribute que no devuelve filas de datos. Puede modificarlo para devolver el SkippableTestCase función de sus criterios. Por ejemplo, este descubrimiento salta las pruebas el domingo.

/// <inheritdoc/> [System.Diagnostics.CodeAnalysis.SuppressMessage( "Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Needs to return test case." )] public IEnumerable<IXunitTestCase> Discover( ITestMethod testMethod, IAttributeInfo factAttribute ) { if ( DateTime.Today.DayOfWeek == DayOfWeek.Sunday ) { var test = new SkippableTestCase( testMethod ); test.SkipTest( "Test not configured with any " ); return new[] { test }; } else { return new[] { new XunitTestCase( testMethod ) }; } }