現時点ではpython manage.py test
私のDjangoプロジェクトに大幅な変更を加えた後、時々、プロジェクトのファイルを変更して保存するたびにこれらのテストを自動的に実行することはできますか?それは便利です。バグを早期に検出するために(私はRailsにrspecでこのようなものがあることを知っています)鼻とDjango-noseを使用しています。事前に感謝します。
py.test回答(これは鼻にも有効です):
pip install pytest-xdist
py.test -f # will watch all subfolders for changes, and rerun the tests
Py.testは鼻を理解するので、これは鼻でも機能します。
私は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が提供していると思うので、それを使用します。
試してみたところ 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
が無限ループに入ったために必要でした。
ここで別のJavascript開発者、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
ファイルが変更されるたびに、コマンドが再実行されます。新しいファイルも検索します。
私は Watchr のようなウォッチャーを使用しています
私は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ファイルに保存された変更があるたびにテストを実行します!
Django-nose および sniffer を設定することをお勧めします。セットアップは非常に簡単で、うまく機能します。 this scent.py に沿ったものだけが、私が必要とした唯一のカスタマイズでした。次に、sniffer -x myapp.tests
。
Noseには他にもいくつかの優れた機能があり、テストを操作するのにも少し便利です。
git制御コードを使用する場合、別の方法はgitフックを使用することです pre-commit
多分remote: fatal: Not a git repository: '.'
のようなエラー、この投稿をチェックしてください https://stackoverflow.com/a/4100577/7007942
Djangoの上に Django Supervisor を使用できます。これにより、CIツールの使用が回避されます(これはどの場合でも役立つ可能性があります。これは、他の応答を無効にするものではなく、おそらく補完的なものです)。
指定した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
を実行してタスクを実行します:)
主な機能の1つ-ファイルの変更に対して影響を受けるテストのみを実行します。 PyCharmのプラグインとして利用可能