Подтвердить что ты не робот

Как автоматически запускать тесты при любых изменениях в моем проекте (Django)?

В настоящий момент я запускаю python manage.py test каждый раз через некоторое время после внесения существенных изменений в проект django. Можно ли автоматически запускать эти тесты при каждом изменении и сохранении файла в моем проекте? Будет полезно обнаружить ошибки раньше (я знаю, что у рельсов есть что-то вроде этого с rspec). Я использую нос и джанго-нос. Спасибо заранее.

4b9b3361

Ответ 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.