pytest-2.4.0: новые функции/крючки для фиксации и исправления ошибок¶
Только что выпущенный pytest-2.4.0 содержит множество улучшений и исправлений ошибок, оставаясь совместимым с плагинами и тестовыми пакетами, за исключением нескольких предположительно очень незначительных несовместимостей. Полный список деталей смотрите ниже. Несколько основных особенностей:
новые фикстуры в стиле yield pytest.yield_fixture, позволяющие использовать существующие контекстные менеджеры в стиле with в функциях фикстур.
улучшена поддержка pdb:
import pdb ; pdb.set_trace()
теперь работает без необходимости предварительного отключения перехвата stdout/stderr. Также опция--pdb
теперь работает при сборе и внутренних ошибках, и мы ввели новый экспериментальный хук для IDE/плагинов для перехвата отладки:pytest_exception_interact(node, call, report)
.более короткий вариант monkeypatch, позволяющий указывать путь импорта в качестве цели, например:
monkeypatch.setattr("requests.get", myfunc)
улучшена совместимость с unittest/nose: все методы teardown теперь вызываются только в том случае, если соответствующий метод setup завершился успешно.
интегрировать завершение табуляции для опций командной строки, если у вас настроено argcomplete.
разрешать булево выражение непосредственно с skipif/xfail, если также указана «причина».
новый хук
pytest_load_initial_conftests
позволяет плагинам типа pytest-django влиять на окружение перед импортом файлов conftestdjango
.отчет: окрашивание последней строки в красный или зеленый цвет в зависимости от того, произошли ли сбои/ошибки или все прошло.
Документация была обновлена в соответствии с изменениями, см.
Чтобы установить или обновить pytest:
pip install -U pytest # or
easy_install -U pytest
Большое спасибо всем, кто помогал, включая Флориса Бруйнооге, Брианну Лаугер, Андреаса Пельме, Энтона ван дер Нойта, Анатолия Бубенкова, Владимира Келешева, Матье Агопяна, Ронни Пфанншмидта, Кристиана Теунерта и многих других..
да пребудут с вами испытания,
хольгер крикет
Изменения между 2.3.5 и 2.4¶
известные несовместимости:
при вызове –genscript из python2.7 или выше, вы получите только автономный скрипт, который работает на python2.7 или выше. Используйте Python2.6, чтобы также получить версию, совместимую с python2.5.
все методы разрушения в стиле xunit (nose-style, pytest-style, unittest-style) не будут вызываться, если соответствующий метод установки не сработал, см. проблему322 ниже.
хук pytest_plugin_unregister никогда не вызывался должным образом, и его реализация неизвестна - поэтому он был удален.
pytest.fixture-декорированные функции больше не могут быть генераторами (т.е. использовать yield). Это изменение может быть отменено в версии 2.4.1, если оно вызовет непредвиденные проблемы в реальной жизни. Тем не менее, вы всегда можете написать и вернуть внутреннюю функцию/генератор и изменить потребитель приспособлений для итерации над возвращаемым генератором. Это изменение было сделано вместо нового декоратора
pytest.yield_fixture
, см. ниже.
новые возможности:
экспериментально ввести новый декоратор
pytest.yield_fixture
, который принимает те же параметры, что и pytest.fixture, но требует от функций фиксации оператораyield
вместоreturn statement
. Это позволяет напрямую интегрировать контекстные менеджеры «with-style» в фикстурные функции и в целом избежать регистрации обратных вызовов финализации в пользу обработки «after-yield» как кода разрыва. Спасибо Andreas Pelme, Vladimir Keleshev, Floris Bruynooghe, Ronny Pfannschmidt и многим другим за обсуждение.разрешить использовать булевы выражения непосредственно с skipif/xfail, если также указана «причина». Переработайте документацию по пропуску, чтобы рекомендовать «условия как булевы», поскольку это предотвращает неожиданности при импорте маркеров между модулями. Указание условий в виде строк будет по-прежнему полностью поддерживаться.
отчетность: окрашивание последней строки в красный или зеленый цвет в зависимости от того, произошли ли сбои/ошибки или все прошло. спасибо Christian Theunert.
заставить «import pdb ; pdb.set_trace()» работать нативно в отношении захвата (больше не нужно «-s»), делая
pytest.set_trace()
простым ярлыком.исправление issue181: –pdb теперь работает и на ошибки сбора (и на внутренние ошибки) . Это было реализовано путем небольшого внутреннего рефакторинга и введения нового хука
pytest_exception_interact
(см. следующий пункт).исправить issue341: ввести новый экспериментальный хук для IDE/терминалов для перехвата отладки:
pytest_exception_interact(node, call, report)
.новый вариант monkeypatch.setattr() для обеспечения более короткого вызова для исправления классов/функций из модулей:
monkeypatch.setattr(«requests.get», myfunc)
заменит функцию «get» модуля «requests» на
myfunc
.исправление проблемы322: tearDownClass не запускается, если setUpClass не удался. Спасибо Mathieu Agopian за первоначальное исправление. Также сделайте все финализаторы pytest/nose имитирующими одно и то же общее поведение: если setupX существует и не сработал, не запускайте teardownX. Это вводит новый метод-помощник «node.addfinalizer()», который может быть вызван только на этапе установки узла.
упростить подпись pytest.mark.parametrize(): разрешить передавать строку, разделенную CSV, для указания argnames. Например:
pytest.mark.parametrize("input,expected", [(1,2), (2,3)])
работает так же, как и предыдущий:pytest.mark.parametrize(("input", "expected"), ...)
.добавить поддержку определения setUpModule/tearDownModule, спасибо Брайану Оккену.
интегрировать завершение вкладок для опций через использование «argcomplete». Спасибо Антону ван дер Нойту за PR.
изменить имена опций на длинные опции, разделенные дефисом, но сохранить старое написание для обратной совместимости. py.test -h будет показывать только версию с дефисом, например, «–collect-only», но «–collectonly» также останется действительным (по причинам обратной совместимости). Большое спасибо Энтону ван дер Нойту за реализацию и Хинеку Шлаваку за то, что подтолкнул нас.
исправить проблему 308 - разрешить отмечать/xfail/skip отдельных наборов параметров при параметризации. Спасибо Брианне Лаугер.
вызвать новый экспериментальный хук pytest_load_initial_conftests, чтобы позволить сторонним плагинам делать что-то до загрузки conftest.
Исправление ошибок:
исправление проблемы358 - опции захвата теперь разбираются более корректно с помощью нового метода parser.parse_known_args.
pytest теперь использует argparse вместо optparse (спасибо Anthon), что означает, что «argparse» добавляется как зависимость при установке в окружение python2.6 или ниже.
исправление проблемы 333: исправление случая плохого взаимодействия хуков unittest/pytest.
PR27: правильно обрабатывать nose.SkipTest во время сбора. Спасибо Antonio Cuni, Ronny Pfannschmidt.
исправление проблемы355: junitxml помещает атрибут name=»pytest» в тег testsuite.
исправление проблемы336: фиксатор autouse в плагинах должен снова работать.
исправить issue279: улучшить сравнение объектов при отказе утверждения для стандартных типов данных и распознать collections.abc. Спасибо Brianna Laugher и Mathieu Agopian.
исправление проблемы317: поддержка перезаписи утверждений для метода is_package
исправление issue335: объект document py.code.ExceptionInfo() возвращался из pytest.raises(), спасибо Mathieu Agopian.
удалить неявную поддержку distribute_setup из setup.py.
исправление issue305: игнорировать любые проблемы при записи pyc-файлов.
SO-17664702: вызывать финализаторы приспособления, даже если функция приспособления частично завершилась (финализаторы не всегда вызывались раньше)
исправить issue320 - исправить область видимости класса для фикстур, когда они смешиваются с функциями уровня модуля. Спасибо Анатолию Бубенкову.
вы можете указать «-q» или «-qq» для получения различных уровней «более тихих» отчетов (спасибо Катажине Яхим).
исправление issue300 - Исправление порядка загрузки conftest при запуске py.test в подкаталоге.
исправление проблемы323 - сортировка многих параметризаций arg, скопированных в модуль
заставить хуки завершения сессии выполняться с тем же cwd-контекстом, что и при старте сессии (помогает исправить поведение плагинов, которые пишут выходные файлы с относительным путем, например, pytest-cov).
исправить проблему316 - правильно ссылаться на крючки коллекции в документации
исправление проблемы 306 - очистка опций -k/-m для соответствия только маркерам/именам тестов/ключевым словам соответственно. Спасибо Wouter van Ackooy.
улучшен подсчет доктестов для доктестов в модулях python - файлы без элементов доктестов больше не отображаются, а примеры доктестов считаются как отдельные элементы теста. спасибо Данило Беллини.
исправьте issue245 в зависимости от выпущенной версии py-1.4.14, которая исправляет py.io.dupfile для работы с файлами без режима. Спасибо Джейсону Р. Кумбсу.
исправлена генерация junitxml, когда тестовый вывод содержит управляющие символы, решение проблемы267, спасибо Jaap Broekhuizen
исправить issue338: использовать стиль –tb для ошибок setup/teardown. Спасибо Махо.
исправить issue307 - использовать yaml.safe_load в примере, спасибо Марку Эйчину.
улучшить параметризацию сообщений об ошибках, спасибо Брианна Логер
Хуки pytest_terminal_summary(terminalreporter) теперь могут использовать методы «.section(title)» и «.line(msg)» для вывода дополнительной информации в конце выполнения теста.