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
Может кто-нибудь объяснить это?