I created some unit tests and run them from the same file. For tests in the same file:
if __name__ == "__main__":
import pytest
pytest.main(['--tb=short', __file__])
For tests in another file:
if __name__ == '__main__':
import pytest
pytest.main(['./test_stuff.py', "--capture=sys"])
In either case, when I execute the file the first time, it works fine, but the second and subsequent times it gives a bunch of warnings:
============================== warnings summary ===============================
C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754
C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754: PytestWarning: Module already imported so cannot be rewritten: pytest_remotedata
self._mark_plugins_for_rewrite(hook)
C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754: PytestWarning: Module already imported so cannot be rewritten: pytest_openfiles
self._mark_plugins_for_rewrite(hook)
C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754: PytestWarning: Module already imported so cannot be rewritten: pytest_doctestplus
self._mark_plugins_for_rewrite(hook)
C:\Anaconda3\lib\site-packages\_pytest\config\__init__.py:754: PytestWarning: Module already imported so cannot be rewritten: pytest_arraydiff
self._mark_plugins_for_rewrite(hook)
-- Docs: https://docs.pytest.org/en/latest/warnings.html
==================== 1 passed, 4 warnings in 0.06 seconds
Is there any way to make these warnings go away?
Restarting the kernel works, but IPython's %reset
and %clear
aren't enough to fix it, either.
Use subprocess
instead of pytest.main
:
if __name__ == "__main__":
import subprocess
subprocess.call(['pytest', '--tb=short', str(__file__)])
If the above does not print anything, try the workaround (as suggested in comments):
if __name__ == "__main__":
from subprocess import Popen, PIPE
with Popen(['pytest',
'--tb=short', # shorter traceback format
str(__file__)], stdout=PIPE, bufsize=1,
universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')
If you are only concerned about warnings, you can use --disable-warnings
argument. You can also filter out only the warnings you are getting now with --pythonwarnings=PYTHONWARNINGS
argument in pytest.main . pytest --help
has more info about these arguments.
It seems that you are invoking pytest with ipython or jupyter. python.main imports pytest specific modules at the time of pytest initialization. When you run pytest.main again, it throws the warnings. There are two possible ways to reload pytest to avoid getting this initialization warnings.
You can either use pytest.exit after pytest.main or reload pytest after pytest.main .
Let us know if these approaches work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With