Есть ли что-то вроде «автотеста» для юнит-тестов Python? - PullRequest
43 голосов
/ 20 сентября 2008

В основном, рычание уведомлений (или других обратных вызовов), когда тесты ломаются или проходят. Существует ли что-нибудь подобное?

Если нет, это должно быть довольно легко написать .. Самый простой способ был бы ..

  1. пробег python-autotest myfile1.py myfile2.py etc.py
    • Проверьте, были ли изменены файлы для мониторинга (возможно, только если они были сохранены).
    • Запустите любые тесты в этих файлах.
    • Если тест не пройден, но в предыдущем запуске он пройден, сгенерировать предупреждение о рычании То же самое с тестами, которые не проходят, а затем проходят.
    • Подождите и повторите шаги 2-5.

Я вижу проблему, если тесты находятся в другом файле. Простым решением будет запускать все тесты после каждого сохранения ... но при более медленных тестах это может занять больше времени, чем время между сохранениями, и / или может потребовать много ресурсов процессора и т. Д.

Лучший способ сделать это - увидеть, какие биты кода изменились, если изменилась функция abc (), запускать только тесты, которые взаимодействуют с этим ... Хотя это было бы здорово, я думаю, что это будет чрезвычайно сложно реализовать?

Подведем итог:

  • Есть ли что-то похожее на инструмент Ruby autotest (входит в пакет ZenTest ), но для кода Python?
  • Как проверить, какие функции изменились между двумя ревизиями скрипта?
  • Можно ли определить, какие функции вызовет команда? (Что-то вроде обратного отслеживания)

Ответы [ 11 ]

27 голосов
/ 27 февраля 2012

Я нашел autonose довольно ненадежным, но sniffer , кажется, работает очень хорошо.

$ pip install sniffer
$ cd myproject

Затем вместо запуска "тестов на нос" вы запускаете:

$ sniffer

Или вместо nosetests --verbose --with-doctest вы запускаете:

$ sniffer -x--verbose -x--with-doctest

Как описано в readme , рекомендуется установить одну из библиотек для наблюдения за файловой системой для конкретной платформы, pyinotify, pywin32 или MacFSEvents (все устанавливаются через pip и т.д.) * * тысяча двадцать-один

16 голосов
/ 27 января 2009

autonose созданный gfxmonk :

Autonose - инструмент, похожий на автотест для python, использующий отличную библиотеку для проверки носа.

автотест отслеживает изменения файловой системы и автоматически запускает любые измененные тесты или зависимости при каждом добавлении, удалении или обновлении файла. Файл считается измененным, если он был изменен самостоятельно или если какой-либо файл изменился import s.

...

В настоящее время Autonose имеет собственный графический интерфейс для OSX и GTK. Если ни один из них вам не доступен, вы можете вместо этого запустить консольную версию (с параметром --console).

3 голосов
/ 01 декабря 2016

Один очень полезный инструмент, который может сделать вашу жизнь проще - entr . Написано на C и использует kqueue или inotify под капотом.

Следующая команда запускает ваш набор тестов, если какой-либо файл *.py в вашем проекте был изменен.

ls */**.py | entr python -m unittest discover -s test

Работает для BSD, Mac OS и Linux. Вы можете получить entr от Homebrew.

3 голосов
/ 25 июля 2013

Guard - отличный инструмент, который отслеживает изменения файлов и автоматически запускает задачи. Он написан на Ruby, но может использоваться как самостоятельный инструмент для любой задачи, подобной этой. Есть плагин guard-nosetests для запуска тестов Python через nose .

Guard поддерживает кроссплатформенные уведомления (Linux, OSX, Windows), включая Growl, а также многие другие замечательные функции. Один из моих инструментов, без которых невозможно жить.

3 голосов
/ 16 ноября 2009

Я только что нашел это: http://www.metareal.org/p/modipyd/

В настоящее время я использую thumb.py, но по мере того, как мой текущий проект переходит от небольшого проекта к среднему, я искал что-то, что может сделать немного более тщательный анализ зависимостей и с несколькими изменениями , Я получил Modipyd и работает довольно быстро.

2 голосов
/ 20 сентября 2008
2 голосов
/ 20 сентября 2008

Сервер разработки Django имеет монитор изменений файлов, который отслеживает изменения и автоматически перезагружается. Вы можете повторно использовать этот код для запуска модульных тестов при изменении файла.

2 голосов
/ 20 сентября 2008

Для вашего третьего вопроса, возможно, вам нужен модуль 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, вы можете получить отношения вызывающий / вызываемый. См. документы trace модуля для получения дополнительной информации.

Вы также можете попытаться получить вызовы с помощью статического анализа, но это может быть опасно из-за динамической природы Python.

2 голосов
/ 20 сентября 2008

Может быть, будет полезен buildbot http://buildbot.net/trac

1 голос
/ 29 ноября 2013

Проверьте pytddmon. Вот видео демонстрация того, как его использовать: http://pytddmon.org/?page_id=33

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...