¿Cómo ejecutar pruebas automáticamente cuando hay algún cambio en mi proyecto (Django)?

En este momento estoy ejecutando la python manage.py test vez en cuando después de realizar cambios significativos en mi proyecto de django. ¿Es posible ejecutar esas pruebas automáticamente cada vez que cambio y guardo un archivo en mi proyecto? Será útil detectar errores antes (sé que los Rails tienen algo como esto con rspec). Estoy usando nose y django-nose. Gracias por adelantado.

Utilizar entr :

 $ find . -name '*.py' | entr python ./manage.py test 

O, para obtener un crédito adicional, combínelo con un ack :

 $ ack --python | entr python ./manage.py test 

Si quieres que incluso encuentre nuevos archivos a medida que los agregas:

 $ until ack -f --python | entr -d python ./manage.py test; do sleep 1; done 

Py.test respuesta (que también funciona para la nariz):

 pip install pytest-xdist py.test -f # will watch all subfolders for changes, and rerun the tests 

Como py.test entiende la nariz, esto también funciona para la nariz.

Soy un desarrollador de JavaScript, así que utilicé las herramientas que JS developer ha construido con Node.js para lograr el mismo objective en mis proyectos. Es muy simple, pero también necesita instalar nodeJS para que funcione.

Creé un archivo llamado gruntfile.js en mi directorio raíz del proyecto:

 //gruntfile.js module.exports = function(grunt) { grunt.initConfig({ watch: { files: ['*.py'], tasks: ['shell'] }, shell: { test: { command: 'python main_test.py' } } }); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-shell'); grunt.registerTask('default', ['watch']); }; 

Básicamente, lo que está haciendo es ver cualquier archivo en ese directorio que tenga una extensión py y si lo cambiaron ejecutó un comando de shell que en este caso es mi prueba de python (es posible que desee cambiarlo, mi nombre de prueba es main_test.py). Para ejecutar este script grunt necesitas instalar Node.js y después tendrás npm en tu ruta global. después de eso, también debe insertar algunos módulos de nodo. Todos estos módulos, excepto grunt-cli, se almacenarán en su carpeta actual, así que asegúrese de estar en la raíz de su proyecto o de la carpeta en la que haya puesto ese gruntfile.js. A continuación, ejecute los siguientes comandos.

 npm install grunt-cli -g npm install grunt npm install grunt-contrib-watch npm install grunt-shell 

No te preocupes por el tamaño, estos son módulos muy pequeños. Ahora que tiene todo configurado, simplemente puede ejecutar grunt y comenzará a ver sus archivos py y cuando los guardó ejecutará sus pruebas. Puede que no sea la mejor manera de ejecutar pruebas de Python, pero como dije, soy un desarrollador de JavaScript y creo que Grunt ha proporcionado una forma muy sencilla de ejecutar pruebas incluso para otros idiomas, así que lo uso.

¡Acabo de probar la nose-watch y funcionó fantástico! instala el complemento y ejecuta la prueba con la opción --with-watch .

Actualización : 🙁 no parece funcionar bien cuando se ejecutan pruebas desde el asistente de manage.py de django-nose.

Finalmente, opté por usar tdaemon , que es compatible con django, aunque podría requerir un poco de manipulación también para proyectos completos.

Por ejemplo, aquí es cómo lo ejecuté para mi proyecto Django:

 tdaemon -t django --custom-args=a_specific_app_to_test -d --ignore-dirs logs 

El --custom-args fue para enfocar las pruebas a una aplicación específica (igual que lo haría con python manage.py test a_specific_app_to_test

El argumento -d es habilitar el registro de depuración, que imprime qué cambio de archivo desencadenó la ejecución.

El --ignore-dirs fue necesario porque mis pruebas escribieron en los registros (¡lo que en sí es un problema!) Y tdaemon entró en un bucle infinito.

Estoy acostumbrado a watchr, algo así como watchr

Otro desarrollador de Javascript aquí, he encontrado que nodemon ( https://github.com/remy/nodemon ) funciona bastante bien. Por defecto, mira los archivos *.js , pero eso es configurable con el indicador --ext . Para usarlo, haz:

 npm install -g nodemon cd /your/project/dir/ nodemon --ext py --exec "python manage.py test" 

Ahora, cada vez que cambie un archivo *.py , se volverá a ejecutar el comando. Incluso encuentra nuevos archivos.

Hice esto usando gulp. Instalar gulp-shell:

 npm install gulp-shell --save-dev 

Y en el gulpfile.js:

 var shell = require('gulp-shell') gulp.task('run-tests', shell.task([ 'python3 manage.py test'])) gulp.task('watch', function(){ gulp.watch(['./your-project-name/**/*.html', './your-project-name/**/*.py'], ['run-tests']); }); gulp.task('default',['run-tests','watch']); 

¡Y ejecuta las pruebas en cualquier momento que haya cambios guardados en cualquier archivo .py o .html!

Puedes usar Django Supervisor sobre Django. Esto evitará el uso de una herramienta de CI (que puede ser útil en cualquier caso, esto no invalida la otra respuesta, tal vez solo complementaria).

Recomendaría configurar django-nose y sniffer . Es bastante fácil de instalar y funciona muy bien. Algo a lo largo de las líneas de este olor.py fue la única personalización que necesitaba. Entonces puedes ejecutar sniffer -x myapp.tests .

Nariz viene con algunas otras cosas que hacen que las pruebas sean un poco más agradables para trabajar también.

Si usa el código de control de git, otra forma de hacerlo es usar el compromiso previo de git hook.

tal vez error como remote: fatal: Not a git repository: '.' , consulte esta publicación https://stackoverflow.com/a/4100577/7007942

Escribí una tarea de Gulp para ejecutar automáticamente la ./manage.py test cada vez que se cambian o eliminan los archivos de Python especificados. Necesitarás Node para esto.

Primero, instale Gulp:

 yarn add -D gulp@next 

Luego use el siguiente gulpfile.js y haga los ajustes necesarios:

 const { exec } = require('child_process'); const gulp = require('gulp'); const runDjangoTests = (done) => { const task = exec('./manage.py test --keepdb', { shell: '/bin/bash', // Accept SIGTERM signal. Doesn't work with /bin/sh }); task.stdout.pipe(process.stdout); task.stderr.pipe(process.stderr); task.on('exit', () => { done(); }); return task; }; gulp.task('test', runDjangoTests); gulp.task('watch', (done) => { let activeTask; const watcher = gulp.watch('**/*.py', { // Ignore whatever directories you need to ignored: ['.venv/*', 'node_modules'], }); const runTask = (message) => { if (activeTask) { activeTask.kill(); console.log('\n'); } console.log(message); activeTask = runDjangoTests(done); }; watcher.on('change', (path) => { runTask(`File ${path} was changed. Running tests:`); }); watcher.on('unlink', (path) => { runTask(`File ${path} was removed. Running tests:`); }); }); 

Luego simplemente ejecute el node node_modules/gulp/bin/gulp.js watch para ejecutar la tarea 🙂

Necesitarás un servidor de integración continua, algo como Jenkins .