Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[pytest 3.4.0] 'NoneType' object has no attribute 'testscollected' #3170

Closed
sfdye opened this issue Jan 31, 2018 · 14 comments
Closed

[pytest 3.4.0] 'NoneType' object has no attribute 'testscollected' #3170

sfdye opened this issue Jan 31, 2018 · 14 comments
Labels
plugin: logging related to the logging builtin plugin type: regression indicates a problem that was introduced in a release which was working previously

Comments

@sfdye
Copy link

sfdye commented Jan 31, 2018

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(*args)
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

@pytestbot pytestbot added plugin: logging related to the logging builtin plugin type: regression indicates a problem that was introduced in a release which was working previously labels Jan 31, 2018
@nicoddemus
Copy link
Member

Thanks for the report, this is an incompatibility between pytest and pytest-sugar, Teemu/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. 👍

@ri0t
Copy link

ri0t commented Sep 10, 2018

Good news, everyone! pytest-sugar>=0.9.1 fixes this..

@Natim
Copy link

Natim commented Nov 5, 2018

It seems that 3.10 reopened this bug somehow.

Refs Teemu/pytest-sugar#159

@RonnyPfannschmidt
Copy link
Member

unfortunately `"3.10" < "3.4" holds true -

@Natim
Copy link

Natim commented Nov 5, 2018

As a string yes but not as a version number hopefully. Hence the bug ok...

@RonnyPfannschmidt
Copy link
Member

@Natim the compare is done to a string

@peterbe
Copy link

peterbe commented Nov 5, 2018

I got this too today.
PR: mozilla-releng/buildhub2#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'

@peterbe
Copy link

peterbe commented Nov 5, 2018

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.

@crhan
Copy link

crhan commented Nov 6, 2018

downgrade pytest from 3.10 to 3.9.3 will work around this problem.

@Natim
Copy link

Natim commented May 5, 2020

I've got this failure today with pytest 5.4.1 and pytest-sugar 0.9.3

@nicoddemus
Copy link
Member

@Natim can you please post the full traceback and the list of installed packages? Thanks!

@Natim
Copy link

Natim commented May 6, 2020

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'

@Natim
Copy link

Natim commented May 6, 2020

I think the culprit is still pytest-sugar though. Refs Teemu/pytest-sugar#194

@nicoddemus
Copy link
Member

Indeed, thanks for confirming it! 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
plugin: logging related to the logging builtin plugin type: regression indicates a problem that was introduced in a release which was working previously
Projects
None yet
Development

No branches or pull requests

8 participants