Reputation: 26050
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?
Upvotes: 217
Views: 145162
Reputation: 45
${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
Upvotes: 1
Reputation: 178
when working with multiple warnings,
python -m pytest -W ignore::DeprecationWarning -W ignore::ImportWarning
Upvotes: 0
Reputation: 3608
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
Upvotes: 236
Reputation: 89617
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
Upvotes: 12
Reputation: 51
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")
Upvotes: 2
Reputation: 4666
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.)
Upvotes: 5
Reputation: 7452
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.
Upvotes: 1
Reputation: 2400
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.
Upvotes: 27
Reputation: 13479
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.
Upvotes: 140
Reputation: 2208
I don't want to hide all warning, so I put this in pytest.ini
[pytest]
filterwarnings =
ignore::DeprecationWarning
Upvotes: 17
Reputation: 11939
From pytest --help
:
--disable-pytest-warnings
disable warnings summary, overrides -r w flag
Upvotes: 184