Recientemente he tenido muchas ocasiones en las que he necesitado mantener funciones y procedimientos almacenados complejos. Estos ya estaban rotos, por lo general de maneras bastante sutiles: había muy pocas ocasiones en las que llamaba al SP con parámetros válidos y simplemente no funcionaba.
Mi solución fue desarrollar un marco de trabajo que ejecute los procedimientos almacenados dentro de una transacción, después de inicializar la base de datos a las condiciones iniciales que necesitaba, luego probar el resultado esperado, también dentro de la misma transacción. La transacción fue revertida al final de la prueba.
Esto ha funcionado muy bien. Pero algunos llamarían a esto "pruebas de integración", ya que implica la integración con la base de datos. Lo llamo prueba unitaria, ya que probé componentes individuales y casos de prueba individuales para esos componentes, y desde que controlé completamente el estado inicial de la base de datos.
Pero, ¿dónde debe trazarse la línea? ¿Es esta prueba de integración o prueba unitaria? ¿Hay alguna razón práctica por la cual este tipo de prueba es una mala idea? Si esto es "solo" pruebas de integración, ¿alguien tiene sugerencias sobre cómo hacer "pruebas unitarias" reales en estos procedimientos almacenados?
Actualización, 3 años y medio después. En mi proyecto actual, comencé a usar pruebas unitarias SSDT, con éxito, aunque podrían ser mejores. Consulte Verificación del código de la base de datos mediante pruebas unitarias de SQL Server . Por lo general, implementan el proyecto de base de datos en su instancia de SQL Server LocalDB, por lo que esto elimina cualquier duda sobre el entorno de la base de datos que afecta la prueba. Rellene la base de datos con los datos requeridos durante la Prueba preliminar, que elimina las preguntas sobre el contenido de la base de datos. De hecho, utilizo declaraciones MERGE para hacer esto, asegurando que cualquier información que no necesite para la prueba actual se elimine, inserte o actualice de la base de datos antes de la prueba. Tienen problemas:
- No son rapidos
- No es posible reutilizar las condiciones de prueba
- No es posible reutilizar las pruebas previas (a menos que las haga comunes a todas las pruebas en un proyecto)
- La interfaz de usuario podría mejorarse
Una de las razones de los problemas anteriores es que todavía no me he quejado de ellos. Recomiendo que cualquier persona interesada pruebe esta función y luego se queje. Así se hacen las mejoras.
fuente