web-dev-qa-db-ja.com

プロジェクト(Django)に変更があったときにテストを自動的に実行するにはどうすればよいですか?

現時点ではpython manage.py test私のDjangoプロジェクトに大幅な変更を加えた後、時々、プロジェクトのファイルを変更して保存するたびにこれらのテストを自動的に実行することはできますか?それは便利です。バグを早期に検出するために(私はRailsにrspecでこのようなものがあることを知っています)鼻とDjango-noseを使用しています。事前に感謝します。

45
user1011444

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
34
clacke

py.test回答(これは鼻にも有効です):

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

Py.testは鼻を理解するので、これは鼻でも機能します。

16
The Unfun Cat

私は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拡張子を持つそのディレクトリ内のファイルを監視し、それらが変更された場合、シェルコマンドを実行します。この場合、my python testです(変更したい場合がありますが、テスト名は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が提供していると思うので、それを使用します。

10
Iman Mohamadi

試してみたところ nose-watch そしてそれは素晴らしい働きをしました!プラグインをインストールし、--with-watchオプション。

Update::( Django-noseのmanage.pyヘルパーからテストを実行すると、うまく機能しないようです。

最終的に私はDjangoをサポートする tdaemon を使用することを選択しましたが、本格的なプロジェクトには少し手を加える必要があるかもしれません。

たとえば、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が無限ループに入ったために必要でした。

9
tutuDajuju

ここで別のJavascript開発者、nodemonhttps://github.com/remy/nodemon )がかなりうまくいくことがわかりました。デフォルトでは*.jsファイルを監視しますが、これは--extフラグで設定できます。それを使用するには、次のようにします。

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

これで、*.pyファイルが変更されるたびに、コマンドが再実行されます。新しいファイルも検索します。

5
Tom Saleeba

私は Watchr のようなウォッチャーを使用しています

3
armeo

私は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ファイルに保存された変更があるたびにテストを実行します!

2
lights

Django-nose および sniffer を設定することをお勧めします。セットアップは非常に簡単で、うまく機能します。 this scent.py に沿ったものだけが、私が必要とした唯一のカスタマイズでした。次に、sniffer -x myapp.tests

Noseには他にもいくつかの優れた機能があり、テストを操作するのにも少し便利です。

1
Cory

git制御コードを使用する場合、別の方法はgitフックを使用することです pre-commit

多分remote: fatal: Not a git repository: '.'のようなエラー、この投稿をチェックしてください https://stackoverflow.com/a/4100577/7007942

1
Kevin Chan

Djangoの上に Django Supervisor を使用できます。これにより、CIツールの使用が回避されます(これはどの場合でも役立つ可能性があります。これは、他の応答を無効にするものではなく、おそらく補完的なものです)。

1
Ulflander

指定したPythonファイルが変更または削除された場合に./manage.py testを自動的に実行するGulpタスクを作成しました。これにはNodeが必要です。

まず、Gulpをインストールします。

yarn add -D gulp@next

次に、次の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を実行してタスクを実行します:)

0
dspacejs

https://pycrunch.com/

主な機能の1つ-ファイルの変更に対して影響を受けるテストのみを実行します。 PyCharmのプラグインとして利用可能

0
Gleb Sevruk