Tips para crear y mejorar las pruebas unitarias

Tips para crear y mejorar las pruebas unitarias

En este ejercicio vamos a conocer como mejorar las pruebas unitarias de un proyecto de consola en .Net, y luego a hacer una refactorización.

  1. creemos un proyecto de .Net para convertir entre tipos de monedas

  2. image.png

    Crearemos una clase que hará la conversión.

    public static class ConversorServicio{
        public static decimal ConvertirMoneda(decimal valor, string tipoMoneda){
            if (tipoMoneda == "USD"){
                return valor / 1500M;
            }
            else{
                if (tipoMoneda == "EUR"){
                    return valor / 1250M;
                }
                else if (tipoMoneda == "CAD"){
                    return valor / 1000M;
                }
                return 0;
            }
        }
    }
  1. En el archivo program.cs haremos el llamado
using TestingRefactoring;

Console.WriteLine("***Convertir Monedas***");

//Convertir 100.000 Pesos a Dolares
Console.WriteLine($"100.000 Pesos a Dolares: {decimal.Round(ConversorServicio.ConvertirMoneda(100000, "USD"), 2)}");

//Convertir 100000 Pesos a Euros
Console.WriteLine($"100.000 Pesos a Euros: {decimal.Round(ConversorServicio.ConvertirMoneda(100000, "EUR"))}");

//Convertir 100000 Dolares a dolares canadienses
Console.WriteLine($"100.000 Dolares a Dolares Canadienses: {decimal.Round(ConversorServicio.ConvertirMoneda(100000, "CAD"))}");
  1. Debemos instalar XUnit, sera la libreria que usaremos para las pruebas unitarias

image.png

5)Ahora vemos el archivo de pruebas unitarias y ejecutaremos la siguiente prueba

        [Fact]
        public void ConvertirPesosDolares_Test1()
        {
            decimal result = decimal.Round(ConversorServicio.ConvertirMoneda(100000, "USD"), 2);
            Assert.Equal(66.67M, result);
        }

para ello podemos hacer click en este icono azul y presionamos la opcion "Run"

image.png

  1. vemos que la prueba paso satisfactoriamente

image.png

  1. ahora suponga que queramos crear otra historia con un diferente valor, un tip sería crear una prueba que falle y ver el valor actual
        [Fact]
        public void ConvertirPesosDolares_Test2()
        {
            decimal result = decimal.Round(ConversorServicio.ConvertirMoneda(200000, "USD"), 2);
            Assert.Equal(70M, result);
        }
  1. Cuando la prueba falla, vemos el valor actual que devuelve el método, actualizamos nuestro código con el valor actual

image.png

image.png

vemos que la prueba es exitosa

  1. Ahora como buena practica podemos usar las 3A para las pruebas unitarias (Arrange, Act y Assert), donde definimos las variables, luego ejecutamos la prueba y luego comparamos los resultados
        public void ConvertirPesosDolares_Test3()
        {
            //Arrange
            decimal valor = 100000;
            string tipoMoneda = "USD";
            decimal expected = 66.67M;

            //Act
            decimal result = decimal.Round(ConversorServicio.ConvertirMoneda(valor, tipoMoneda), 2);

            //Assert
            Assert.Equal(expected, result);
        }
  1. Ahora con XUnit podemos usamos el atributo [Theory] para ejecutar varias pruebas con diferentes valores en una misma prueba unitaria, para ello primero pasamos los parametros a la prueba unitaria
public void ConvertirPesosDolares_Test4(decimal valor, string tipoMoneda, decimal expected)

luego colocamos el atributo [Theory] seguido del atributo InlineData, por el cual pasaremos los valores a probar

        [Theory]
        [InlineData(100000, "USD", 66.67)]
        [InlineData(100000, "EUR", 80)]
        [InlineData(100000, "CAD", 100)]
  1. La prueba quedaría así
        [Theory]
        [InlineData(100000, "USD", 66.67)]
        [InlineData(100000, "EUR", 80)]
        [InlineData(100000, "CAD", 100)]
        public void ConvertirPesosDolares_Test4(decimal valor, string tipoMoneda, decimal expected)
        {
            //Act
            decimal result = decimal.Round(ConversorServicio.ConvertirMoneda(valor, tipoMoneda), 2);

            //Assert
            Assert.Equal(expected, result);
        }
  1. Ejecutamos las prueba y vemos que la prueba se divide en 3 sub pruebas que podemos verificar

image.png

Blue Nerd Gaming Sport and Esport Logo.png