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

20

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

    
задан user1011444 01.03.2013 в 21:42
источник
  • Этот проект поможет, если вы хотите запустить тестовый пакет на изменения кода, а не комментировать. –  Matt 01.03.2013 в 21:47
  • Спасибо за подсказку, похоже, что мне нужно на данный момент. Не могли бы вы случайно узнать, может ли nosy быть добавлен к django-носу (например, как плагин: краткое объяснение django-носа об этом)? –  user1011444 02.03.2013 в 00:17
  • Возможный дубликат. Есть ли что-то вроде «автотеста» для унитатов Python? –  mlt 11.03.2015 в 07:14

10 ответов

16

Используйте 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
    
ответ дан clacke 22.07.2016 в 10:41
источник
  • И если вы используете серебряного искателя, измените «ack -f -python» на «ag -l -python» –  c17r 22.07.2016 в 17:12
  • Не слышал о Серебряном Искателе, спасибо за подсказку! –  clacke 25.07.2016 в 10:54
  • никогда не слышал об этом. это еще более полезно, чем то, что я искал. благодаря :) –  jorgemdnt 29.05.2017 в 15:19
  • @ c17r Спустя год, и я все еще использую ag (серебряный искатель) почти каждый рабочий день. –  clacke 31.05.2017 в 20:20
  • @ BrianM.Hunt Я проверил rg примерно год назад, но в то время у него был странный вывод (много пустых строк) по сравнению с эквивалентным вызовом ag, и я не видел причин, чтобы понять, почему, поскольку ag был хорошо работает для меня. –  clacke 30.10.2017 в 13:42
8

Я разработчик 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, вам нужно установить Node.js, после чего у вас будет npm в вашем глобальном пути. после этого вам нужно также заблокировать несколько модулей узлов. Все эти модули, кроме 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 предоставил очень простой способ выполнения тестов даже для других языков, поэтому я использую его.     

ответ дан Iman Mohamadi 12.07.2015 в 07:53
источник
7

Я просто попробовал nose-watch , и это сработало фантастично! установите плагин и запустите тест с помощью опции --with-watch .

Обновить : :( он не работает хорошо при запуске тестов из помощника manage.py django-носа.

В конце концов я решил использовать 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 перешло в бесконечный цикл.

    
ответ дан tutuDajuju 05.03.2014 в 10:05
источник
5

ответ py.test:

pip install pytest-xdist
py.test -f # will watch all subfolders for changes, and rerun the tests
    
ответ дан The Unfun Cat 13.12.2016 в 10:38
источник
  • Нос ​​больше не поддерживается, а py.test - это просто намного лучше и больше pythonic в любом случае. –  The Unfun Cat 03.05.2017 в 07:43
1

Я сделал это, используя глоток. Установите 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-файлах!     

ответ дан lights 09.10.2015 в 02:49
источник
1

Другой Javascript dev здесь, я нашел nodemon ( Ссылка ), чтобы работать очень хорошо. По умолчанию он просматривает файлы *.js , но это настраивается с помощью флага --ext . Чтобы использовать его, выполните:

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

Теперь, всякий раз, когда изменяется файл *.py , он повторно запускает вашу команду. Он даже находит новые файлы.

    
ответ дан Tom Saleeba 24.11.2017 в 05:14
источник
  • Мне это нравится. Очень чистый. –  Kazanz 27.01.2018 в 14:42
0

Вы можете использовать Django Supervisor поверх Django. Это позволит избежать использования инструмента CI (который может быть полезен в любом случае, это не делает недействительным другой ответ - возможно, просто дополняет).

    
ответ дан Ulflander 07.03.2013 в 04:12
источник
0

Я использую watchr, что-то вроде Watchr     

ответ дан armeo 28.11.2013 в 05:58
источник
0

Я бы рекомендовал настроить django-nose и перехватчик . Его очень легко настроить и отлично работает. Что-то вроде этого scent.py было единственной настройкой, в которой я нуждался. Затем вы можете просто запустить sniffer -x myapp.tests .

Нос поставляется с некоторыми другими лакомствами, которые делают тесты более приятными для работы.

    
ответ дан Cory 29.04.2017 в 14:52
источник
-3

Вам понадобится сервер непрерывной интеграции, например Дженкинс .

    
ответ дан Daniel Roseman 01.03.2013 в 21:44
источник
  • Спасибо за ответ. Я обязательно буду проверять это, когда я использую Selenium. Пока что я просто делаю базовые тесты, используя «поддельный» сервер, поставляемый с Django. –  user1011444 02.03.2013 в 00:14
  • Дженкинс не имеет ничего общего с Селеном. Вы можете легко использовать его с обычными модульными тестами. –  Daniel Roseman 02.03.2013 в 10:08
  • Стоит упомянуть здесь проект django-jenkins. –  Burhan Khalid 28.11.2013 в 06:08
  • Я думаю, что это немного раздуто только для сохранения файла. Есть ли что-то вроде рельсов каракули? но для python? –  peterw 07.01.2014 в 20:19
  • , этот ответ слишком тяжел для TDD. ОП задал вопрос о том, как писать быстрые тесты, которые являются сердцем того, что работает Дженкинс. ваш совет будет иметь длительный оборот и, возможно, потребует регистрации –  Phlip 29.11.2014 в 15:24