deploy - subir proyecto django a servidor
Cómo ejecutar las pruebas de Django en Heroku (2)
Tengo una aplicación que está implementada en Heroku y me gustaría poder ejecutar la suite de pruebas después del despliegue en el entorno de destino. Estoy usando el complemento Heroku Postgres , lo que significa que solo tengo acceso a una base de datos única. No tengo derechos para crear nuevas bases de datos, lo que a su vez significa que el comando de prueba estándar de Django falla, ya que no puede crear la base de datos test_ *.
$ heroku run python manage.py test
Running `python manage.py test` attached to terminal... up, run.9362
Creating test database for alias ''default''...
Got an error creating the test database: permission denied to create database
¿Hay alguna manera de evitar esto?
A partir de la versión 1.8, Django ahora tiene una opción llamada keepdb , que permite reutilizar la misma base de datos durante las pruebas.
La opción --keepdb se puede usar para preservar la base de datos de prueba entre ejecuciones de prueba.
Esto tiene la ventaja de omitir las acciones de crear y destruir, lo que puede disminuir considerablemente el tiempo de ejecución de las pruebas, especialmente las de un conjunto de pruebas grande.
Si la base de datos de prueba no existe, se creará en la primera ejecución y luego se conservará para cada ejecución posterior.
Cualquier migración no aplicada también se aplicará a la base de datos de prueba antes de ejecutar el conjunto de pruebas.
Ya que también permite que exista la base de datos de prueba antes de ejecutar las pruebas, simplemente puede agregar una nueva instancia de Postgres Heroku a su dinamómetro y configurar las pruebas para usar esa base de datos en particular.
Bonificación : también puede usar la opción de failfast , que sale tan pronto como se bloquea la primera prueba, para que no tenga que esperar a que se completen todas las pruebas.
Sin embargo, si está implementando elementos en Heroku y está utilizando Heroku Pipelines , hay una opción aún mejor disponible: Heroku CI .
Resulta que estaba en el mal . No estaba probando lo que pensé que se estaba probando ... Como la malla de enrutamiento de Heroku enviaba solicitudes a diferentes servidores, el LiveServerTestCase estaba iniciando un servidor web en una máquina y Selenium se estaba conectando a otras máquinas por completo.
Al actualizar el archivo Heroku Procfile a:
web: python src/manage.py test --liveserver=0.0.0.0:$PORT
anulando la configuración de DATABASES
para que apunte a la base de datos de prueba, y personalizando el conjunto de programas de prueba vinculado a continuación (la misma idea sigue vigente: anular las setup_databases
modo que solo setup_databases
/ vuelva a crear las tablas, no la base de datos completa), pude Ejecutar pruebas remotas. Pero esto es aún más hacky / doloroso / poco elegante. Sigo buscando algo mejor! Perdón por la confusión.
(respuesta actualizada abajo)
Aquí están los pasos que me funcionaron:
- Cree una base de datos adicional gratuita de Postgres utilizando el cinturón de herramientas de Heroku
heroku addons:add heroku-postgresql:dev
- Use la clase HerokuTestSuiteRunner que encontrará here .
Este corredor de prueba personalizado requiere que defina una configuración de TEST_DATABASES
que sigue el formato típico de DATABASES
. Por ejemplo:
TEST_DATABASES = {
''default'': dj_database_url.config(env=''TEST_DATABASE_URL'')
}
Luego, TEST_RUNNER
configuración TEST_RUNNER
sea una ruta de Python a donde se pueda encontrar HerokuTestSuiteRunner.
Ahora debería poder ejecutar las pruebas de Django en Heroku usando la base de datos dada. Esto es en gran medida un truco rápido ... Déjame saber cómo podría mejorarse / hacerse menos malicioso. ¡Disfrutar!
(respuesta original abajo)
Algunas soluciones relevantes han sido discutidas here . Como puede leer en la documentación de Django , "[cuando] al usar el motor de base de datos SQLite, las pruebas usarán por defecto una base de datos en memoria".
Aunque esto no prueba a fondo el motor de base de datos que está utilizando en Heroku (todavía estoy buscando una solución que lo haga), al configurar el motor de base de datos en SQLite al menos le permitirá ejecutar sus pruebas.
Vea la here arriba enlazada para algunos punteros. Hay al menos dos formas de salir: probar if ''test'' in sys.argv
antes de forzar a SQLite como motor de base de datos, o tener un archivo de configuración dedicado en las pruebas, que luego puede pasar a la django manage.py test
usando el --settings
.