目前,python manage.py test
在我对 django 项目进行重大更改后,我每隔一段时间就会运行一次。每当我在项目中更改和保存文件时,是否可以自动运行这些测试?更早地检测错误会很有用(我知道 rails 在 rspec 中有类似的东西)。我正在使用鼻子和 django-nose。提前致谢。
15 回答
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 扩展名的任何文件,如果他们更改了它,则执行一个 shell 命令,在这种情况下是我的 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 提供了一种非常简单的方式来执行测试,即使是其他语言,所以我使用它。
我刚试过nose-watch
,效果很好!安装插件并使用该--with-watch
选项运行测试。
更新: :( 从 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,类似于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之上使用Django Supervisor 。这将避免使用 CI 工具(这在任何情况下都可能有用,这不会使其他响应无效 - 可能只是补充)。
如果你使用 git 控制代码,另一种方法是使用 git hook pre-commit
可能是错误remote: fatal: Not a git repository: '.'
,请查看此帖子https://stackoverflow.com/a/4100577/7007942
我发现最简单的方法是按照这篇文章的推荐使用 gulp 。请注意gulp-shell
(由其他答案推荐)实际上已被 gulp 列入黑名单,但幸运的是您甚至不需要插件。试试这个:
// gulpfile.js
const { watch } = require('gulp')
var exec = require('child_process').exec
function test (cb) {
exec('python manage.py test', function (err, stdout, stderr) {
console.log(stdout)
console.log(stderr)
cb(err)
})
}
exports.default = function () {
watch('./**/*.py', test)
}
过去,我尝试过其他答案中建议的许多选项。这个比较无痛。如果您对 JavaScript 有所了解,这将很有帮助。
我建议设置django-nose和sniffer。它很容易设置并且效果很好。类似于这个scent.py的东西是我唯一需要的定制。然后你就可以运行了sniffer -x myapp.tests
。
Nose 附带了一些其他的好东西,它们也使测试更易于使用。
./manage.py test
我编写了一个 Gulp 任务,以便在更改或删除任何指定的 Python 文件时自动运行。为此,您将需要 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
即可运行任务:)
关键功能之一 - 仅对文件更改运行受影响的测试。可作为 PyCharm 的插件使用
On ubuntu this script works, after installing inotifywait
(sudo apt install inotify-tools
):
inotifywait -qrm -e close_write * |
while read -r filename event; do
python manage.py test accord
done
你需要一个持续集成服务器,比如Jenkins。