使用Pydev进行连续unit testing(Python和Eclipse)

有没有办法将背景unit testing与Pydev Eclipse环境集成?

我的unit testing运行良好,但我想集成它们在后台运行基于源文件的变化(例如鼻子),并将结果集成到Eclipse(我想大红X当testing失败与控制台和跟踪日志视图)。

不,一个侧面的命令提示符不计算在内。

开发RoR的东西时,我已经有了这个Eclipse集成。

谢谢,

塔尔。

编辑:签出新的Pydev(1.6.4) http://pydev.org/manual_adv_pyunit.html

这个特性已经被添加到PyDev 2.0.1中,只要python文件发生变化,就可以重新启动最后一次testing运行的testing,还有一个选项只能重新运行错误 – 尽pipe如果没有的话,它会运行完整的testing套件错误被发现,因为这个想法是你通过你的错误工作,当所有的套件都通过最后的发射完成(然后你可以转移到另一个任务)。

目前的每晚构build包含了这个function。

图片与新的行动

Pydev确实有一些unit testing集成,但这只是一个运行configuration…所以…

这不是一个非常优雅的方式,但是如果你:

  1. 启用项目 – >自动生成
  2. 在您的项目属性中,添加一个types为Program的新构build器
  3. configuration它运行你的testing,并select“在自动生成过程中”

那么至less你会得到一些东西,在节省资源的时候把testing结果输出到控制台。

我刚刚意识到,PyDev有相当强大的脚本支持。 不幸的是我没有时间为你做这一切(但是如果你完成了这个,请把它张贴在这里:)

如果在其他空的文件夹中创build一个名为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->脚本Pydev指向这个目录,每次保存文件时,您将在工作空间中标记出错的所有项目。

通过执行一个脚本来返回testing结果的一些简单的parsing格式,而不是ls和parsing输出,你应该能够把你的标记放在正确的位置。

看到这个起点:

  • Jython脚本在Pydev
  • IMarker是什么代表一个标记。
  • IResource是你附加你的标记。 可以是工作区,项目,文件,目录等resource.createMarker(IMarker.PROBLEM)创build一个问题标记。
  • IProject是一种代表项目的IResource 。 使用members()方法来获取内容。

我增强了“黑暗”的脚本,自动构build文档,并不断运行testing。 没有什么恒星,但完成工作。 张贴在这里,因为原来的链接失败。 与原始的nosy脚本不同,这个脚本recursion扫描目录,并允许查找多个模式。

 import os import os.path import sys import stat import time import subprocess from fnmatch import fnmatch def match_patterns(pathname, patterns): """Returns True if the pathname matches any of the given patterns.""" for pattern in patterns: if fnmatch(pathname, pattern): return True return False def filter_paths(pathnames, patterns=["*"], ignore_patterns=[]): """Filters from a set of paths based on acceptable patterns and ignorable patterns.""" result = [] if patterns is None: patterns = [] if ignore_patterns is None: ignore_patterns = [] for path in pathnames: if match_patterns(path, patterns) and not match_patterns(path, ignore_patterns): result.append(path) return result def absolute_walker(path, recursive): if recursive: walk = os.walk else: def walk(path): return os.walk(path).next() for root, directories, filenames in walk(path): yield root for directory in directories: yield os.path.abspath(os.path.join(root, directory)) for filename in filenames: yield os.path.abspath(os.path.join(root, filename)) def glob_recursive(path, patterns=["*"], ignore_patterns=[]): full_paths = [] for root, directories, filenames in os.walk(path): for filename in filenames: full_path = os.path.abspath(os.path.join(root, filename)) full_paths.append(full_path) filepaths = filter_paths(full_paths, patterns, ignore_patterns) return filepaths def check_sum(path='.', patterns=["*"], ignore_patterns=[]): sum = 0 for f in glob_recursive(path, patterns, ignore_patterns): stats = os.stat(f) sum += stats[stat.ST_SIZE] + stats[stat.ST_MTIME] return sum if __name__ == "__main__": if len(sys.argv) > 1: path = sys.argv[1] else: path = '.' if len(sys.argv) > 2: command = sys.argv[2] else: command = "make -C docs html; bin/python tests/run_tests.py" previous_checksum = 0 while True: calculated_checksum = check_sum(path, patterns=['*.py', '*.rst', '*.rst.inc']) if calculated_checksum != previous_checksum: previous_checksum = calculated_checksum subprocess.Popen(command, shell=True) time.sleep(2) 

希望这可以帮助。

=)

我第一次手动运行testing( Run> Run As> Pythonunit testing )。 之后,我使用Ctrl+Shift+F9来保存文件并执行testing,而不是使用Ctrl+S进行保存,并期待一些魔法发生。

Ctrl+Shift+F9组合键重新启动上次运行configuration。

免责声明 :我是新来的Eclipse和PyDev,所以我可能会暗示一些愚蠢/明显/错误

我使用诺西 (在pypi上可用):

每当源文件更改时运行鼻子testing发现和执行工具。