Un problema que creo que voy a encontrar con mis pruebas de integración es tener múltiples pruebas accediendo a la misma base de datos. Si bien esto no es un problema ahora, sé que tenemos varias aplicaciones aquí que acceden a la misma base de datos y solo estoy tratando de pensar en una forma de prevenir este problema antes de que ocurra.
Una idea que he visto mucho es usar transacciones. En el inicio, inicia una transacción y luego, en el desmontaje, revierte la transacción. Esto significa que múltiples pruebas acceden a las mismas tablas de la base de datos y no se afectarán entre sí, lo cual es excelente. El problema que tengo es que, en mi caso, el 85-95% de las tablas con las que estoy trabajando en MySQL son MyISAM que no admiten transacciones.
¿Hay alguna forma de evitar los motores de almacenamiento que no admiten transacciones pero que aún permiten que varias pruebas accedan a las mismas tablas sin que se afecten entre sí? Por lo que escuché, el marco de prueba de ruby on rails utiliza las transacciones de esta manera, ¿cómo pueden solucionar este problema (o lo hacen)?
fuente
Respuestas:
En mi empresa, hubo ese debate: la persistencia es un gran problema para las pruebas.
Hay algunos trucos que te llevarán a la mitad. Decidimos no perder nuestro tiempo con ellos:
does
y la prueba queundoes
. Tan pronto como la coincidencia no sea perfecta, los síntomas no son claros, una prueba puede fallar y aparecer unos cientos de líneas más tarde; o una prueba que debería fallar podría pasar erróneamente.Así que pasamos a una política que sabíamos que era válida:
fuente
Incluso si no tiene "transacciones", en el sentido T-SQL, debe esforzarse por hacer que sus transacciones (en el sentido general del término) sean atómicas. Las pruebas no deben basarse entre sí y deben ser reversibles. Si no tiene ningún alcance oficial de reversión o transacción, entonces puede querer hacer el suyo. Por ejemplo, puede hacer que sus pruebas unitarias realicen una limpieza, donde eliminen todos los registros que se crearon en la prueba.
fuente
Solo haga que cada usuario o cada ejecución anule la base de datos utilizada. Eso es lo que hacemos en el trabajo. Entonces nunca tendrá problemas con 2 pruebas simultáneas que interfieren entre sí.
Cada ejecución de prueba construye la base de datos con migraciones, llena la base de datos con elementos fijos y luego los desarma al final.
Si el DBMS admite transacciones, lo usamos como una optimización para la configuración inicial y el desmontaje. Son opcionales, aunque su prueba puede durar un poco sin ella. Como siempre YYMV.
Sin alboroto, sin muss.
fuente