Приспособление pytest не найдено на простом декораторе, только на Python 3 - PullRequest
0 голосов
/ 09 февраля 2020

Pytest не проходит следующий тестовый сценарий с "fixture" fun c 'not found "на Python 3.7. На Python 2.7 тот же код завершается успешно. В обоих случаях используется pytest 4.6.9:

Содержимое pytest_decorator_issue/test_issue.py:

import functools

def my_decorator(func):

    def wrapper_func(*args, **kwargs):
        # do something on entry
        ret = func(*args, **kwargs)
        # do something on exit
        return ret

    return functools.update_wrapper(wrapper_func, my_decorator)

@my_decorator
def test_bla():
    # perform some test
    pass

Вызов pytest для Python 3.7:

$ pytest pytest_decorator_issue -vv
=============== ... test session starts ...
platform darwin -- Python 3.7.5, pytest-4.6.9, py-1.8.0, pluggy-0.13.1 -- .../virtualenvs/pywbem37/bin/python
cachedir: .pytest_cache
rootdir: ...
plugins: requests-mock-1.7.0, cov-2.8.1
collected 1 item                                                                                                                                         

pytest_decorator_issue/test_issue.py::test_bla ERROR                                                                                   [100%]

============ ...  ERRORS ...
____________ ...  ERROR at setup of test_bla ...
file .../pytest_decorator_issue/test_fixture_issue.py, line 3
  def my_decorator(func):
E       fixture 'func' not found
>       available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, cov, doctest_namespace, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, requests_mock, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.

.../pytest_decorator_issue/test_fixture_issue.py:3
============== ...  1 error in 0.01 seconds =================================================================

Очевидно, что Pytest решает искать прибор с именем 'fun c', когда видит аргумент функции декоратора, но почему он этого не делает на Python 2.7, и как я могу иметь такой простой декоратор на Тестовая функция pytest?

Просто для сравнения версий, на Python 2,7, соответствующий вывод pytest:

platform darwin -- Python 2.7.16, pytest-4.6.9, py-1.8.0, pluggy-0.13.1 -- .../virtualenvs/pywbem27/bin/python
cachedir: .pytest_cache
rootdir: ...
plugins: requests-mock-1.7.0, cov-2.8.1
collected 1 item                                        

Обновление:

Я только что обнаружил, что при использовании декоратора functools.wraps вместо functools.update_wrapper() pytest доволен обоими Python 2.7 и 3.7:

def my_decorator(func):

    @functools.wraps(func)
    def wrapper_func(*args, **kwargs):
        # do something on entry
        ret = func(*args, **kwargs)
        # do something on exit
        return ret

    return wrapper_func

Может кто-нибудь объяснить это?

1 Ответ

1 голос
/ 09 февраля 2020

Второй аргумент в вашем вызове update_wrapper должен быть func вместо my_decorator:

def my_decorator(func):

    def wrapper_func(*args, **kwargs):
        # do something on entry
        ret = func(*args, **kwargs)
        # do something on exit
        return ret

    return functools.update_wrapper(wrapper_func, func)

Хотя не уверен, почему это работает при Python 2.

...