【问题标题】:Is there something like 'autotest' for Python unittests?Python单元测试是否有类似“自动测试”的东西?
【发布时间】:2008-09-20 18:07:40
【问题描述】:

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

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

  1. 运行python-autotest myfile1.py myfile2.py etc.py
    • 检查要监控的文件是否已修改(可能只是已保存)。
    • 在这些文件中运行任何测试。
    • 如果测试失败,但在之前的运行中通过了,则生成咆哮警报。失败然后通过的测试也是如此。
    • 等待,然后重复步骤 2-5。

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

最好的方法是实际查看哪些代码已更改,如果函数 abc() 已更改,则仅运行与此交互的测试。虽然这很好,但我认为它会是实现起来极其复杂?

总结一下:

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

【问题讨论】:

  • 如果您运行直接引用修改后函数的测试,我认为无法正确测试。您将不会测试该函数如何与其余代码交互。例如,它可能通过了测试,但在实践中失败了,因为它的行为发生了微妙的变化

标签: python testing


【解决方案1】:

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

$ pip install sniffer
$ cd myproject

然后运行“nosetests”而不是运行:

$ sniffer

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

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

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

【讨论】:

  • 是的,sniffer 是要走的路。
【解决方案2】:

autonosegfxmonk创建:

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

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

...

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

【讨论】:

  • autonose 摆弄了一段时间后,我也退回到sniffer。它不像autonose 那样闪亮,但它可以像宣传的那样工作。即使在 virtualenv 中。
  • @exhuma 是的,我发现 autonose 有点小故障,并且不再积极开发(上次提交是 1 年前,因为我输入了这个)
【解决方案3】:

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

我目前正在使用 thumb.py,但是随着我当前的项目从小型项目过渡到中型项目,我一直在寻找可以进行更彻底的依赖关系分析并进行一些调整的东西,我很快就启动并运行了 modipyd。

【讨论】:

    【解决方案4】:

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

    Guard 支持跨平台通知(Linux、OSX、Windows),包括 Growl,以及许多其他强大功能。我不能没有开发工具之一。

    【讨论】:

      【解决方案5】:

      entr 是一个非常有用的工具,可以让您的生活更轻松。用 C 编写,并在后台使用 kqueueinotify

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 这可以工作,但设置我想要的东西非常复杂。自动测试由“cd path/to/my/scripts && autotest”启动,buildbot需要设置一个build slave,设置一个build master(一个相当复杂的配置)
        【解决方案7】:

        对于您的第三个问题,您可能需要 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 的动态特性,这可能很危险。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            【讨论】:

            • nose-watch 是一个很棒的插件。您可以像这样自动运行测试:nosetests --with-watch。效果很好
            • @toast38coza nose-watch 在 Windows(tm) 上不起作用
            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              您可以将nodemon 用于任务,通过查看.py 文件并执行manage.py test。命令将是:nodemon --ext py --exec "python manage.py test"

              nodemon 是一个 npm 包,但是我假设你已经安装了节点。

              【讨论】:

                猜你喜欢
                • 2014-03-27
                • 1970-01-01
                • 2018-12-20
                • 1970-01-01
                • 2012-02-20
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-15
                相关资源
                最近更新 更多