Esto depende de cómo utiliza los contratos y qué tipo de aplicación está desarrollando.
En primer lugar: Por cierto, no quiere poner a prueba las afirmaciones y condiciones posteriores (Contract.Assert
, Contract.Assume
, Contract.Ensures
y Contract.EnsuresOnThrow
) separetly. No veo ningún valor práctico al hacerlo, ya que el regrabador ya lo ha verificado durante el tiempo de ejecución, encontrará fallas muy rápidas incluso sin pruebas.
Sin embargo, en una aplicación bien probada, ninguna condición o afirmación debe fallar, incluso en entradas no válidas. Por lo tanto, si todas sus pruebas (¡incluso las que prueban el manejo de datos no válidos!) Pasan sin que una sola postcondición/afirmación falle, sus postcondiciones y aserciones pueden verse como "probadas".
Para esto, es posible que desee manejar el evento ContractFailed utilizando un "Assert.Fail" dentro de sus pruebas.
Ahora la parte "interesante" son las condiciones previas:
¿Está desarrollando una biblioteca? Entonces, definitivamente debe probarlos si su tiempo/presupuesto lo permite (es peor no probar la lógica real).
Especialmente, si está utilizando la sobrecarga "Contract.Requires <E>" que arrojará una excepción específica en las fallas de contrato, debe probarlas como la validación de parámetros regulares usando "if-throw" -constructs.
Si no está escribiendo una biblioteca, no diría que las condiciones previas de prueba son realmente necesarias; no son un requisito comercial real sino más bien un ayudante para la depuración.
Y puede ser realmente aburrido escribir una prueba unitaria por cada ArgumentNullException
que un método debería arrojar si un parámetro es null
.
Si olvida este código de validación (es decir, el Contrato específico requerido) dentro de su método, probablemente también se olvide de la prueba de unidad. Por lo tanto, el valor adicional que un parámetro-validación-prueba aporta a su código (no de biblioteca) es muy bajo para el valor conectado.
Resumiendo: No pruebe las postcondiciones y afirma. Pruebe las condiciones previas, pero solo en las bibliotecas (y tal vez en partes de su código que se utilizan como bibliotecas).
"No te compruebe las condiciones y afirmaciones. Pruebe las condiciones previas, pero solo en las bibliotecas (y tal vez en partes de su código que se utilizan como bibliotecas). - suena como un consejo bastante decente: ¿se basa en tu propia experiencia o en la sabiduría recibida? – briantyler
+1 para el gran resumen! – koenmetsu
@B Tyler: Se basa en mi experiencia y discusión con otros programadores. Sin embargo, sigue siendo solo mi opinión y no está respaldado por ningún estudio o investigación a largo plazo ;-) – Matthias