Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2012-04-25

Zope Product testing/debugging

Можно сказать, тема слабо касается поставленной задачи — разработка продукта 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.
старый, но упоминаемый в доках 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 …
а на деле так не выходит.

Потом как нибудь продолжим.

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)