Estoy depurando con puntos de interrupción y me doy cuenta de la llamada de afirmación? Pensé que era solo para pruebas unitarias. ¿Qué hace más que el punto de interrupción? Como puedo romper el punto, ¿por qué debería usar Assert?
Estoy depurando con puntos de interrupción y me doy cuenta de la llamada de afirmación? Pensé que era solo para pruebas unitarias. ¿Qué hace más que el punto de interrupción? Como puedo romper el punto, ¿por qué debería usar Assert?
Respuestas:
En una compilación de depuración, Assert
toma una condición booleana como parámetro y muestra el diálogo de error si la condición es falsa. El programa continúa sin interrupción si la condición es verdadera.
Si compila en Release, todos se Debug.Assert
omiten automáticamente.
Debug.Assert
en modo de lanzamiento?
Desde el código completo
8 Programación defensiva
8.2 Afirmaciones
Una aserción es un código que se usa durante el desarrollo, generalmente una rutina o macro, que permite que un programa se verifique a sí mismo mientras se ejecuta. Cuando una afirmación es verdadera, eso significa que todo está funcionando como se esperaba. Cuando es falso, eso significa que ha detectado un error inesperado en el código. Por ejemplo, si el sistema supone que un archivo de información del cliente nunca tendrá más de 50,000 registros, el programa podría contener una afirmación de que el número de registros es menor o igual a 50,000. Mientras el número de registros sea menor o igual a 50,000, la afirmación será silenciosa. Sin embargo, si encuentra más de 50,000 registros, "afirmará" en voz alta que hay un error en el programa.
Las afirmaciones son especialmente útiles en programas grandes y complicados y en programas de alta confiabilidad. Permiten a los programadores eliminar más rápidamente las suposiciones de interfaz no coincidentes, los errores que se arrastran cuando se modifica el código, etc.
Una aserción generalmente toma dos argumentos: una expresión booleana que describe la suposición que se supone que es verdadera y un mensaje para mostrar si no lo es.
(...)
Normalmente, no desea que los usuarios vean mensajes de afirmación en el código de producción; Las afirmaciones son principalmente para uso durante el desarrollo y mantenimiento. Las afirmaciones normalmente se compilan en el código en el momento del desarrollo y se compilan fuera del código para la producción. Durante el desarrollo, las afirmaciones eliminan suposiciones contradictorias, condiciones inesperadas, valores incorrectos pasados a las rutinas, etc. Durante la producción, se compilan del código para que las afirmaciones no degraden el rendimiento del sistema.
Debe usarlo en momentos en que no desee tener que romper cada pequeña línea de código para verificar las variables, pero sí desea obtener algún tipo de retroalimentación si ciertas situaciones están presentes, por ejemplo:
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
System.Diagnostics
Assert también le brinda otra oportunidad para reírse de las habilidades de diseño de la interfaz de usuario de Microsoft. Quiero decir: un diálogo con tres botones Abortar, Reintentar, Ignorar, y una explicación de cómo interpretarlos en la barra de título.
Assert le permite afirmar que una condición (post o pre) se aplica en su código. Es una forma de documentar sus intenciones y hacer que el depurador le informe con un diálogo si no se cumple su intención.
A diferencia de un punto de interrupción, Assert va con su código y puede usarse para agregar detalles adicionales sobre su intención.
Assert puede ayudarlo a proporcionar un comportamiento de mensajería separado entre las pruebas y el lanzamiento. Por ejemplo,
Debug.Assert(x > 2)
solo activará una interrupción si está ejecutando una compilación de "depuración", no una compilación de lanzamiento. Hay un ejemplo completo de este comportamiento aquí
En primer lugar, el Assert()
método está disponible para Trace
y Debug
clases.
Debug.Assert()
se ejecuta solo en modo de depuración.
Trace.Assert()
se está ejecutando en modo de depuración y liberación.
Aquí hay un ejemplo:
int i = 1 + 3;
// Debug.Assert method in Debug mode fails, since i == 4
Debug.Assert(i == 3);
Debug.WriteLine(i == 3, "i is equal to 3");
// Trace.Assert method in Release mode is not failing.
Trace.Assert(i == 4);
Trace.WriteLine(i == 4, "i is equla to 4");
Console.WriteLine("Press a key to continue...");
Console.ReadLine();
Ejecute este código en modo de depuración y luego en modo de lanzamiento.
Notará que durante el modo de depuración Debug.Assert
falla su declaración de código , aparece un cuadro de mensaje que muestra el seguimiento actual de la pila de la aplicación. Esto no está sucediendo en el modo Release ya que la Trace.Assert()
condición es verdadera (i == 4)
.
WriteLine()
El método simplemente le ofrece la opción de registrar la información en la salida de Visual Studio.
Las afirmaciones son muy importantes en Design by Contract (DbC) que, según tengo entendido, fue presentado / respaldado por Meyer, Bertand. 1997. Construcción de software orientado a objetos.
Una característica importante es que no deben producir efectos secundarios, por ejemplo, puede manejar una excepción o tomar un curso de acción diferente con una declaración if (programación defensiva).
Las afirmaciones se utilizan para verificar las condiciones previas / posteriores del contrato, la relación cliente / proveedor; el cliente debe asegurarse de que se cumplan las condiciones previas del proveedor, por ejemplo. envía £ 5 y el proveedor debe asegurarse de que se cumplan las condiciones posteriores, por ejemplo. entrega 12 rosas. (Solo una explicación simple del cliente / proveedor: puede aceptar menos y entregar más, pero sobre Afirmaciones). C # también presenta Trace.Assert (), que se puede usar para liberar código.
Para responder a la pregunta sí, siguen siendo útiles, pero pueden agregar complejidad + legibilidad al código y tiempo + difícil de mantener. ¿Deberíamos seguir usándolos? Sí, ¿los usaremos todos? Probablemente no, o no en la medida en que Meyer lo describe.
(¡Incluso el curso OU Java en el que aprendí esta técnica solo mostró ejemplos simples y el resto del código no hizo cumplir las reglas de afirmación de DbC en la mayoría del código, pero se asumió que se usaba para garantizar la corrección del programa!)
La forma en que pienso es Debug.Assert es una forma de establecer un contrato sobre cómo se debe llamar a un método, centrándose en detalles sobre los valores de un parámetro (en lugar de solo el tipo). Por ejemplo, si se supone que no debe enviar un valor nulo en el segundo parámetro, agregue la afirmación alrededor de ese parámetro para decirle al consumidor que no lo haga.
Impide que alguien use su código de una manera descabellada. Pero también permite que esa manera descabellada de pasar a la producción y no dar el mensaje desagradable a un cliente (suponiendo que construya una versión de lanzamiento).