简体   繁体   中英

PytestUnknownMarkWarning: Unknown pytest.mark.xxx - is this a typo?

I have a file called test.py with the following code:

import pytest

@pytest.mark.webtest
def test_http_request():
    pass

class TestClass:
    def test_method(self):
        pass

pytest -s test.py passed but gave the following warnings:

pytest -s test.py
=============================== test session starts ============================
platform linux -- Python 3.7.3, pytest-5.2.4, py-1.8.0, pluggy-0.13.1
rootdir: /home/user
collected 2 items

test.py ..

=============================== warnings summary ===============================
anaconda3/lib/python3.7/site-packages/_pytest/mark/structures.py:325
  ~/anaconda3/lib/python3.7/site-packages/_pytest/mark/structures.py:325:
    PytestUnknownMarkWarning: Unknown pytest.mark.webtest - is this a typo?  You can register
    custom marks to avoid this warning - for details, see https://docs.pytest.org/en/latest/mark.html
    PytestUnknownMarkWarning,

-- Docs: https://docs.pytest.org/en/latest/warnings.html
=============================== 2 passed, 1 warnings in 0.03s ===================

Environment: Python 3.7.3, pytest 5.2.4, anaconda3

What is the best way to get rid of the warning message?

To properly handle this you need to register the custom marker . Create a pytest.ini file and place the following inside of it.

[pytest]
markers =
    webtest: mark a test as a webtest.

Next time you run the tests, the warning about the unregistered marker will not be there.

without updating pytest.ini, we can ignore warning using --disable-warnings

We can also use --disable-pytest-warnings

Example using your case: pytest -s test.py -m webtest --disable-warnings

@gold_cy's answer works. If you have too many custom markers need to register in pytest.ini, an alternative way is to use the following configuration in pytest.ini:

[pytest]
filterwarnings =
    ignore::UserWarning

or in general, use the following:

[pytest]
filterwarnings =
    error
    ignore::UserWarning

the configuration above will ignore all user warnings, but will transform all other warnings into errors. See more at Warnings Capture

test.py (updated with two custom markers)

import pytest

@pytest.mark.webtest
def test_http_request():
    print("webtest::test_http_request() called")

class TestClass:
    @pytest.mark.test1
    def test_method(self):
        print("test1::test_method() called")

Use the following commands to run desired tests:

pytest -s test.py -m webtest
pytest -s test.py -m test1

The best way to get rid of the message is to register the custom marker as per @gold_cy's answer.

However if you just wish to suppress the warning as per Jonathon's answer, rather than ignoring UserWarning (which will suppress all instances of the warning regardless of their source) you can specify the particular warning you want to suppress like so (in pytest.ini ):

ignore::_pytest.warning_types.PytestUnknownMarkWarning

Note: For third party libraries/modules the full path to the warning is required to avoid an _OptionError exception

If you don't have pytest.ini and don't wanna create one just for this then you can also register it programmatically in conftest.py as described here :

def pytest_configure(config):
    # register an additional marker
    config.addinivalue_line(
        "markers", "env(name): mark test to run only on named environment"
    )

To add to the existing answers - custom markers can also be registered in pyproject.toml :

# pyproject.toml

[tool.pytest.ini_options]
markers = [
    "webtest: mark a test as a webtest.",
]

Related docs .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM