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?
156
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.fuente
Debug.Assert
en modo de lanzamiento?Desde el código completo
fuente
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:
fuente
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.
fuente
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.
fuente
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í
fuente
En primer lugar, el
Assert()
método está disponible paraTrace
yDebug
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:
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 laTrace.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.fuente
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!)
fuente
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).
fuente