Mis pruebas unitarias de Django tardan mucho tiempo en ejecutarse, así que estoy buscando formas de acelerarlo. Estoy considerando instalar un SSD , pero sé que también tiene sus desventajas. Por supuesto, hay cosas que podría hacer con mi código, pero estoy buscando una solución estructural. Incluso ejecutar una sola prueba es lento ya que la base de datos necesita ser reconstruida / migrada al sur cada vez. Así que aquí está mi idea ...
Como sé que la base de datos de prueba siempre será bastante pequeña, ¿por qué no puedo configurar el sistema para mantener siempre toda la base de datos de prueba en RAM? Nunca toque el disco en absoluto. ¿Cómo configuro esto en Django? Prefiero seguir usando MySQL, ya que eso es lo que uso en la producción, pero si SQLite 3 u otra cosa lo hace fácil, seguiría ese camino.
¿SQLite o MySQL tienen una opción para ejecutarse completamente en la memoria? Debería ser posible configurar un disco RAM y luego configurar la base de datos de prueba para almacenar sus datos allí, pero no estoy seguro de cómo decirle a Django / MySQL que use un directorio de datos diferente para una determinada base de datos, especialmente porque se sigue borrando y recreó cada carrera. (Estoy en una Mac FWIW).
fuente
"test" in sys.argv
; puede activarse cuando no lo desee, por ejemplomanage.py collectstatic -i test
.sys.argv[1] == "test"
Es una condición más precisa que no debería tener ese problema.Por lo general, creo un archivo de configuración separado para las pruebas y lo uso en el comando de prueba, por ejemplo
Tiene dos beneficios:
No tiene que buscar
test
ni ninguna palabra mágica en sys.argv,test_settings.py
simplemente puede serO bien, puede ajustarlo según sus necesidades, separando limpiamente la configuración de prueba de la configuración de producción.
Otro beneficio es que puede ejecutar la prueba con el motor de base de datos de producción en lugar de sqlite3 evitando errores sutiles, por lo que al desarrollar el uso
y antes de comprometer el código, ejecutar una vez
solo para estar seguro de que todas las pruebas realmente están pasando.
fuente
MySQL admite un motor de almacenamiento llamado "MEMORY", que puede configurar en la configuración de su base de datos (
settings.py
) como tal:Tenga en cuenta que el motor de almacenamiento MEMORY no admite columnas de blob / texto, por lo que si está usando
django.db.models.TextField
esto no funcionará para usted.fuente
No puedo responder a su pregunta principal, pero hay algunas cosas que puede hacer para acelerar las cosas.
En primer lugar, asegúrese de que su base de datos MySQL esté configurada para usar InnoDB. Luego puede usar transacciones para revertir el estado de la base de datos antes de cada prueba, lo que en mi experiencia ha llevado a una aceleración masiva. Puede pasar un comando de inicio de base de datos en su settings.py (sintaxis de Django 1.2):
En segundo lugar, no necesita ejecutar las migraciones del sur cada vez. Establezca
SOUTH_TESTS_MIGRATE = False
en settings.py y la base de datos se creará con syncdb simple, que será mucho más rápido que ejecutar todas las migraciones históricas.fuente
369 tests in 498.704s
a369 tests in 41.334s
. ¡Esto es más de 10 veces más rápido!--keep
para conservar la base de datos y no requerir que se vuelva a aplicar su conjunto completo de migraciones en cada ejecución de prueba. Nuevas migraciones aún se ejecutarán. Sin embargo, si cambia de sucursal con frecuencia, es fácil entrar en un estado inconsistente (puede revertir nuevas migraciones antes de cambiar cambiando la base de datos a la base de datos de prueba y ejecutándosemigrate
, pero es un poco difícil).Puedes hacer ajustes dobles:
Estoy usando ambos trucos y estoy bastante feliz.
Cómo configurarlo para MySQL en Ubuntu:
¡Cuidado, es solo para probar, después de reiniciar su base de datos desde la memoria se pierde!
fuente
Otro enfoque: tener otra instancia de MySQL ejecutándose en un tempfs que use un disco RAM. Instrucciones en esta publicación de blog: Acelerar MySQL para probar en Django .
Ventajas:
fuente
Ampliando la respuesta de Anurag, simplifiqué el proceso creando los mismos test_settings y agregando lo siguiente a manage.py
parece más limpio ya que sys ya se importó y manage.py solo se usa a través de la línea de comandos, por lo que no es necesario saturar la configuración
fuente
"test" in sys.argv
; puede activarse cuando no lo desee, por ejemplomanage.py collectstatic -i test
.sys.argv[1] == "test"
Es una condición más precisa que no debería tener ese problema../manage.py
sin argumentos (por ejemplo, para ver qué complementos están disponibles, igual que--help
)len(sys.argv) > 1 and sys.argv[1] == "test"
Use a continuación en su
setting.py
fuente