How to suppress py.test internal deprecation warnings

PythonPytest

Python Problem Overview


Is there a way to suppress the pytest's internal deprecation warnings?

Context: I'm looking to evaluate the difficulty of porting a test suite from nose to pytest. The suite is fairly large and heavily uses nose-style yield based test generators.

I'd like to first make sure the existing tests pass with pytest, and then maybe change test generators to parameterized.

Just running $ pytest path-to-test-folder with pytest 3.0.4 is completely dominated by pages and pages of

WC1 ~repos/numpy/numpy/lib/tests/test_twodim_base.py yield tests are deprecated, and scheduled to be removed in pytest 4.0

Is there a way of turning these warnings off?

Python Solutions


Solution 1 - Python

From pytest --help:

--disable-pytest-warnings
                      disable warnings summary, overrides -r w flag

Solution 2 - Python

I think you do not want to hide all warnings, but just the ones that are not relevant. And in this case, deprectation warnings from imported python modules.

Having a read on pytest documentation about Warnings Capture:

> Both -W command-line option and filterwarnings ini option are based on Python’s own -W option and warnings.simplefilter, so please refer to those sections in the Python documentation for other examples and advanced usage.

So you can filter warnings with python's -W option!

It seems that pytest completely removes filters, because it shows all those DeprecationWarning when running, and Python's documentation about Default Warning Filters clearly says:

> In regular release builds, the default warning filter has the > following entries (in order of precedence): > > > default::DeprecationWarning:main > ignore::DeprecationWarning > ignore::PendingDeprecationWarning > ignore::ImportWarning > ignore::ResourceWarning

So in your case, if you want let say to filter types of warning you want to ignore, such as those DeprecationWarning, just run the pytest command with -W option :

$ pytest path-to-test-folder -W ignore::DeprecationWarning

EDIT: From colini's comment, it is possible to filter by module. Example to ignore deprecation warnings from all sqlalchemy :

ignore::DeprecationWarning:sqlalchemy.*:

You can then list your installed modules that creates too much noise in the output of pytest

Use with file rather than in command line:

You may prefer list those filters in pytest.ini file :

[pytest]
filterwarnings =
    ignore::DeprecationWarning

Solution 3 - Python

pytest -p no:warnings, or add the following to your pytest.ini or tox.ini:

[pytest]
addopts = -p no:warnings

The result will be green without any indication of warnings. See documentation at https://docs.pytest.org/en/latest/warnings.html#disabling-warnings-summary.

This can be a valid use case for a test suite where you want clean output.

Be aware that always hiding all warnings may cause you to miss important warnings. If you want to hide only specific warnings, look at Cloc's answer.

Solution 4 - Python

In the pytest.ini file you can add:

[pytest]
addopts = -p no:warnings

OR passing below line in the command-line. This might be useful if your test suites handle warnings using an external system.

> -p no:warnings

OR if you only want to hide some specific deprecated warning, add below statement in you pytest.ini file

[pytest]
filterwarnings =
    ignore:.*U.*mode is deprecated:DeprecationWarning

This will ignore all warnings of type DeprecationWarning where the start of the message matches the regular expression ".*U.*mode is deprecated".

OR Although not recommended, you can use the

> --disable-warnings

command-line option to suppress the warning summary entirely from the test run output.

Solution 5 - Python

I don't want to hide all warning, so I put this in pytest.ini

[pytest]
filterwarnings =
    ignore::DeprecationWarning

Solution 6 - Python

Here is a link for how to suppress warnings if you are using pyproject.toml file as configuration.

[tool.pytest.ini_options]
testpaths = ["./tests/unit"]
filterwarnings = ["ignore:::.*third_party_package.module:123", "ignore:::.*another_module*"]

123 in this case is a line number to be suppressed

Solution 7 - Python

If you use a setup.cfg file, put this in:

[tool:pytest]
addopts = -p no:warnings

You need tool:pytest instead of just pytest, but it will tell you:

> Failed: [pytest] section in setup.cfg files is no longer supported, change to [tool:pytest] instead.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionev-brView Question on Stackoverflow
Solution 1 - PythonThe CompilerView Answer on Stackoverflow
Solution 2 - PythonCloCView Answer on Stackoverflow
Solution 3 - PythonBlaiseView Answer on Stackoverflow
Solution 4 - Pythonpk786View Answer on Stackoverflow
Solution 5 - PythonPolvView Answer on Stackoverflow
Solution 6 - PythonVlad BezdenView Answer on Stackoverflow
Solution 7 - PythonRichard de WitView Answer on Stackoverflow