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 влиять на окружение перед импортом файлов conftest django.

  • отчет: окрашивание последней строки в красный или зеленый цвет в зависимости от того, произошли ли сбои/ошибки или все прошло.

Документация была обновлена в соответствии с изменениями, см.

Чтобы установить или обновить 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)» для вывода дополнительной информации в конце выполнения теста.

Вернуться на верх