Можно сказать,
тема слабо касается поставленной задачи
— разработка продукта Zope. С другой
стороны, если все делать правильно, то
при разработке следует
соблюдать правила TDD.
Тесты рулят — юнит, интеграционные ,
функциональные, системные. Надо — значит
надо. Главное начать, дальше само пойдет.
Документации
о том как тестировать и отлаживать
продукты в Zope — много. Но, как обычно,
мало адекватной текущему состоянию
дел.
Помимо прочего,
читал я следующее:
но так и не
смог сделать первый шаг — запустить
прогон тестов на своей
конфигурации (Zope
2.13). Отсюда и ноги растут у этого
текста.
Так как же
запустить тесты моего продукта?
Ну, например
так — вручную (жутко неудобно,
зато работает).
Запускаем
отладочную консоль Zope
call setenv.cmd pushd %INSTANCE_HOME% start cmd.exe /k "bin\zopectl debug" |
в моем случае
setenv.cmd выглядит
так
chcp 1251 > nul set wd=%~dp0 pushd "%wd%" set INSTANCE_HOME=c:\d\Zope\zope213 set PYTHONPATH= set path=c:\d\Python27;c:\d\Python27\Scripts;%path% set proxy=http://proxy.algis.com:3128 set http_proxy=%proxy% set ftp_proxy=%proxy% set all_proxy=%proxy% |
В отладочной
консоли пишем
>>> import runpy >>> x = runpy.run_module('Products.vcufile.vcufileproduct', run_name='__main__', alter_sys=True) |
на
выходе видим отчет doctest,
ибо в файле vcufileproduct.py я
написал запуск доктестов, если файл
запущен как скрипт а не используется
как модуль
__doc__ = """VCUFile product module. The VCUFile Addon works like the Zope File product, but stores the uploaded file externally and can upload giant files because of chunked upload. Doctests for VCU File Zope Product. Create new object >>> x = VCUFileProduct('123', '456') >>> x.id '123' >>> x.title '456' """ __version__ = '3.0.0.alpha' ... if __name__ == "__main__": import doctest doctest.testmod(verbose=True) |
Уже что-то.
Какие еще есть
возможности?
Еще есть мое
любимое средство тестирования/отладки
— журналирование. Обычно, если я понимаю,
что происходит в процессе, то я легко
отлавливаю свои (да и чужие) ошибки.
Понимание это практически невозможно
без вывода в журнал всех мало-мальски
существенных операций в коде.
Итак, как
написано (в
%INSTANCE_HOME%\eggs\zlog-2.11.1-py2.7.egg\zLOG\__init__.py)
This module exists
only for backward compatibility. Any new code
for Zope 2.8 and newer should use the logging module from Python's
standard library directly.
for Zope 2.8 and newer should use the logging module from Python's
standard library directly.
старый,
но упоминаемый в доках zLOG.LOG
использовать не надо. А
надо использовать модуль logging.
Что означает,
к примеру, следующие телодвижения для
достижения :) В своем модуле добавляем
import logging logger = logging.getLogger('VCUFile') ... def __init__(self, id, filename): logger.debug('VCUFileProduct.__init__') ... |
Поскольку
уровень я задал «дебаг», то в конфиге
(%INSTANCE_HOME%\etc\zope.conf) надо поправить настройку
журнала, чтобы стало как то так
<eventlog> level debug <logfile> path $INSTANCE/log/event.log level info </logfile> </eventlog> |
отладочные
сообщения будут вываливаться на консоль,
в файл пойдут только сообщения уровня
«инфо».
В итоге, в
консоли я увидел
2012-04-24 21:54:38 DEBUG VCUFile VCUFileProduct.__init__
при создании нового объекта. От этой
печки и пляшем дальше.
К сожалению,
сегодня времени не хватило на выяснение
рабочего способа запуска юнит-тестов
автоматом. По инструкции оно должно
срабатывать при запуске
zopectl
test …
а на деле так
не выходит.
Потом как
нибудь продолжим.
Комментариев нет:
Отправить комментарий