Estoy codificando pruebas en C # y me decidí por esta estructura:
try
{
// ==========
// ARRANGE
// ==========
// Insert into the database all test data I'll need during the test
// ==========
// ACT
// ==========
// Do what needs to be tested
// ==========
// ASSERT
// ==========
// Check for correct behavior
}
finally
{
// ==========
// CLEANUP
// ==========
// Inverse of ARRANGE, delete the test data inserted during this test
}
El concepto era "cada prueba limpia el desorden que hace". Sin embargo, algunas pruebas dejan la base de datos sucia y fallan las pruebas posteriores.
¿Cuál es la forma correcta de hacer esto? (minimizar errores, minimizar el tiempo de ejecución)
- Deletes everything» Insert defaults» Insert test data»¿Ejecutar prueba?
Insert defaults» Insert test data» Ejecutar prueba » Delete everything?
Actualmente :
- (por sesión) Deletes everything»Insert defaults
- (por prueba) Insert test data»Ejecutar prueba»Delete test data
El gran problema con las bases de datos y las pruebas (unitarias) es que las bases de datos son muy buenas para persistir.
La solución habitual es no usar una base de datos real en sus pruebas unitarias, sino burlarse de la base de datos o usar una base de datos en memoria que pueda borrarse fácilmente entre pruebas.
Solo cuando se prueba el código que interactúa directamente con la base de datos, o en pruebas de extremo a extremo, se usará la base de datos real.
fuente
Trabajando en un servidor C # con SQL Server y PetaPoco , este es el enfoque que tomamos para limpiar los datos en las pruebas unitarias.
Una prueba unitaria típica tendría la configuración y el desmontaje de la siguiente manera:
Donde PlatformDataObject es una clase responsable de comunicarse con la base de datos, por ejemplo, realizar Seleccionar Insertar Actualizar Eliminar. Todos los tipos de * DataObject heredan ServerDataObject: la clase base tiene métodos para abortar, revertir o confirmar la transacción.
Todas las pruebas unitarias llamarían RollbackTransaction (), finalmente llamarían IDbTransaction.Rollback ().
En las pruebas, encontramos que era una rutina crear una nueva instancia de un * DataObject, crear algunas filas usando instrucciones Insertar, realizar pruebas en ellas (selecciones, actualizaciones, etc.) y luego revertir.
Podemos configurar un conjunto de datos de prueba antes de que todas las pruebas se ejecuten utilizando un SetUpFixture , una clase que se ejecuta una vez antes de que se ejecuten todas las pruebas, y eliminar / deshacer los datos en desmontaje después de que se ejecuten todas las pruebas.
fuente