pytest AttributeError:“函数”对象没有属性“ get_marker”

时间:2019-01-18 12:46:56

标签: python pytest

我的conftest.py中有以下代码:

def pytest_collection_modifyitems(config, items):
    items.sort(key=lambda x: 2 if x.get_marker('slow') else 1)

最近它开始引起以下异常:

$ venv/bin/py.test  -vv --tb=short tests
============================================================================ test session starts ============================================================================
platform darwin -- Python 3.5.6, pytest-4.1.1, py-1.7.0, pluggy-0.8.1 -- /Users/.../venv/bin/python3.5
cachedir: .pytest_cache
rootdir: /Users/..., inifile:
collecting ... INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/Users/.../venv/lib/python3.5/site-packages/_pytest/main.py", line 203, in wrap_session
...
INTERNALERROR>   File "/Users/.../venv/lib/python3.5/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR>     res = hook_impl.function(*args)
INTERNALERROR>   File "/Users/.../tests/conftest.py", line 14, in pytest_collection_modifyitems
INTERNALERROR>     items.sort(key=lambda x: 2 if x.get_marker('slow') else 1)
INTERNALERROR>   File "/Users/.../tests/conftest.py", line 14, in <lambda>
INTERNALERROR>     items.sort(key=lambda x: 2 if x.get_marker('slow') else 1)
INTERNALERROR> AttributeError: 'Function' object has no attribute 'get_marker'

======================================================================= no tests ran in 0.30 seconds ================================================

3 个答案:

答案 0 :(得分:5)

Pytest在版本4中更改了其API。

快速解决方案:使用get_closest_marker()代替get_marker()

def pytest_collection_modifyitems(config, items):
    items.sort(key=lambda x: 2 if x.get_closest_marker('slow') else 1)

请参见https://github.com/pytest-dev/pytest/pull/4564

  

删除Node.get_marker(name)的返回值不能用于存在检查。

     

使用Node.get_closest_marker(name)作为替代。

     

删除testfunction.markername属性-使用Node.iter_markers(name=None)进行迭代。

答案 1 :(得分:0)

最新文档建议使用 item.iter_markers

https://docs.pytest.org/en/latest/example/markers.html#reading-markers-which-were-set-from-multiple-places

# content of conftest.py
import sys


def pytest_runtest_setup(item):
    for mark in item.iter_markers(name="glob"):
        print("glob args={} kwargs={}".format(mark.args, mark.kwargs))
        sys.stdout.flush()

答案 2 :(得分:-1)

使用pytest version 4.6.3在一个非常简单的测试中得到了这个错误。搜索时,我遇到了这个link,在下面找到了建议并予以实施。

pip install pytest==3.10.1

它立即起作用。 我认为这应该是@Messa回答中提到的更改的结果。