Las afirmaciones son útiles para informarle sobre el estado interno del programa . Por ejemplo, que sus estructuras de datos tienen un estado válido, por ejemplo, que una Time
estructura de datos no tendrá el valor de 25:61:61
. Las condiciones verificadas por afirmaciones son:
Condiciones previas, que aseguran que la persona que llama mantiene su contrato,
Condiciones posteriores, que aseguran que la persona que llama mantiene su contrato, y
Invariantes, que aseguran que la estructura de datos siempre tenga alguna propiedad después de que la función regrese. Una invariante es una condición que es una condición previa y una condición posterior.
Las pruebas unitarias son útiles para informarle sobre el comportamiento externo del módulo . Es Stack
posible que tenga un estado consistente después de push()
que se llame al método, pero si el tamaño de la pila no aumenta en tres después de que se llama tres veces, entonces eso es un error. (Por ejemplo, el caso trivial donde la push()
implementación incorrecta solo verifica las afirmaciones y las salidas).
En sentido estricto, la principal diferencia entre las afirmaciones y las pruebas unitarias es que las pruebas unitarias tienen datos de prueba (valores para que el programa se ejecute), mientras que las afirmaciones no. Es decir, puede ejecutar sus pruebas unitarias automáticamente, mientras que no puede decir lo mismo para las afirmaciones. En aras de esta discusión, he asumido que está hablando de ejecutar el programa en el contexto de pruebas de función de orden superior (que ejecutan todo el programa y no controlan módulos como pruebas unitarias). Si no está hablando de las pruebas de función automatizadas como el medio para "ver entradas reales", entonces claramente el valor radica en la automatización y, por lo tanto, las pruebas unitarias ganarían. Si está hablando de esto en el contexto de las pruebas de función (automatizadas), consulte a continuación.
Puede haber cierta superposición en lo que se está probando. Por ejemplo, Stack
la condición posterior de una realidad puede afirmar que el tamaño de la pila aumenta en uno. Pero hay límites a lo que se puede realizar en esa afirmación: ¿Debería también verificar que el elemento superior es lo que se acaba de agregar?
Para ambos, el objetivo es aumentar la calidad. Para las pruebas unitarias, el objetivo es encontrar errores. Para las afirmaciones, el objetivo es facilitar la depuración observando estados de programa no válidos tan pronto como ocurran.
Tenga en cuenta que ninguna de las técnicas verifica la corrección. De hecho, si realiza pruebas unitarias con el objetivo de verificar que el programa sea correcto, probablemente obtendrá una prueba poco interesante que sabe que funcionará. Es un efecto psicológico: harás lo que sea para cumplir tu objetivo. Si su objetivo es encontrar errores, sus actividades reflejarán eso.
Ambos son importantes y tienen sus propios propósitos.
[Como nota final sobre las afirmaciones: para obtener el máximo valor, debe usarlas en todos los puntos críticos de su programa y no en algunas funciones clave. De lo contrario, la fuente original del problema podría haber sido enmascarada y difícil de detectar sin horas de depuración.]
:-)