Подтвердить что ты не робот

Непрерывное модульное тестирование с Pydev (Python и Eclipse)

Есть ли способ интегрировать тесты фона в среде Pydev Eclipse?

Мои модульные тесты работают хорошо, но я хотел бы интегрировать их в фоновом режиме на основе изменений исходного файла (например, с носом) и интегрировать результат обратно в Eclipse (я думаю, большой красный X, когда тесты не работают с просмотром консоли и трассировки).

Нет, командная подсказка, несущая нос на стороне, не учитывается.

У меня была эта интеграция Eclipse при разработке данных RoR.

Спасибо,

Tal.

EDIT: Ознакомьтесь с новым Pydev (1.6.4) http://pydev.org/manual_adv_pyunit.html

4b9b3361

Ответ 1

Эта функция была добавлена ​​в PyDev 2.0.1 с возможностью перезапуска тестов в последнем тестовом запуске всякий раз, когда изменяется файл python, с дополнительным вариантом для повторного запуска только ошибок - хотя он будет запускать полный тест если ошибки не обнаружены, поскольку идея заключается в том, что вы работаете с вашими ошибками и когда все проходят окончательный запуск для всего пакета (тогда вы можете перейти к другой задаче).

В текущей ночной сборке включена эта функция.

Picture with new action

Ответ 2

Pydev имеет некоторую интегрально-тестовую интеграцию, но только в качестве конфигурации запуска... так...

Это не очень элегантный способ, но если вы:

  • Включить Project- > Build Automatically
  • В свойствах проекта добавьте новый строитель типа Program
  • Настройте его для запуска тестов и выберите "во время автоматической сборки"

Тогда, по крайней мере, вы получите то, что выводит результаты теста на консоль при сохранении ресурса.

Ответ 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, чтобы указать на этот каталог, вы получите все проекты в вашей рабочей области, помеченные с ошибкой каждый раз, когда файл будет сохранен.

Выполняя script, который возвращает результаты теста в некотором простом анализе формата, а не ls и анализирует вывод, вы должны помещать маркеры в нужные места.

Посмотрите на некоторые отправные точки:

  • Jython Scripting в Pydev
  • IMarker - это то, что представляет маркер.
  • IResource - это то, к чему вы прикрепляете свои маркеры. Могут быть рабочие пространства, проекты, файлы, каталоги и т.д. resource.createMarker(IMarker.PROBLEM) создает маркер проблемы.
  • IProject - это тип IResource, который представляет проект. Используйте метод members() для получения содержимого.

Ответ 4

Я использую Nosy (доступно на pypi):

Запустите средство обнаружения и выполнения теста носа, когда исходный файл изменяется.

Ответ 5

Я улучшил "nody" script, чтобы автоматически создавать документацию и запускать тесты непрерывно. Ничего звездного, но выполняет свою работу. Проводя его здесь, потому что оригинал ссылка опустилась. В отличие от оригинальной nosy script, этот сканирует каталог рекурсивно и позволяет искать несколько шаблонов.

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

Я запускаю тест вручную (Run > Run As > Python unit test). После этого я использую Ctrl+Shift+F9, чтобы сохранить файлы и выполнить тесты вместо сохранения с помощью Ctrl+S и ожидать, что произойдет какая-то магия.

Комбинация клавиш Ctrl+Shift+F9 возобновляет конфигурацию последнего запуска.

Отказ от ответственности. Я новичок в Eclipse и PyDev, поэтому я могу предложить что-то глупое/очевидное/неправильное