Python的单元测试中是否有类似于“自动测试”的东西?

44

基本上,可以在测试失败或通过时发出Growl通知(或其他回调)。有类似的东西吗?

如果没有,编写它应该很容易.. 最简单的方法是...

  1. 运行python-autotest myfile1.py myfile2.py etc.py
    • 检查要监视的文件是否已被修改(可能只是保存了)。
    • 运行这些文件中的任何测试。
    • 如果一个测试失败了,但在上一次运行中它通过了,则生成Growl警报。相同的情况也适用于先失败后通过的测试。
    • 等待并重复步骤2-5。

我能看到的问题是如果测试在不同的文件中。简单的解决方案是每次保存后运行所有测试.. 但对于较慢的测试而言,这可能需要比两次保存之间的时间更长,并且/或者可能会使用大量CPU资源等。

最好的方法是实际查看哪些代码段发生了变化,如果函数abc()已经更改,则仅运行与此交互的测试.. 尽管这将是很好的,但我认为它非常复杂,难以实现?

总结:

  • 是否有像Ruby工具autotestZenTest包的一部分)这样的东西,但适用于Python代码?
  • 如何检查两个脚本版本之间更改了哪些函数?
  • 是否可能确定命令将调用哪些函数?(有点像反向traceback)

我认为如果您仅运行直接引用修改函数的测试,就无法对其进行适当的测试。您将不会测试函数与代码的其他部分如何交互。例如,它可能通过测试,但在实践中失败,因为其行为以微妙的方式发生了变化。 - freespace
11个回答

29

我发现autonose非常不可靠,但是sniffer似乎运作得非常好。

$ pip install sniffer
$ cd myproject

那么你不需要运行 "nosetests",而是运行:

$ sniffer

或者你可以运行以下命令代替 nosetests --verbose --with-doctest:

$ sniffer -x--verbose -x--with-doctest

根据自述文件,安装平台特定的文件系统监视库,例如pyinotifypywin32MacFSEvents(可以通过pip等工具安装),这是一个不错的主意。


是的,sniffer 是正确的选择。 - hiwaylon

16

Autonose是由gfxmonk创建的,它是一个用于Python的类似自动测试的工具,使用了优秀的noseTest库。

Autotest跟踪文件系统变化,并在添加、删除或更新文件时自动重新运行任何已更改的测试或依赖项。如果一个文件被修改或者它所引用的任何文件发生变化,那么这个文件将被视为已更改。

...

目前,Autonose具有适用于OSX和GTK的本地GUI界面。如果您无法使用这些界面,可以使用控制台版本(使用--console选项运行)。


在试验了一段时间autonose之后,我也回到了sniffer。它可能没有autonose那么闪亮,但是它的功能和描述一样稳定。即使在虚拟环境中也可以正常使用。 - exhuma
@exhuma 是的,我发现 autonose 有点故障,并且它已经不再积极开发了(在我打字时最后一次提交是1年前)。 - dbr

3
我刚发现了这个网站:http://www.metareal.org/p/modipyd/ 目前我正在使用thumb.py,但随着我的项目从小型项目转变为中型项目,我一直在寻找一些能够进行更彻底的依赖分析的工具,经过一些调整,我很快就让modipyd运行起来了。

3

Guard 是一个优秀的工具,可以监视文件更改并自动触发任务。它是用 Ruby 编写的,但可以作为任何此类任务的独立工具使用。有一个 guard-nosetests 插件可通过 nose 运行 Python 测试。

Guard 支持跨平台通知(Linux、OSX、Windows),包括 Growl,以及许多其他出色的功能。这是我必不可少的开发工具之一。


3

一个非常有用的工具,可以让你的生活更加轻松,它就是entr。它是用C语言编写的,在底层使用kqueueinotify

以下命令会在项目中任何*.py文件发生更改时运行测试套件。

ls */**.py | entr python -m unittest discover -s test

适用于BSD、Mac OS和Linux。你可以从Homebrew获取entr


2
您可以使用nodemon完成该任务,通过监视.py文件并执行 manage.py test 。 命令将是:nodemon --ext py --exec" python manage.py test "nodemon是一个npm软件包,但我假设您已经安装了node。

2

可能可行,但是为了我想要的东西,设置起来非常复杂。 Autotest 是通过 "cd path/to/my/scripts && autotest" 启动的,而 buildbot 需要设置构建从机和构建主机(一个相当复杂的配置)。 - dbr

2
Django的开发服务器有一个文件变更监视器,可以监视修改并自动重新加载。你可以重复使用这段代码,在文件修改时启动单元测试。

2

nose-watch 是一个很棒的插件。你可以通过 nosetests --with-watch 命令自动运行你的测试。非常好用。 - toast38coza
@toast38coza nose-watch 在 Windows(tm) 上无法工作。 - Peter Wood

2

针对您的第三个问题,也许您需要使用trace模块:

>>> def y(a): return a*a
>>> def x(a): return y(a)
>>> import trace
>>> tracer = trace.Trace(countfuncs = 1)
>>> tracer.runfunc(x, 2)
4
>>> res = tracer.results()
>>> res.calledfuncs
{('<stdin>', '<stdin>', 'y'): 1, ('<stdin>', '<stdin>', 'x'): 1}

res.calledfuncs 包含被调用的函数。如果在创建跟踪器时指定了 countcallers = 1,则可以获得调用者/被调用者关系。有关更多信息,请参阅trace模块文档

您也可以尝试通过静态分析获取调用,但由于Python的动态性质,这可能会很危险。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接