Есть ли что-то вроде "autotest" для утилит Python?
В основном, озвучивание уведомлений (или других обратных вызовов), когда тесты ломаются или проходят. Есть ли что-нибудь подобное?
Если нет, это должно быть довольно легко написать. Самый простой способ - это сделать.
- запустить
python-autotest myfile1.py myfile2.py etc.py
- Проверьте, были ли изменены файлы, подлежащие мониторингу (возможно, только если они были сохранены).
- Запустите любые тесты в этих файлах.
- Если тест завершился неудачно, но в предыдущем прогоне он прошел, сгенерируйте предупреждение рычания. То же самое происходит с тестами, которые не выполняются.
- Подождите и повторите шаги 2-5.
Проблема, которую я вижу, заключается в том, что тесты находятся в другом файле. Простым решением было бы запустить все тесты после каждого сохранения... но с более медленными тестами это может занять больше времени, чем время между сохранением и/или может использовать много мощности процессора и т.д.
Лучший способ сделать это - это увидеть, какие биты кода были изменены, если функция abc() изменилась, запустить только те тесты, которые взаимодействуют с этим. Хотя это было бы здорово, я думаю, что это будет чрезвычайно сложно реализовать?
Подводя итог:
- Есть ли что-то вроде инструмента Ruby
autotest
(часть пакет ZenTest), но для кода Python?
- Как вы можете проверить, какие функции изменились между двумя версиями script?
- Можно ли определить, какие функции вызовет команда? (Несколько напоминает обратную трассировку).
Ответы
Ответ 1
Я нашел autonose довольно ненадежным, но sniffer, похоже, работает очень хорошо.
$ pip install sniffer
$ cd myproject
Затем вместо запуска "nosetests" вы запускаете:
$ sniffer
Или вместо nosetests --verbose --with-doctest
запускается:
$ sniffer -x--verbose -x--with-doctest
Как описано в readme, рекомендуется установить одну из библиотек для просмотра файловой системы, специфичных для платформы, pyinotify
, pywin32
или MacFSEvents
(все можно установить через pip
и т.д.)
Ответ 2
autonose, созданный gfxmonk:
Autonose - это инструмент, подобный автотесту для python, используя отличную библиотеку nosetest.
autotest отслеживает изменения файловой системы и автоматически перезапускает любые измененные тесты или зависимости, когда файл добавляется, удаляется или обновляется. Файл считается измененным, если он был изменен или был изменен любой файл import
.
...
В настоящее время Autonose имеет собственный GUI для OSX и GTK. Если ни один из них не доступен для вас, вы можете вместо этого запустить консольную версию (с опцией --console).
Ответ 3
Я только что нашел это: http://www.metareal.org/p/modipyd/
В настоящее время я использую thumb.py, но по мере того, как мой текущий проект переходит от небольшого проекта к среднему, я искал что-то, что может сделать более тщательный анализ зависимостей и с несколькими настройками, Я быстро и быстро доработал modipyd.
Ответ 4
Возможно, buildbot был бы полезен http://buildbot.net/trac
Ответ 5
Для вашего третьего вопроса, возможно, модуль trace
- это то, что вам нужно:
>>> def y(a): return a*a
>>> def x(a): return y(a)
>>> import trace
>>> tracer = trace.Trace(countfuncs = 1)
>>> tracer.runfunc(x, 2)
4
>>> res = tracer.results()
>>> res.calledfuncs
{('<stdin>', '<stdin>', 'y'): 1, ('<stdin>', '<stdin>', 'x'): 1}
res.calledfuncs
содержит функции, которые были вызваны. Если вы укажете countcallers = 1
при создании трассировщика, вы можете получить отношения вызывающего/вызываемого. Дополнительную информацию см. В docs модуля trace
.
Вы также можете попытаться получить вызовы с помощью статического анализа, но это может быть опасно из-за динамического характера Python.
Ответ 6
На сервере разработки Django есть монитор изменений файлов, который следит за изменениями и автоматически перезагружает себя. Вы можете повторно использовать этот код для запуска модульных тестов при модификации файлов.
Ответ 7
Возможно, нос http://somethingaboutorange.com/mrl/projects/nose/ имеет плагин http://somethingaboutorange.com/mrl/projects/nose/doc/writing_plugins.html
Найдено: http://jeffwinkler.net/2006/04/27/keeping-your-nose-green/
Ответ 8
Guard - отличный инструмент, который автоматически отслеживает изменения файлов и запускает задачи. Он написан на Ruby, но может использоваться как автономный инструмент для любой задачи, подобной этой. Там guard-nosetests плагин для запуска тестов Python через nose.
Guard поддерживает кросс-платформенные уведомления (Linux, OSX, Windows), включая Growl, а также множество других замечательных функций. Один из моих инструментов can't-live-without dev.
Ответ 9
Проверьте pytddmon. Вот видео-демонстрация того, как его использовать:
http://pytddmon.org/?page_id=33
Ответ 10
Один очень полезный инструмент, облегчающий вашу жизнь, - entr. Написанный на C и использует kqueue или inotify под капотом.
Следующая команда запускает ваш тестовый пакет, если какой-либо файл *.py
в вашем проекте изменен.
ls */**.py | entr python -m unittest discover -s test
Работает для BSD, Mac OS и Linux. Вы можете получить entr из Homebrew.