Our project depends on pytest-django which has a dependency on pytest (>=2.9). After pytest was upgraded to the latest version 3.4.0, all of our tests failed on CircleCI.
If I revert back to pytest==3.3.2, the tests will pass again.
Is there something new breaking the build?
https://docs.pytest.org/en/latest/changelog.html#changelog
Here is the full stack trace:
Test session starts (platform: linux, Python 3.5.4, pytest 3.4.0, pytest-sugar 0.9.0)
Django settings: config.settings.test (from ini file)
rootdir: /home/circleci/XXX, inifile: pytest.ini
plugins: sugar-0.9.0, django-3.1.2, cov-2.5.1, celery-4.1.0
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/_pytest/main.py", line 100, in wrap_session
INTERNALERROR> session.exitstatus = doit(config, session) or 0
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/_pytest/main.py", line 138, in _main
INTERNALERROR> config.hook.pytest_runtestloop(session=session)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 617, in __call__
INTERNALERROR> return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 222, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 216, in
INTERNALERROR> firstresult=hook.spec_opts.get('firstresult'),
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 196, in _multicall
INTERNALERROR> gen.send(outcome)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 76, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 180, in _multicall
INTERNALERROR> res = hook_impl.function(args)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/_pytest/main.py", line 161, in pytest_runtestloop
INTERNALERROR> item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 617, in __call__
INTERNALERROR> return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 222, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 216, in
INTERNALERROR> firstresult=hook.spec_opts.get('firstresult'),
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 201, in _multicall
INTERNALERROR> return outcome.get_result()
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 76, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 180, in _multicall
INTERNALERROR> res = hook_impl.function(
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/_pytest/runner.py", line 64, in pytest_runtest_protocol
INTERNALERROR> nodeid=item.nodeid, location=item.location,
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 617, in __call__
INTERNALERROR> return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 222, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/__init__.py", line 216, in
INTERNALERROR> firstresult=hook.spec_opts.get('firstresult'),
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 201, in _multicall
INTERNALERROR> return outcome.get_result()
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 76, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/pluggy/callers.py", line 180, in _multicall
INTERNALERROR> res = hook_impl.function(*args)
INTERNALERROR> File "/home/circleci/XXX/venv/lib/python3.5/site-packages/_pytest/terminal.py", line 315, in pytest_runtest_logfinish
INTERNALERROR> last_item = len(self._progress_nodeids_reported) == self._session.testscollected
INTERNALERROR> AttributeError: 'NoneType' object has no attribute 'testscollected'
Results (21.32s):
1 passed
Exited with code 3
Thanks for the report, this is an incompatibility between pytest and pytest-sugar, Frozenball/pytest-sugar#133 is open with a fix.
Until a new pytest-sugar is released one solution is to pin pytest to 3.3.2.
I'm closing this for now but feel free to post further questions. :+1:
Good news, everyone! pytest-sugar>=0.9.1 fixes this..
It seems that 3.10 reopened this bug somehow.
unfortunately `"3.10" < "3.4" holds true -
As a string yes but not as a version number hopefully. Hence the bug ok...
@Natim the compare is done to a string
I got this too today.
PR: https://github.com/mozilla/buildhub2/pull/369
It fails on the pytest 3.9.3 to 3.10.0 upgrade.
The error should be public but in case it disappears I'll paste it here:
tests/test_api_views.py ✓ 4% ▌ INTERNALERROR> Traceback (most recent call last):
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/_pytest/main.py", line 185, in wrap_session
INTERNALERROR> session.exitstatus = doit(config, session) or 0
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/_pytest/main.py", line 225, in _main
INTERNALERROR> config.hook.pytest_runtestloop(session=session)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/hooks.py", line 284, in __call__
INTERNALERROR> return self._hookexec(self, self.get_hookimpls(), kwargs)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/manager.py", line 67, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/manager.py", line 61, in <lambda>
INTERNALERROR> firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 208, in _multicall
INTERNALERROR> return outcome.get_result()
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 80, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR> res = hook_impl.function(*args)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/_pytest/main.py", line 246, in pytest_runtestloop
INTERNALERROR> item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/hooks.py", line 284, in __call__
INTERNALERROR> return self._hookexec(self, self.get_hookimpls(), kwargs)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/manager.py", line 67, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/manager.py", line 61, in <lambda>
INTERNALERROR> firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 208, in _multicall
INTERNALERROR> return outcome.get_result()
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 80, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR> res = hook_impl.function(*args)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/_pytest/runner.py", line 78, in pytest_runtest_protocol
INTERNALERROR> item.ihook.pytest_runtest_logfinish(nodeid=item.nodeid, location=item.location)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/hooks.py", line 284, in __call__
INTERNALERROR> return self._hookexec(self, self.get_hookimpls(), kwargs)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/manager.py", line 67, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/manager.py", line 61, in <lambda>
INTERNALERROR> firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 208, in _multicall
INTERNALERROR> return outcome.get_result()
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 80, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR> res = hook_impl.function(*args)
INTERNALERROR> File "/usr/local/lib/python3.6/site-packages/_pytest/terminal.py", line 432, in pytest_runtest_logfinish
INTERNALERROR> len(self._progress_nodeids_reported) == self._session.testscollected
INTERNALERROR> AttributeError: 'NoneType' object has no attribute 'testscollected'
I was able to reproduce this outside of CircleCI and the "solution" was simply; remove pytest-sugar. I don't really need it anyway. It's just sugar.
downgrade pytest from 3.10 to 3.9.3 will work around this problem.
I've got this failure today with pytest 5.4.1 and pytest-sugar 0.9.3
@Natim can you please post the full traceback and the list of installed packages? Thanks!
Thanks @nicoddemus
Here are the installed packages:
pytest==5.4.1
pytest-cache==1.0
pytest-cov==2.8.1
pytest-mock==3.1.0
pytest-random-order==1.0.4
pytest-sugar==0.9.3
pytest-watch==4.2.0
And here is the traceback:
rootdir: /usr/src/app, inifile: pytest.ini, testpaths: tests
plugins: sugar-0.9.3, requests-mock-1.8.0, mock-3.1.0, random-order-1.0.4, cov-2.8.1
collecting ... run-last-failure: None
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/main.py", line 191, in wrap_session
INTERNALERROR> session.exitstatus = doit(config, session) or 0
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/main.py", line 246, in _main
INTERNALERROR> config.hook.pytest_collection(session=session)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/hooks.py", line 286, in __call__
INTERNALERROR> return self._hookexec(self, self.get_hookimpls(), kwargs)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/manager.py", line 93, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/manager.py", line 84, in <lambda>
INTERNALERROR> self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 208, in _multicall
INTERNALERROR> return outcome.get_result()
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 80, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR> res = hook_impl.function(*args)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/main.py", line 257, in pytest_collection
INTERNALERROR> return session.perform_collect()
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/main.py", line 454, in perform_collect
INTERNALERROR> hook.pytest_collection_modifyitems(
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/hooks.py", line 286, in __call__
INTERNALERROR> return self._hookexec(self, self.get_hookimpls(), kwargs)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/manager.py", line 93, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/manager.py", line 84, in <lambda>
INTERNALERROR> self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 208, in _multicall
INTERNALERROR> return outcome.get_result()
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 80, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR> res = hook_impl.function(*args)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/cacheprovider.py", line 295, in pytest_collection_modifyitems
INTERNALERROR> config.hook.pytest_deselected(items=previously_passed)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/hooks.py", line 286, in __call__
INTERNALERROR> return self._hookexec(self, self.get_hookimpls(), kwargs)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/manager.py", line 93, in _hookexec
INTERNALERROR> return self._inner_hookexec(hook, methods, kwargs)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/manager.py", line 84, in <lambda>
INTERNALERROR> self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 208, in _multicall
INTERNALERROR> return outcome.get_result()
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 80, in get_result
INTERNALERROR> raise ex[1].with_traceback(ex[2])
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/pluggy/callers.py", line 187, in _multicall
INTERNALERROR> res = hook_impl.function(*args)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/terminal.py", line 431, in pytest_deselected
INTERNALERROR> self._add_stats("deselected", items)
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/terminal.py", line 402, in _add_stats
INTERNALERROR> self._set_main_color()
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/terminal.py", line 1090, in _set_main_color
INTERNALERROR> self._main_color = self._determine_main_color(bool(unknown_types))
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/terminal.py", line 1077, in _determine_main_color
INTERNALERROR> elif "passed" in stats or not self._is_last_item:
INTERNALERROR> File "/usr/local/lib/python3.8/site-packages/_pytest/terminal.py", line 496, in _is_last_item
INTERNALERROR> return len(self._progress_nodeids_reported) == self._session.testscollected
INTERNALERROR> AttributeError: 'NoneType' object has no attribute 'testscollected'
I think the culprit is still pytest-sugar though. Refs https://github.com/Teemu/pytest-sugar/issues/194
Indeed, thanks for confirming it! 👍
Most helpful comment
I've got this failure today with pytest 5.4.1 and pytest-sugar 0.9.3