В настоящий момент я запускаю python manage.py test
каждый раз через некоторое время после внесения существенных изменений в проект django. Можно ли автоматически запускать эти тесты при каждом изменении и сохранении файла в моем проекте? Будет полезно обнаружить ошибки раньше (я знаю, что у рельсов есть что-то вроде этого с rspec). Я использую нос и джанго-нос. Спасибо заранее.
Как автоматически запускать тесты при любых изменениях в моем проекте (Django)?
Ответ 1
Используйте entr:
$ find . -name '*.py' | entr python ./manage.py test
Или, для дополнительного кредита, объедините его с ack:
$ ack --python | entr python ./manage.py test
Если вы хотите, чтобы даже найти новые файлы по мере их добавления:
$ until ack -f --python | entr -d python ./manage.py test; do sleep 1; done
Ответ 2
Я разработчик JavaScript, поэтому я использовал инструменты, которые разработчик JS создал с помощью Node.js для достижения той же цели в моих проектах. Это очень просто, но вам также нужно установить nodeJS, чтобы он работал.
Я создал файл gruntfile.js в корневом каталоге проекта:
//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']);
};
В основном это наблюдение за любым файлом в этом каталоге с расширением py, и если они его изменят, он выполняет команду оболочки, которая в этом случае является моим тестом на python (вы можете изменить его, мое тестовое имя было main_test.py). Чтобы запустить этот grunt script, вам нужно установить Node.js, после чего у вас будет npm в вашем глобальном пути. после этого вам нужно также скрыть несколько модулей node. Все эти модули, кроме grunt-cli, будут сохранены в вашей текущей папке, поэтому убедитесь, что вы находитесь в корне вашего проекта или какой-либо папке, в которую вы помещаете этот файл gruntfile.js. Затем выполните команды.
npm install grunt-cli -g
npm install grunt
npm install grunt-contrib-watch
npm install grunt-shell
Не беспокойтесь о размере, это очень маленькие модули. Теперь, когда у вас есть все настройки, вы можете просто запустить grunt
, и он начнет просмотр ваших файлов py, и когда вы их сохраните, он запустит ваши тесты. Возможно, это не лучший способ запуска тестов на python, но, как я уже сказал, я разработчик JavaScript, и я думаю, что Grunt предоставил очень простой способ выполнения тестов даже для других языков, поэтому я использую его.
Ответ 3
Я просто попробовал nose-watch
, и это сработало фантастично! установите плагин и запустите тест с помощью опции --with-watch
.
Обновить::( он не работает хорошо при запуске тестов из django-nose manage.py helper.
В конце концов я решил использовать tdaemon, который поддерживает django, хотя для полноценных проектов может потребоваться немного возиться.
Например, вот как я запустил его для моего проекта django:
tdaemon -t django --custom-args=a_specific_app_to_test -d --ignore-dirs logs
--custom-args
состоял в том, чтобы сфокусировать тесты на конкретное приложение (так же, как вы делали бы python manage.py test a_specific_app_to_test
Аргумент -d
- включить ведение журнала отладки, которое печатает, какое изменение файла вызвало запуск.
--ignore-dirs
было необходимо, потому что мои тесты записывались в журналы (что само по себе является проблемой!) и tdaemon
перешло в бесконечный цикл.
Ответ 4
Ответ py.test (который также работает для носа):
pip install pytest-xdist
py.test -f # will watch all subfolders for changes, and rerun the tests
Поскольку py.test понимает нос, это тоже работает для носа.
Ответ 5
Другой Javascript dev здесь, я нашел nodemon
(https://github.com/remy/nodemon), чтобы работать очень хорошо. По умолчанию он смотрит файлы *.js
, но настраивается с помощью флага --ext
. Чтобы использовать его, выполните:
npm install -g nodemon
cd /your/project/dir/
nodemon --ext py --exec "python manage.py test"
Теперь, когда файл *.py
изменяется, он перезапустит вашу команду. Он даже находит новые файлы.
Ответ 6
Я использую watchr, что-то вроде Watchr
Ответ 7
Я сделал это с помощью gulp. Установите gulp -shell:
npm install gulp-shell --save-dev
И в 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']);
И он запускает тесты в любое время, когда есть изменения, сохраненные в любых .py или .html файлах!
Ответ 8
Вы можете использовать Django Supervisor поверх Django. Это позволит избежать использования инструмента CI (который может быть полезен в любом случае, это не делает недействительным другой ответ - возможно, просто дополняет).
Ответ 9
Я бы рекомендовал настроить django-nose и sniffer. Это очень легко настроить и отлично работает. Что-то вроде this scent.py было единственной настройкой, в которой я нуждался. Затем вы можете просто запустить sniffer -x myapp.tests
.
Нос поставляется с некоторыми другими лакомствами, которые делают тесты более приятными для работы.
Ответ 10
Я написал задачу Gulp для автоматического запуска ./manage.py test
всякий раз, когда любые указанные файлы Python изменяются или удаляются. Для этого вам понадобится узел.
Сначала установите Gulp:
yarn add -D [email protected]
Затем используйте следующие gulpfile.js
и внесите необходимые корректировки:
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:');
});
});
Затем просто запустите node node_modules/gulp/bin/gulp.js watch
чтобы запустить задачу :)
Ответ 11
если вы используете git-код управления, другой способ - использовать git-hook pre-commit
возможно, ошибка, такая как remote: fatal: Not a git repository: '.'
, отметьте это сообщение fooobar.com/questions/22926/...
Ответ 12
Вам понадобится сервер непрерывной интеграции, например Jenkins.