【问题标题】:Continuous unit testing with Pydev (Python and Eclipse)使用 Pydev(Python 和 Eclipse)进行连续单元测试
【发布时间】:2010-11-04 04:11:11
【问题描述】:

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

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

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

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

谢谢,

塔尔。

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

【问题讨论】:

    标签: python unit-testing pydev


    【解决方案1】:

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

    当前的夜间构建包含此功能。

    【讨论】:

    • 发布前会修正错字吗? :) ('背景')。另外,我建议改写“在后台重新启动时,仅运行失败的测试”以避免重复但语法正确的“重新启动”。
    • 谢谢,通过谷歌搜索找到了这个。正是我想要的。在 pydev 网站上找不到它
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我刚刚意识到 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 返回测试结果的脚本并解析输出,您应该能够将标记放在正确的位置。

      请参阅此处了解一些起点:

      • Jython Scripting in Pydev
      • IMarker 是一个标记。
      • IResource 是您将标记附加到的位置。可以是工作区、项目、文件、目录等。resource.createMarker(IMarker.PROBLEM) 创建一个问题标记。
      • IProjectIResource 的一种类型,代表一个项目。使用members() 方法获取内容。

      【讨论】:

      • 我知道这被标记为正确答案,但请看一下答案,它说 PyDev 2.0.1 现在使用它的 PyUnit 视图有这个内置函数。请注意,目前它只在夜间发布,但应该很快就会发布——希望这里有测试人员:)
      【解决方案4】:

      我第一次手动运行测试(运行 > 运行方式 > Python 单元测试)。之后,我使用 Ctrl+Shift+F9 保存文件并执行测试,而不是使用 Ctrl+S 保存并期待一些魔法发生。

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

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

      【讨论】:

        【解决方案5】:

        我增强了“爱管闲事”脚本以自动构建文档并运行测试 不断地。没有什么出色的,但可以完成工作。发在这里是因为原文 链接失效了。不像原来的多管闲事脚本,这个递归地扫描目录 并允许查找多种模式。

        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)
        

        希望这会有所帮助。

        =)

        【讨论】:

          【解决方案6】:

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

          只要有源文件就运行鼻子测试发现和执行工具 变了。

          【讨论】:

            猜你喜欢
            • 2011-12-08
            • 2012-08-31
            • 1970-01-01
            • 1970-01-01
            • 2015-07-08
            • 1970-01-01
            • 2013-10-03
            • 1970-01-01
            • 2023-03-17
            相关资源
            最近更新 更多