Este verano pasado estaba desarrollando una aplicación CRUD de servidor ASP.NET/SQL básica, y la prueba de unidades era uno de los requisitos. Me encontré con algunos problemas cuando intenté contra la base de datos. A mi entender, las pruebas unitarias deben ser:Bases de datos de pruebas unitarias
- sin estado
- independientes entre sí
- repetible con el mismo resultado, es decir, sin que persiste cambia
Estos requisitos parecen estar en desacuerdo con uno otro cuando se desarrolla para una base de datos. Por ejemplo, no puedo probar Insertar() sin asegurarme de que las filas que se van a insertar aún no están allí, por lo tanto, necesito llamar a Eliminar() primero. Pero, ¿y si no están ya allí? Entonces necesitaría llamar primero a la función Exists().
Mi solución final implicó funciones de configuración muy grandes (¡asqueroso!) Y un caso de prueba vacío que se ejecutaría primero e indicaría que la configuración se ejecutó sin problemas. Esto se está sacrificando por la independencia de las pruebas mientras se mantiene su apatridia.
Otra solución que encontré es envolver las llamadas a función en una transacción que se puede revertir fácilmente, como Roy Osherove's XtUnit. Este trabajo, pero implica otra biblioteca, otra dependencia, y parece una solución demasiado pesada para el problema en cuestión.
Entonces, ¿qué ha hecho la comunidad SO cuando se enfrenta a esta situación?
tgmdbm dijo:
Normalmente, se utiliza el marco de la unidad de pruebas automatizado favorito para realizar pruebas de integración, que es por qué algunas personas se confunden, pero no siguen la misma reglas. Usted es permitido implicar la implementación concreta de muchas de sus clases (porque han sido probadas en unidades). Está probando cómo sus clases concretas interactúan entre sí y con la base de datos.
Así que si leo esto correctamente, no hay realmente ninguna manera de forma eficaz unidad de prueba de una capa de acceso a datos. O, ¿una "prueba unitaria" de una capa de acceso a datos implicará probar, por ejemplo, los comandos SQL/generados por las clases, independientemente de la interacción real con la base de datos?