Есть ли что-то вроде «автотеста» для модульных тестов Python?

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

В противном случае это должно быть довольно легко написать .. Самый простой способ - ..

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

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

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

Чтобы обобщить:

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

Я не думаю, что возможно правильно проверить, запускаете ли вы Только тесты, которые напрямую ссылаются на измененную функцию. Тогда вы не будете проверять, как функция взаимодействует с остальной частью кода. Например, он может пройти тест, но потерпеть неудачу на практике, потому что его поведение изменилось незначительно.

freespace 20.09.2008 22:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
44
1
9 255
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Может быть, buildbot пригодится http://buildbot.net/trac

Это могло бы сработать, но очень сложно настроить то, что я хочу. Автотест запускается командой «cd path / to / my / scripts && autotest», buildbot требует настройки ведомого устройства сборки, настройки мастера сборки (довольно сложная конфигурация)

dbr 21.09.2008 10:31

Что касается вашего третьего вопроса, возможно, вам нужен модуль 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.

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

Может в Nose 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/

носовые часы is a great plugin. You can autorun your tests like so: nosetests --with-watch. Works great
toast38coza 28.05.2015 14:43

@ toast38coza nose-watch не работает в Windows (tm)

Peter Wood 25.09.2015 09:41

автономный, созданный gfxmonk:

Autonose is an autotest-like tool for python, using the excellent nosetest library.

autotest tracks filesystem changes and automatically re-run any changed tests or dependencies whenever a file is added, removed or updated. A file counts as changed if it has iself been modified, or if any file it imports has changed.

...

Autonose currently has a native GUI for OSX and GTK. If neither of those are available to you, you can instead run the console version (with the --console option).

После того, как я некоторое время возился с autonose, я тоже вернулся к sniffer. Он не такой блестящий, как autonose, но работает так, как рекламируется. Даже в virtualenv.

exhuma 03.09.2013 16:03

@exhuma Ага, я обнаружил, что autonose немного глючит, и он больше не активно разрабатывается (последняя фиксация была 1 год назад, когда я это набираю)

dbr 04.09.2013 13:36

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

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

Ответ принят как подходящий

Я обнаружил, что автономный довольно ненадежен, но сниффер, похоже, работает очень хорошо.

$ pip install sniffer
$ cd myproject

Затем вместо проведения «тестов на нос» вы запускаете:

$ sniffer

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

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

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

Да, sniffer - это то, что вам нужно.

hiwaylon 04.06.2012 22:09

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

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

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

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

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

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

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

Вы можете использовать nodemon для этой задачи, просматривая файлы .py и выполняя manage.py test. Команда будет: nodemon --ext py --exec "python manage.py test".

nodemon - это пакет npm, но я предполагаю, что у вас установлен узел.

Другие вопросы по теме