使用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…所以…
这不是一个非常优雅的方式,但是如果你:
- 启用项目 – >自动生成
- 在您的项目属性中,添加一个types为Program的新构build器
- 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发现和执行工具。