Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Cree pruebas unitarias para ayudar a mantener el código funcionando correctamente a través de cambios incrementales en el código. Hay varios marcos que puede usar para escribir pruebas unitarias, incluidas algunas desarrolladas por terceros. Algunos marcos de pruebas están especializados para realizar pruebas en diferentes lenguajes o plataformas. El Explorador de pruebas proporciona una única interfaz para las pruebas unitarias en cualquiera de estos marcos. Para obtener más información sobre el Explorador de pruebas, vea Ejecutar pruebas unitarias con el Explorador de pruebas y preguntas más frecuentes sobre el Explorador de pruebas.
En este tutorial se muestra cómo desarrollar un método probado en C# mediante Microsoft Test Framework (MSTest). Puede adaptarlo fácilmente a otros lenguajes u otros marcos de pruebas, como NUnit. Para obtener más información, consulte Instalación de marcos de pruebas unitarias de terceros.
Creación de una prueba y generación de código
Cree un proyecto de biblioteca de clases de C# para .NET o .NET Standard. Este proyecto contendrá el código que queremos probar. Asigne al proyecto el nombre MyMath.
En la misma solución, agregue un nuevo proyecto de prueba de MSTest para .NET.
En la versión 16.9 de Visual Studio 2019, el nombre de la plantilla de proyecto msTest es proyecto de prueba unitaria.
Asigne al proyecto de prueba el nombre MathTests.
En el proyecto de prueba, escriba un método de prueba simple que compruebe el resultado obtenido para una entrada específica. Agregue el código siguiente a la
Test1
clase oUnitTest1
:[TestMethod] public void BasicRooterTest() { // Create an instance to test: Rooter rooter = new Rooter(); // Define a test input and output value: double expectedResult = 2.0; double input = expectedResult * expectedResult; // Run the method under test: double actualResult = rooter.SquareRoot(input); // Verify the result: Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 100); }
Genere un tipo a partir del código de prueba.
Coloque el cursor en
Rooter
, y a continuación, abra el menú de bombilla.Elija Generar nuevo tipo.
Elija Generar tipo 'Rooter'>Generar nuevo tipo.
En el cuadro de diálogo Generar tipo , establezca Proyecto en MyMath, el proyecto de biblioteca de clases y, a continuación, elija Aceptar.
Genere un método a partir del código de prueba. Coloque el cursor en
SquareRoot
y, a continuación, en el menú de bombilla, elija Generar método 'SquareRoot' o Generar método 'Rooter.SquareRoot'.Ejecute la prueba unitaria.
Abra el Explorador de pruebas.
Para abrir el Explorador de pruebas en el menú Prueba , elija Explorador de pruebas.
Para abrir el Explorador de pruebas en el menú Prueba, elijaExplorador de pruebas de>.
En el Explorador de pruebas, elija el botón Ejecutar todo para ejecutar la prueba.
La solución se compila y la prueba se ejecuta y se produce un error.
Seleccione el nombre de la prueba.
Los detalles de la prueba aparecen en el panel Resumen detallado de pruebas.
Seleccione el vínculo superior en Seguimiento de pila para ir a la ubicación donde se produjo un error en la prueba.
En este momento, ha creado una prueba y un código auxiliar que puede modificar para que la prueba pase.
Comprobación de un cambio de código
En el archivo Class1.cs , mejore el código de
SquareRoot
:public double SquareRoot(double input) { return input / 2; }
En el Explorador de pruebas, elija Ejecutar todo.
La solución se compila y la prueba se ejecuta y se supera.
Ampliar el rango de entradas
Para mejorar nuestra confianza de que el código funciona en todos los casos, agregue pruebas que prueben una gama más amplia de valores de entrada.
Sugerencia
Evite modificar las pruebas existentes que superen. En su lugar, agregue nuevas pruebas. Cambie las pruebas existentes solo cuando cambien los requisitos del usuario. Esta directiva ayuda a asegurarse de que no pierde la funcionalidad existente a medida que trabaja para ampliar el código.
En la clase de prueba, agregue la prueba siguiente, que intenta un intervalo de valores de entrada:
[TestMethod] public void RooterValueRange() { // Create an instance to test. Rooter rooter = new Rooter(); // Try a range of values. for (double expected = 1e-8; expected < 1e+8; expected *= 3.2) { RooterOneValue(rooter, expected); } } private void RooterOneValue(Rooter rooter, double expectedResult) { double input = expectedResult * expectedResult; double actualResult = rooter.SquareRoot(input); Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 1000); }
En el Explorador de pruebas, elija Ejecutar todo.
Se produce un error en la nueva prueba (aunque la primera prueba sigue superada). Para buscar el punto de error, seleccione la prueba con errores y, a continuación, examine los detalles en el panel Resumen de detalles de la prueba.
Inspeccione el método sometido a prueba para ver lo que podría ser incorrecto. Modifique el código
SquareRoot
de la siguiente manera:public double SquareRoot(double input) { double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = result - (result * result - input) / (2 * result); } return result; }
En el Explorador de pruebas, elija Ejecutar todo.
Ahora se superan ambas pruebas.
Adición de pruebas para casos excepcionales
Agregue una nueva prueba para entradas negativas:
[TestMethod] public void RooterTestNegativeInput() { Rooter rooter = new Rooter(); Assert.ThrowsException<ArgumentOutOfRangeException>(() => rooter.SquareRoot(-1)); }
En el Explorador de pruebas, elija Ejecutar todo.
Se produce un error en la nueva prueba.
Si el método bajo prueba entra en un bucle, elija Cancelar en la barra de herramientas del Explorador de Pruebas. La prueba deja de ejecutarse y produce un error.
Corrija el
SquareRoot
código agregando la siguienteif
instrucción al principio del método :public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } ...
En el Explorador de pruebas, elija Ejecutar todo.
Todas las pruebas superadas.
Refactorización del código en prueba
Refactorice el código, pero no cambie las pruebas.
Sugerencia
Una refactorización es un cambio que está pensado para que el código funcione mejor o sea más fácil de entender. No está pensado para modificar el comportamiento del código y, por tanto, no se cambian las pruebas.
Se recomienda realizar pasos de refactorización por separado de los pasos que amplían la funcionalidad. Mantener las pruebas sin cambios le da la confianza de que no ha introducido errores accidentalmente durante la refactorización.
Cambie la línea que calcula
result
en el método de laSquareRoot
siguiente manera:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = (result + input / result) / 2; //was: result = result - (result * result - input) / (2*result); } return result; }
Elija Ejecutar todo y compruebe que todas las pruebas siguen superadas.