使用Pydev(Python和Eclipse)进行持续单元测试
有没有办法把后台单元测试和Pydev Eclipse环境结合起来?
我的单元测试运行得很好,但我想让它们在后台自动运行,特别是当源文件发生变化时(比如用nose工具),然后把结果反馈到Eclipse里(我想要的是测试失败时出现一个大红叉,还有控制台和追踪日志的视图)。
不,旁边开一个命令提示符运行nose是不算的。
我在开发RoR项目时有过这样的Eclipse集成。
谢谢,
Tal。
编辑:可以看看新的Pydev (1.6.4) http://pydev.org/manual_adv_pyunit.html
6 个回答
我刚发现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()
方法来获取内容。
Pydev确实有一些单元测试的集成功能,但这只是作为一种运行配置...所以...
这并不是一个很优雅的方法,但如果你:
- 启用项目 -> 自动构建
- 在你的项目属性中,添加一个新的构建器,类型选择程序
- 配置它来运行你的测试,并选择“在自动构建期间”
那么至少你会得到一些东西,它会在你保存资源时把测试结果输出到控制台。
这个功能已经在PyDev 2.0.1版本中添加了。它的作用是,当你修改一个Python文件时,可以选择重新运行上一次测试的结果。此外,还有一个选项可以只重新运行出错的部分——不过如果没有发现错误,它会运行所有的测试,因为这个设计的初衷是帮助你逐步解决错误,当所有测试都通过后,你就可以进行一次完整的测试,然后再去做其他事情。
目前的夜间构建版本已经包含了这个功能。