有没有类似'自动测试'的Python单元测试?

时间:2008-09-20 18:07:41

标签: python testing

基本上,当测试中断或通过时,咆哮通知(或其他回调)。 有这样的事吗?

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

  1. 运行python-autotest myfile1.py myfile2.py etc.py
    • 检查是否已修改要监控的文件(可能只是保存了它们)。
    • 在这些文件中运行任何测试。
    • 如果测试失败,但在之前的测试中通过,则生成一个咆哮警报。与失败然后通过的测试相同。
    • 等待,然后重复步骤2-5。
  2. 我可以看到的问题是测试是否在不同的文件中。简单的解决方案是在每次保存后运行所有测试..但是测试速度较慢,这可能需要比保存之间的时间更长,和/或可能使用大量CPU功率等。

    最好的方法是实际看到代码的哪些部分已经改变,如果函数abc()发生了变化,只运行与之交互的测试..虽然这很好,但我认为它会是实施起来非常复杂?

    总结:

    • 有没有类似Ruby工具autotestZenTest package的一部分),但对于Python代码?
    • 如何检查脚本的两个修订版之间哪些功能已更改?
    • 是否可以确定命令将调用哪些函数? (有点像反向追溯)

11 个答案:

答案 0 :(得分:27)

我发现autonose非常不可靠,但sniffer似乎效果很好。

$ pip install sniffer
$ cd myproject

然后运行:

而不是运行“nosetests”
$ sniffer

或者代替nosetests --verbose --with-doctest,您运行:

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

正如readme中所述,最好安装一个特定于平台的文件系统监视库,pyinotifypywin32MacFSEvents(所有可安装的)通过pip等)

答案 1 :(得分:16)

autonose创建的

gfxmonk

  

Autonose是一个类似于自动测试的工具,使用优秀的nosetest库。

     

autotest跟踪文件系统更改,并在添加,删除或更新文件时自动重新运行任何已更改的测试或依赖项。如果文件已被自我修改,或者文件import已更改,则文件计为已更改。

     

...

     

Autonose目前有一个OSX和GTK的原生GUI。如果这些都不可用,您可以改为运行控制台版本(使用--console选项)。

答案 2 :(得分:3)

我刚发现:http://www.metareal.org/p/modipyd/

我目前正在使用thumb.py,但是当我的当前项目从一个小项目转变为一个中型项目时,我一直在寻找可以做更彻底的依赖性分析的东西,并进行一些调整,我很快就开始运行了。

答案 3 :(得分:3)

Guard是一款出色的工具,可以监控文件更改并自动触发任务。它是用Ruby编写的,但它可以作为一个独立的工具用于任何这样的任务。有一个guard-nosetests插件可以通过nose运行Python测试。

Guard支持跨平台通知(Linux,OSX,Windows),包括Growl,以及许多其他强大功能。我的一个无法使用的开发工具。

答案 4 :(得分:3)

可以让您的生活更轻松的一个非常有用的工具是entr。用C语言编写,并在引擎盖下使用kqueueinotify

如果项目中的任何*.py文件发生更改,则以下命令会运行您的测试套件。

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

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

答案 5 :(得分:2)

也许buildbot会很有用http://buildbot.net/trac

答案 6 :(得分: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,则可以获得调用者/被调用者关系。有关详细信息,请参阅docs of the trace module

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

答案 7 :(得分:2)

Django的开发服务器有一个文件更改监视器,可以监视修改并自动重新加载。您可以重复使用此代码来启动文件修改的单元测试。

答案 8 :(得分:2)

答案 9 :(得分:1)

查看pytddmon。以下是如何使用它的视频演示: http://pytddmon.org/?page_id=33

答案 10 :(得分:0)

通过观看.py文件并执行TraceEnabled= true,可以将nodemon用于任务。该命令将为:manage.py test

nodemon --ext py --exec "python manage.py test"是一个npm软件包,但是我认为您已经安装了节点。