43

有没有办法将后台单元测试与 Pydev Eclipse 环境集成?

我的单元测试运行良好,但我想将它们集成到基于源文件更改(例如用鼻子)在后台运行并将结果集成回 Eclipse(当测试失败时,我想用大红色 X 控制台和跟踪日志视图)。

不,旁边的命令提示符流鼻涕不算数。

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

谢谢,

塔尔。

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

4

6 回答 6

36

此功能已添加到 PyDev 2.0.1 中,可以选择在 python 文件更改时重新启动上次测试运行中的测试,以及仅重新运行错误的附加选项——尽管如果没有,它将运行完整的测试套件发现了错误,因为我们的想法是您解决错误,并且当所有错误都通过时,整个套件的最终启动完成(然后您可以继续执行另一项任务)。

当前的夜间版本包含此功能。

有新动作的图片

于 2011-04-13T14:09:41.377 回答
9

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

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

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

然后至少你会得到一些东西,在资源保存时将测试结果输出到控制台。

于 2009-06-24T16:44:23.797 回答
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()方法获取内容。
于 2009-06-24T19:16:37.127 回答
1

我第一次手动运行测试(Run > Run As > Python unit test)。在那之后,我 Ctrl+Shift+F9习惯于保存文件并执行测试,而不是保存Ctrl+S并期待一些魔法发生。

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

免责声明:我是 Eclipse 和 PyDev 的新手,所以我可能会提出一些愚蠢/明显/错误的建议

于 2011-02-21T22:04:19.357 回答
0

我使用Nosy(可在 pypi 上获得):

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

于 2010-04-08T02:51:10.047 回答
0

我增强了“爱管闲事”脚本以自动构建文档并连续运行测试。没有什么出色的,但可以完成工作。在这里发布它是因为原始链接已关闭。与原始的 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)

希望这可以帮助。

=)

于 2010-12-02T18:29:34.530 回答