如何在我的项目(Django)发生任何变化时自动运行测试?

use*_*444 42 python testing django unit-testing nose

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

cla*_*cke 32

使用entr:

$ find . -name '*.py' | entr python ./manage.py test
Run Code Online (Sandbox Code Playgroud)

或者,要获得额外的信用,请将其与ack结合使用:

$ ack --python | entr python ./manage.py test
Run Code Online (Sandbox Code Playgroud)

如果您希望它在添加时找到新文件:

$ until ack -f --python | entr -d python ./manage.py test; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是银色搜索器,请将"ack -f --python"更改为"ag -l --python" (4认同)
  • 还可以考虑将 [ripgrep](https://github.com/BurntSushi/ripgrep) 作为 ag/ack 的替代。 (3认同)
  • 没听说过 [The Silver Searcher](http://geoff.greer.fm/ag/),谢谢你的提示! (2认同)
  • 从未听说过`entr`.它比我想要的更有用.谢谢 :) (2认同)
  • @c17r 一年后,我几乎每个工作日都在使用 `ag`(银色搜索器)。 (2认同)
  • @BrianM.Hunt 我大约一年前检查过 rg,但当时与等效的 ag 调用相比,它有奇怪的输出(很多空行),我认为没有理由找出原因,因为 ag 运行良好我。 (2认同)

The*_*Cat 15

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

pip install pytest-xdist
py.test -f # will watch all subfolders for changes, and rerun the tests
Run Code Online (Sandbox Code Playgroud)

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

  • 鼻子不再维护,而且 py.test 无论如何都更好,更像 Python。 (2认同)

Ima*_*adi 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']);
};
Run Code Online (Sandbox Code Playgroud)

它正在做的是基本上观看该目录中具有py扩展名的任何文件,如果他们更改了它,则执行shell命令,在这种情况下是我的python测试(你可能想要改变它,我的测试名称是main_test.py).为了运行这个grunt脚本,您需要安装Node.js,之后您将在全局路径中使用npm.之后,您还需要安装几个节点模块.除grunt-cli之外的所有这些模块都将存储在当前文件夹中,因此请确保您位于项目的根目录或者将gruntfile.js放入的文件夹中.然后运行fallowing命令.

npm install grunt-cli -g
npm install grunt
npm install grunt-contrib-watch
npm install grunt-shell
Run Code Online (Sandbox Code Playgroud)

不要担心尺寸,这些是非常小的模块.现在您已经完成了所有设置,您可以简单地运行grunt它将开始观察您的py文件,当您保存它们时它将运行您的测试.它可能不是运行python测试的最佳方式,但正如我所说,我是一名JavaScript开发人员,我认为Grunt提供了一种非常简单的方法来执行测试,即使是其他语言也是如此,所以我使用它.


tut*_*uju 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
Run Code Online (Sandbox Code Playgroud)

--custom-args是集中测试,以特定的应用程序(同你会怎么做python manage.py test a_specific_app_to_test

-d参数是启用调试日志记录,打印的文件变化触发运行.

--ignore-dirs是必要的,因为我的测试写入日志(这本身就是一个问题!)并tdaemon进入无限循环.


Tom*_*eba 5

我发现这里的另一个Javascript开发人员nodemonhttps://github.com/remy/nodemon)工作得很好。默认情况下,它监视*.js文件,但是可以使用该--ext标志进行配置。要使用它,请执行以下操作:

npm install -g nodemon
cd /your/project/dir/
nodemon --ext py --exec "python manage.py test"
Run Code Online (Sandbox Code Playgroud)

现在,每当*.py文件更改时,它将重新运行您的命令。它甚至可以找到新文件。


Dan*_*man -6

您将需要一个持续集成服务器,例如Jenkins

  • 这个答案对于 TDD 来说太沉重了。OP 询问如何编写快速且简单的测试,这是 Jenkins 运行的核心。您的建议需要很长的周转时间,并且可能需要办理入住手续 (4认同)
  • 我认为这对于仅保存文件来说有点过分了。有没有类似 Rails ‘guard’ gem 的东西?但对于蟒蛇? (2认同)