使用Pydev(Python和Eclipse)进行持续单元测试

43 投票
6 回答
12962 浏览
提问于 2025-04-15 12:21

有没有办法把后台单元测试和Pydev Eclipse环境结合起来?

我的单元测试运行得很好,但我想让它们在后台自动运行,特别是当源文件发生变化时(比如用nose工具),然后把结果反馈到Eclipse里(我想要的是测试失败时出现一个大红叉,还有控制台和追踪日志的视图)。

不,旁边开一个命令提示符运行nose是不算的。

我在开发RoR项目时有过这样的Eclipse集成。

谢谢,

Tal。

编辑:可以看看新的Pydev (1.6.4) http://pydev.org/manual_adv_pyunit.html

6 个回答

5

我刚发现PyDev有很强大的脚本支持功能。不过我没时间为你们做所有的事情(但如果你完成了这个,请在这里分享 :)

如果你在一个空文件夹里创建一个名为pyedit_nose.py的文件,内容如下:

assert cmd is not None
assert editor is not None

if cmd == 'onSave':
    from java.lang import Runtime
    from java.io import BufferedReader
    from java.io import InputStreamReader

    from org.eclipse.core.resources import ResourcesPlugin
    from org.eclipse.core.resources import IMarker
    from org.eclipse.core.resources import IResource

    proc = Runtime.getRuntime().exec('ls -al')
    extra_message = BufferedReader(InputStreamReader(proc.inputStream)).readLine()

    r = ResourcesPlugin.getWorkspace().getRoot()
    for marker in r.findMarkers(IMarker.PROBLEM, False, IResource.DEPTH_INFINITE):
        if marker.getAttribute(IMarker.MESSAGE).startsWith("Some test failed!"):
            marker.delete()

    for rr in r.getProjects():
        marker = rr.createMarker(IMarker.PROBLEM)
        marker.setAttribute(IMarker.MESSAGE, "Some test failed! " + extra_message)
        marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH)
        marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR)

然后在设置中找到Preferences->PyDev->Scripting Pydev,把它指向这个文件夹,每次保存文件时,你的工作区里的所有项目都会标记为错误。

通过执行一个脚本,返回一些容易解析的测试结果格式,而不是用ls命令并解析输出,你应该能把标记放在正确的位置。

以下是一些起步的参考资料:

  • 在Pydev中使用Jython脚本
  • IMarker是用来表示标记的东西。
  • IResource是你把标记附加到的对象。可以是工作区、项目、文件、目录等。resource.createMarker(IMarker.PROBLEM)会创建一个问题标记。
  • IProject是一种IResource,表示一个项目。可以用members()方法来获取内容。
9

Pydev确实有一些单元测试的集成功能,但这只是作为一种运行配置...所以...

这并不是一个很优雅的方法,但如果你:

  1. 启用项目 -> 自动构建
  2. 在你的项目属性中,添加一个新的构建器,类型选择程序
  3. 配置它来运行你的测试,并选择“在自动构建期间”

那么至少你会得到一些东西,它会在你保存资源时把测试结果输出到控制台。

36

这个功能已经在PyDev 2.0.1版本中添加了。它的作用是,当你修改一个Python文件时,可以选择重新运行上一次测试的结果。此外,还有一个选项可以只重新运行出错的部分——不过如果没有发现错误,它会运行所有的测试,因为这个设计的初衷是帮助你逐步解决错误,当所有测试都通过后,你就可以进行一次完整的测试,然后再去做其他事情。

目前的夜间构建版本已经包含了这个功能。

新操作的图片

撰写回答