es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo realizar pruebas de todas las combinaciones de parámetros en DataRows?

Supongamos que tengo un método de prueba como este:

[TestMethod]
[DataRow( 0, 0, 0 )]
[DataRow( 0, 0, 1 )]
[DataRow( 0, 1, 0 )]
[DataRow( 0, 1, 1 )]
[DataRow( 1, 0, 0 )]
[DataRow( 1, 0, 1 )]
[DataRow( 1, 1, 0 )]
[DataRow( 1, 1, 1 )]
public void PruebaGenial( int a, int b, int c )
{
    // algún código de prueba realmente genial que utiliza a, b y c
}

Esto prueba todas las combinaciones de a, b y c que sean iguales a 0 o 1. ¡Solo dos valores en tres parámetros y se necesitan 8 líneas de DataRow!

Lo que realmente me encantaría hacer es algo como esto:

[TestMethod]
[DataMatrix( {0,1}, {0,1}, {0,1} )]
public void PruebaGenial( int a, int b, int c )
{
    // algún código de prueba realmente genial que utiliza a, b y c
}

Me gustaría especificar algunos valores para cada parámetro y que se prueben todas las combinaciones. ¿Existe algo así utilizando MS Test?

Nota: Soy consciente del atributo DataSource. Sin embargo, me gustaría tener los valores en el código y no en un archivo externo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay un atributo incorporado en MSTest que pueda lograr el comportamiento que estás describiendo. El atributo DataRow es actualmente la mejor solución para probar todas las combinaciones de valores para múltiples parámetros en MSTest.

    Sin embargo, puedes crear un atributo personalizado que logre lo que estás buscando. Podrías crear un atributo DataMatrix que tome matrices de longitud variable y genere todas las combinaciones de valores para los parámetros. Aquí tienes un ejemplo de implementación:

    public class DataMatrixAttribute : DataAttribute
    {
        private readonly object[][] _data;
    
        public DataMatrixAttribute(params object[] parameters)
        {
            _data = GenerateDataMatrix(parameters);
        }
    
        public override IEnumerable<object[]> GetData(MethodInfo testMethod)
        {
            return _data;
        }
    
        private static object[][] GenerateDataMatrix(params object[] parameters)
        {
            var parameterArrays = parameters.Select(p => (object[])p).ToArray();
            var combinations = CartesianProduct(parameterArrays);
    
            return combinations.Select(c => c.ToArray()).ToArray();
        }
    
        private static IEnumerable<><t>> CartesianProduct<t>(params IEnumerable<t>[] sequences)
        {
            IEnumerable<><t>> emptyProduct = new[] { Enumerable.Empty<t>() };
            return sequences.Aggregate(emptyProduct, (accumulator, sequence) =>
                from accseq in accumulator
                from item in sequence
                select accseq.Concat(new[] { item }));
        }
    }
    

    Este atributo toma en cuenta matrices de valores de longitud variable para cada parámetro y genera todas las combinaciones posibles de esos valores. Puedes utilizar este atributo personalizado de la siguiente manera:

    [TestMethod]
    [DataMatrix(new object[] { 0, 1 }, new object[] { 0, 1 }, new object[] { 0, 1 })]
    public void PruebaMuyCool(int a, int b, int c)
    {
        // algún código de prueba realmente genial que utiliza a, b y c
    }
    

    Esto generará 8 pruebas, probando todas las combinaciones de a, b y c iguales a 0 o 1.</object[]>

Comments are closed.