Непрерывное модульное тестирование с помощью Pydev (Python и Eclipse)
-
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, с дополнительной возможностью перезапуска только ошибок - хотя при этом будет запущен полный набор тестов, если ошибок обнаружено не было, поскольку идея заключается в том, что вы работаете со своими ошибками, и когда все пройдено, выполняется окончательный запуск для всего набора (затем вы можете перейти к другой задаче).
Текущая ночная сборка включает эту функцию.
Другие советы
В Pydev действительно есть некоторая интеграция с модульным тестированием, но это только для запуска configuration...so...
Это не очень элегантный способ, но если вы:
- Включить проект-> Создавать автоматически
- В свойствах вашего проекта добавьте новый конструктор типа Program
- Настройте его для запуска ваших тестов и выберите "во время автоматической сборки".
Тогда, по крайней мере, вы получите что-то, что выводит результаты тестирования на консоль при сохранении ресурсов.
Я только что понял, что 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 всякий раз, когда изменяется исходный файл .