52

目前,python manage.py test在我对 django 项目进行重大更改后,我每隔一段时间就会运行一次。每当我在项目中更改和保存文件时,是否可以自动运行这些测试?更早地检测错误会很有用(我知道 rails 在 rspec 中有类似的东西)。我正在使用鼻子和 django-nose。提前致谢。

4

15 回答 15

43

使用进入

  1. $brew install entr
  2. $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
于 2016-07-22T08:41:13.797 回答
16

py.test 答案(也适用于鼻子):

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

由于 py.test 理解鼻子,这也适用于鼻子。

于 2016-12-13T09:38:35.670 回答
10

我是一名 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 提供了一种非常简单的方式来执行测试,即使是其他语言,所以我使用它。

于 2015-07-12T05:53:14.267 回答
9

我刚试过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进入了无限循环。

于 2014-03-05T09:05:04.083 回答
8

我发现这里的另一个 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文件更改时,它都会重新运行您的命令。它甚至可以找到新文件。

于 2017-11-24T04:14:26.787 回答
4

我用过watchr,类似于Watchr

于 2013-11-28T04:58:33.597 回答
2

我使用 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 文件的更改时运行测试!

于 2015-10-09T00:49:15.310 回答
1

您可以在 Django之上使用Django Supervisor 。这将避免使用 CI 工具(这在任何情况下都可能有用,这不会使其他响应无效 - 可能只是补充)。

于 2013-03-07T03:12:46.303 回答
1

如果你使用 git 控制代码,另一种方法是使用 git hook pre-commit

可能是错误remote: fatal: Not a git repository: '.',请查看此帖子https://stackoverflow.com/a/4100577/7007942

于 2018-11-29T01:29:19.547 回答
1

我发现最简单的方法是按照这篇文章的推荐使用 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 有所了解,这将很有帮助。

于 2020-10-29T09:12:52.410 回答
1

我建议设置django-nosesniffer。它很容易设置并且效果很好。类似于这个scent.py的东西是我唯一需要的定制。然后你就可以运行了sniffer -x myapp.tests

Nose 附带了一些其他的好东西,它们也使测试更易于使用。

于 2017-04-29T12:52:54.230 回答
0

./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即可运行任务:)

于 2018-07-20T11:36:43.533 回答
0

https://pycrunch.com/

关键功能之一 - 仅对文件更改运行受影响的测试。可作为 PyCharm 的插件使用

于 2019-09-14T10:05:22.243 回答
0

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
于 2021-09-01T01:38:40.040 回答
-5

你需要一个持续集成服务器,比如Jenkins

于 2013-03-01T20:44:17.903 回答