Непрерывное модульное тестирование с Pydev (Python и Eclipse)
Есть ли способ интегрировать тесты фона в среде Pydev Eclipse?
Мои модульные тесты работают хорошо, но я хотел бы интегрировать их в фоновом режиме на основе изменений исходного файла (например, с носом) и интегрировать результат обратно в Eclipse (я думаю, большой красный X, когда тесты не работают с просмотром консоли и трассировки).
Нет, командная подсказка, несущая нос на стороне, не учитывается.
У меня была эта интеграция Eclipse при разработке данных RoR.
Спасибо,
Tal.
EDIT: Ознакомьтесь с новым Pydev (1.6.4) http://pydev.org/manual_adv_pyunit.html
Ответы
Ответ 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, поэтому я могу предложить что-то глупое/очевидное/неправильное