221

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?

14 Answers 14

239

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

EDIT2: For more precise control, the Python documentation about Describing Warning Filters states that the general way to write such warning filters is:

action:message:category:module:line

Use with file rather than in command line:

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

[pytest]
filterwarnings =
    ignore::DeprecationWarning
Sign up to request clarification or add additional context in comments.

5 Comments

To filter on the module you use a regex. Example to ignore deprecation warnings from all sqlalchemy modules:ignore::DeprecationWarning:sqlalchemy.*:
@colini that failed for me as an argument to the -W flag, but it worked for me in my pytest.ini file.
In pytest 6.1 the trailing regex isn't working for me, but you can insert a regex in the middle to match against the beginning of the warning message. ignore:.*U.*mode is deprecated:DeprecationWarning ignores all warnings of type DeprecationWarning where the start of the message matches the regular expression ".*U.*mode is deprecated". more info
@WhiteHotLoveTiger same with ignore::DeprecationWarning:tensorflow[.*] - only works for the configuration files, filed a bug report: github.com/pytest-dev/pytest/issues/8751
@MattSanders I also noticed that I cannot get module regex matching to work. Did you check if it is only a pytest issue? In my case it turned out to be even more fundamental: Even with a plain PYTHONWARNINGS="..." python -c "...", module matching doesn't seem to work as the documentation describes it. Post as a follow-up question.
188

From pytest --help:

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

2 Comments

As the help text says, this will only omit the textual summary. The result will still be yellow and show that there are warnings.
Better to put in the pytest.ini file, as shown below.
142

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.

2 Comments

addopts = -p no:warnings is REALLY BAD idea, and CloC solution is much saner, but I had to use yours when ignore::InsecureRequestWarning was not recognized, so you get +1 too
Disabling all warnings persistently (i.e. using pytest.ini) is almost never a good idea. Disabling just Deprecation warning (and by module) as CloC describes is the right way to do this.
27

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.

Comments

17

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

[pytest]
filterwarnings =
    ignore::DeprecationWarning

Comments

12

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

For more information on the general way to write warning filters, see the python official doc at "The Warnings Filter" and "Describing Warning Filters". In short, Individual warnings filters are specified as a sequence of fields separated by colons: action:message:category:module:line

1 Comment

filterwarnings = ["ignore::DeprecationWarning"] to ignore all deprecated warnings for this situation
5

I want to add that it is also possible to filter the warnings in a fine-granular way by understanding the parsing mechanism which is well explained in the warnings section of the python documentation.

Individual warnings filters are specified as a sequence of fields separated by colons: action:message:category:module:line

This allows you to e.g. disable a specific warning with a specific message for a specific module only. For me, it was using pytest-freezegun, but not showing the annoying DeprecationWarning for using distutils Version classes.

Without applying the described filter from below the relevant output part from pytest runner is:

.venv/lib/python3.11/site-packages/pytest_freezegun.py:17: 34 warnings
tests/test_folder1/test_1.py: 10 warnings
tests/test_folder1/test_2.py: 4 warnings
  /my/project/path/.venv/lib/python3.11/site-packages/pytest_freezegun.py:17: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    if LooseVersion(pytest.__version__) < LooseVersion('3.6.0'):

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html

And with this setting in pyproject.toml, the DeprecationWarning for not using packaging.version is completely gone, but only for pytest-freezegun (because I do not want to deactivate all deprecation warnings for the whole project):

[tool.pytest.ini_options]
testpaths = ["./tests"]
filterwarnings = ["ignore:.*distutils Version classes.*packaging.version:DeprecationWarning:pytest_freezegun"]

In detail:

ignore:.*distutils Version classes.*packaging.version:DeprecationWarning:pytest_freezegun
^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
action       message (regular expression)                  category           module                                                  

Note: I do not want to include the line number, because library code could be changed without fixing the DeprecationWarning.

(The possibility of filtering has also been mentioned in a comment, but I wanted to elaborate a little more.)

2 Comments

Nice. However, if you wanted to correct the freezegun warning, how would you do it?
@loco.loop This warning is coming from the freezegun package. So you can fix it there or write an issue at github. I have not looked into it. Maybe it is already fixed or there is already an issue for it. From inside your project, you should never touch library code (there might be rare exceptional cases, but this is generally a really bad idea).
2

If you'd like to ignore all the warnings from the pytest file itself. Just add the following in your pytest file:

import warnings; warnings.filterwarnings("ignore")

Comments

1

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.

Comments

1
${PYTHON} -m pytest -W ignore::DeprecationWarning

DeprecationWarning Will help remove the imports decrecations warning coming up when we run pytest .

This can be used in makefile.py to ignore the warnings

1 Comment

Your answer could be improved by adding more information on what the code does and how it helps the OP.
0

when working with multiple warnings,

python -m pytest -W ignore::DeprecationWarning -W ignore::ImportWarning

Comments

0

When you want to suppress multiples warning:

[pytest] // or [tool:pytest]
filterwarnings =
    ignore::DeprecationWarning
    ignore::PendingDeprecationWarning
    ignore::UserWarning
    ignore::RuntimeWarning

Comments

0

If you used pyproject.toml file

You may prefer list those filters in pyproject.toml file :

[tool.pytest.ini_options]
filterwarnings = [
    "ignore::DeprecationWarning"
]

Comments

0

I tried several (TOML) variants of the above answers, but the one that finally worked for me was:

[tool.pytest.ini_options]
...
filterwarnings = ["ignore:currentThread:DeprecationWarning",]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.