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

StackOverflow https://stackoverflow.com/questions/1015581

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Спасибо,

Tal.

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

Это было полезно?

Решение

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

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

Picture with new action

Другие советы

В Pydev действительно есть некоторая интеграция с модульным тестированием, но это только для запуска configuration...so...

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

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

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

Смотрите это для получения некоторых отправных точек:

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

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

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

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

Я улучшил скрипт "nosy", чтобы автоматически создавать документацию и запускать тесты непрерывно.Ничего выдающегося, но выполняет свою работу.Публикую это здесь, потому что оригинальная ссылка пропала.В отличие от оригинального скрипта 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)

Надеюсь, это поможет.

=)

Я использую Любопытный (доступно на pypi):

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top