有没有办法将后台单元测试与 Pydev Eclipse 环境集成?
我的单元测试运行良好,但我想将它们集成到基于源文件更改(例如用鼻子)在后台运行并将结果集成回 Eclipse(当测试失败时,我想用大红色 X 控制台和跟踪日志视图)。
不,旁边的命令提示符流鼻涕不算数。
在开发 RoR 的东西时,我已经有了这个 Eclipse 集成。
谢谢,
塔尔。
编辑:查看新的 Pydev (1.6.4) http://pydev.org/manual_adv_pyunit.html
有没有办法将后台单元测试与 Pydev Eclipse 环境集成?
我的单元测试运行良好,但我想将它们集成到基于源文件更改(例如用鼻子)在后台运行并将结果集成回 Eclipse(当测试失败时,我想用大红色 X 控制台和跟踪日志视图)。
不,旁边的命令提示符流鼻涕不算数。
在开发 RoR 的东西时,我已经有了这个 Eclipse 集成。
谢谢,
塔尔。
编辑:查看新的 Pydev (1.6.4) http://pydev.org/manual_adv_pyunit.html
此功能已添加到 PyDev 2.0.1 中,可以选择在 python 文件更改时重新启动上次测试运行中的测试,以及仅重新运行错误的附加选项——尽管如果没有,它将运行完整的测试套件发现了错误,因为我们的想法是您解决错误,并且当所有错误都通过时,整个套件的最终启动完成(然后您可以继续执行另一项任务)。
当前的夜间版本包含此功能。
Pydev 确实有一些单元测试集成,但这只是作为运行配置......所以......
这不是一种非常优雅的方式,但是如果您:
然后至少你会得到一些东西,在资源保存时将测试结果输出到控制台。
我刚刚意识到 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
解析输出,您应该能够将标记放在正确的位置。
有关一些起点,请参见此处:
resource.createMarker(IMarker.PROBLEM)
创建问题标记。IResource
表示项目的类型。使用members()
方法获取内容。我第一次手动运行测试(Run > Run As > Python unit test)。在那之后,我
Ctrl+Shift+F9
习惯于保存文件并执行测试,而不是保存Ctrl+S
并期待一些魔法发生。
Ctrl+Shift+F9
组合键重新启动上次运行的配置。
免责声明:我是 Eclipse 和 PyDev 的新手,所以我可能会提出一些愚蠢/明显/错误的建议
我使用Nosy(可在 pypi 上获得):
每当更改源文件时运行鼻子测试发现和执行工具。
我增强了“爱管闲事”脚本以自动构建文档并连续运行测试。没有什么出色的,但可以完成工作。在这里发布它是因为原始链接已关闭。与原始的 nosy 脚本不同,这个脚本递归地扫描目录并允许查找多种模式。
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)
希望这可以帮助。
=)