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

Issue when updating from pytest 5.2.4 to pytest 5.3.0 #6254

Closed
JuleBert opened this issue Nov 21, 2019 · 9 comments · Fixed by #6261
Closed

Issue when updating from pytest 5.2.4 to pytest 5.3.0 #6254

JuleBert opened this issue Nov 21, 2019 · 9 comments · Fixed by #6261

Comments

@JuleBert
Copy link

@JuleBert JuleBert commented Nov 21, 2019

Hi there,

I run pytest with pytest-parallel (v 0.0.9) in a Gitlab CI-Pipeline.
Without changing my code the pipeline jobs stopped working. The only thing that change was the pytest version.

Also the pipeline job doesn't seem to stop. It's stuck in the status running until I cancel it.

The failed command is:
- python setup.py install && pytest --workers 4
where setup.py install is our project specific setup script.

The hopefully relevant output:

============================= test session starts ==============================
platform linux -- Python 3.7.5, pytest-5.3.0, py-1.8.0, pluggy-0.13.0
rootdir: /builds/fsd/odx-ninja
plugins: parallel-0.0.9
collected 70 items
pytest-parallel: 4 workers (processes), 1 test per worker (thread)
....Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/usr/local/lib/python3.7/site-packages/pytest_parallel/__init__.py", line 81, in run
    run_test(self.session, item, None)
  File "/usr/local/lib/python3.7/site-packages/pytest_parallel/__init__.py", line 51, in run_test
    item.ihook.pytest_runtest_protocol(item=item, nextitem=nextitem)
  File "/usr/local/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 92, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 86, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 208, in _multicall
    return outcome.get_result()
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/usr/local/lib/python3.7/site-packages/_pytest/runner.py", line 82, in pytest_runtest_protocol
    item.ihook.pytest_runtest_logfinish(nodeid=item.nodeid, location=item.location)
  File "/usr/local/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 92, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/usr/local/lib/python3.7/site-packages/pluggy/manager.py", line 86, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 208, in _multicall
    return outcome.get_result()
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 80, in get_result
    raise ex[1].with_traceback(ex[2])
  File "/usr/local/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/usr/local/lib/python3.7/site-packages/_pytest/terminal.py", line 468, in pytest_runtest_logfinish
    main_color, _ = _get_main_color(self.stats)
  File "/usr/local/lib/python3.7/site-packages/_pytest/terminal.py", line 1102, in _get_main_color
    for found_type in stats:
  File "<string>", line 2, in __iter__
  File "/usr/local/lib/python3.7/multiprocessing/managers.py", line 825, in _callmethod
    proxytype = self._manager._registry[token.typeid][-1]
AttributeError: 'NoneType' object has no attribute '_registry'

To avoid this we now fixed the pytest version to 5.2.4.

I hope I could help with my first issue ever :-).

Best regards

@nicoddemus

This comment has been minimized.

Copy link
Member

@nicoddemus nicoddemus commented Nov 21, 2019

Hi @JuleBert,

From the traceback it is hard to understand what's happening:

  File "/usr/local/lib/python3.7/site-packages/_pytest/terminal.py", line 1102, in _get_main_color
    for found_type in stats:
  File "<string>", line 2, in __iter__
  File "/usr/local/lib/python3.7/multiprocessing/managers.py", line 825, in _callmethod
    proxytype = self._manager._registry[token.typeid][-1]

On pytest's side we are just looping over a list, then suddenly another thread calls _callmethod. Can you remove --workers 4 from the command-line as a test to see if it presents the same problem?

Also I suggest to cross post to pytest-parallel to see if they have any tips.

@JuleBert

This comment has been minimized.

Copy link
Author

@JuleBert JuleBert commented Nov 21, 2019

Hi @nicoddemus,

When the --workers 4 was removed the CI pipeline didn't fail anymore (but was very slow obviously).

I also created an issue at pytest-parallel:
browsertron/pytest-parallel#46

@nicoddemus

This comment has been minimized.

Copy link
Member

@nicoddemus nicoddemus commented Nov 21, 2019

Thanks @JuleBert

@RonnyPfannschmidt

This comment has been minimized.

Copy link
Member

@RonnyPfannschmidt RonnyPfannschmidt commented Nov 21, 2019

i believe with the current implementation, pytest_parallel is potentially something we have to warn about

@blueyed

This comment has been minimized.

Copy link
Contributor

@blueyed blueyed commented Nov 21, 2019

@blueyed

This comment has been minimized.

Copy link
Contributor

@blueyed blueyed commented Nov 21, 2019

Closing as this appears to be an issue wth pytest-parallel, although pytest could help there (browsertron/pytest-parallel#36 (comment)).

@blueyed blueyed closed this Nov 21, 2019
blueyed added a commit to blueyed/pytest that referenced this issue Nov 22, 2019
Use `dict.keys()` to work around `__iter__` not working with a
multiprocessing DictProxy.

Ref: python/cpython#17333
Fixes pytest-dev#6254.
Ref: browsertron/pytest-parallel#36
@blueyed

This comment has been minimized.

Copy link
Contributor

@blueyed blueyed commented Nov 22, 2019

#6261 has the fix/workaround, if you'd like to test/use that.

@blueyed blueyed reopened this Nov 22, 2019
blueyed added a commit to blueyed/pytest that referenced this issue Nov 22, 2019
Use `dict.keys()` to work around `__iter__` not working with a
multiprocessing DictProxy.

Ref: python/cpython#17333
Fixes pytest-dev#6254.
Ref: browsertron/pytest-parallel#36

(cherry picked from commit 1f736a6)
@JuleBert

This comment has been minimized.

Copy link
Author

@JuleBert JuleBert commented Nov 22, 2019

When executing my pipeline with -o console_output_style=classic I can pytest 5.3.
So this is a working workaround.

@JuleBert

This comment has been minimized.

Copy link
Author

@JuleBert JuleBert commented Nov 25, 2019

Hi there,
with pytest-parallel version 0.0.10 it now works.

Thanks a lot!

bors bot added a commit to duckinator/bork that referenced this issue Nov 28, 2019
Merge #81
81: Update pytest to 5.3.1 r=duckinator a=pyup-bot


This PR updates [pytest](https://pypi.org/project/pytest) from **5.3.0** to **5.3.1**.



<details>
  <summary>Changelog</summary>
  
  
   ### 5.3.1
   ```
   =========================

Improvements
------------

- `6231 &lt;https://github.com/pytest-dev/pytest/issues/6231&gt;`_: Improve check for misspelling of ``pytest.mark.parametrize``.


- `6257 &lt;https://github.com/pytest-dev/pytest/issues/6257&gt;`_: Handle `exit.Exception` raised in `notify_exception` (via `pytest_internalerror`), e.g. when quitting pdb from post mortem.



Bug Fixes
---------

- `5914 &lt;https://github.com/pytest-dev/pytest/issues/5914&gt;`_: pytester: fix ``no_fnmatch_line`` when used after positive matching.


- `6082 &lt;https://github.com/pytest-dev/pytest/issues/6082&gt;`_: Fix line detection for doctest samples inside ``property`` docstrings, as a workaround to `bpo-17446 &lt;https://bugs.python.org/issue17446&gt;`__.


- `6254 &lt;https://github.com/pytest-dev/pytest/issues/6254&gt;`_: Fix compatibility with pytest-parallel (regression in pytest 5.3.0).


- `6255 &lt;https://github.com/pytest-dev/pytest/issues/6255&gt;`_: Clear the ``sys.last_traceback``, ``sys.last_type`` and ``sys.last_value``
  attributes by deleting them instead of setting them to ``None``. This better
  matches the behaviour of the Python standard library.
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pytest
  - Changelog: https://pyup.io/changelogs/pytest/
  - Homepage: https://docs.pytest.org/en/latest/
</details>



Co-authored-by: pyup-bot <github-bot@pyup.io>
bors bot added a commit to rehandalal/therapist that referenced this issue Nov 28, 2019
Merge #105
105: Update pytest to 5.3.1 r=rehandalal a=pyup-bot


This PR updates [pytest](https://pypi.org/project/pytest) from **5.2.4** to **5.3.1**.



<details>
  <summary>Changelog</summary>
  
  
   ### 5.3.1
   ```
   =========================

Improvements
------------

- `6231 &lt;https://github.com/pytest-dev/pytest/issues/6231&gt;`_: Improve check for misspelling of ``pytest.mark.parametrize``.


- `6257 &lt;https://github.com/pytest-dev/pytest/issues/6257&gt;`_: Handle `exit.Exception` raised in `notify_exception` (via `pytest_internalerror`), e.g. when quitting pdb from post mortem.



Bug Fixes
---------

- `5914 &lt;https://github.com/pytest-dev/pytest/issues/5914&gt;`_: pytester: fix ``no_fnmatch_line`` when used after positive matching.


- `6082 &lt;https://github.com/pytest-dev/pytest/issues/6082&gt;`_: Fix line detection for doctest samples inside ``property`` docstrings, as a workaround to `bpo-17446 &lt;https://bugs.python.org/issue17446&gt;`__.


- `6254 &lt;https://github.com/pytest-dev/pytest/issues/6254&gt;`_: Fix compatibility with pytest-parallel (regression in pytest 5.3.0).


- `6255 &lt;https://github.com/pytest-dev/pytest/issues/6255&gt;`_: Clear the ``sys.last_traceback``, ``sys.last_type`` and ``sys.last_value``
  attributes by deleting them instead of setting them to ``None``. This better
  matches the behaviour of the Python standard library.
   ```
   
  
  
   ### 5.3.0
   ```
   =========================

Deprecations
------------

- `6179 &lt;https://github.com/pytest-dev/pytest/issues/6179&gt;`_: The default value of ``junit_family`` option will change to ``xunit2`` in pytest 6.0, given
  that this is the version supported by default in modern tools that manipulate this type of file.

  In order to smooth the transition, pytest will issue a warning in case the ``--junitxml`` option
  is given in the command line but ``junit_family`` is not explicitly configured in ``pytest.ini``.

  For more information, `see the docs &lt;https://docs.pytest.org/en/latest/deprecations.htmljunit-family-default-value-change-to-xunit2&gt;`__.



Features
--------

- `4488 &lt;https://github.com/pytest-dev/pytest/issues/4488&gt;`_: The pytest team has created the `pytest-reportlog &lt;https://github.com/pytest-dev/pytest-reportlog&gt;`__
  plugin, which provides a new ``--report-log=FILE`` option that writes *report logs* into a file as the test session executes.

  Each line of the report log contains a self contained JSON object corresponding to a testing event,
  such as a collection or a test result report. The file is guaranteed to be flushed after writing
  each line, so systems can read and process events in real-time.

  The plugin is meant to replace the ``--resultlog`` option, which is deprecated and meant to be removed
  in a future release. If you use ``--resultlog``, please try out ``pytest-reportlog`` and
  provide feedback.


- `4730 &lt;https://github.com/pytest-dev/pytest/issues/4730&gt;`_: When ``sys.pycache_prefix`` (Python 3.8+) is set, it will be used by pytest to cache test files changed by the assertion rewriting mechanism.

  This makes it easier to benefit of cached ``.pyc`` files even on file systems without permissions.


- `5515 &lt;https://github.com/pytest-dev/pytest/issues/5515&gt;`_: Allow selective auto-indentation of multiline log messages.

  Adds command line option ``--log-auto-indent``, config option
  ``log_auto_indent`` and support for per-entry configuration of
  indentation behavior on calls to ``logging.log()``.

  Alters the default for auto-indention from ``on`` to ``off``. This
  restores the older behavior that existed prior to v4.6.0. This
  reversion to earlier behavior was done because it is better to
  activate new features that may lead to broken tests explicitly
  rather than implicitly.


- `5914 &lt;https://github.com/pytest-dev/pytest/issues/5914&gt;`_: `testdir &lt;https://docs.pytest.org/en/latest/reference.htmltestdir&gt;`__ learned two new functions, `no_fnmatch_line &lt;https://docs.pytest.org/en/latest/reference.html_pytest.pytester.LineMatcher.no_fnmatch_line&gt;`_ and
  `no_re_match_line &lt;https://docs.pytest.org/en/latest/reference.html_pytest.pytester.LineMatcher.no_re_match_line&gt;`_.

  The functions are used to ensure the captured text *does not* match the given
  pattern.

  The previous idiom was to use ``re.match``:

  .. code-block:: python

      result = testdir.runpytest()
      assert re.match(pat, result.stdout.str()) is None

  Or the ``in`` operator:

  .. code-block:: python

      result = testdir.runpytest()
      assert text in result.stdout.str()

  But the new functions produce best output on failure.


- `6057 &lt;https://github.com/pytest-dev/pytest/issues/6057&gt;`_: Added tolerances to complex values when printing ``pytest.approx``.

  For example, ``repr(pytest.approx(3+4j))`` returns ``(3+4j) ± 5e-06 ∠ ±180°``. This is polar notation indicating a circle around the expected value, with a radius of 5e-06. For ``approx`` comparisons to return ``True``, the actual value should fall within this circle.


- `6061 &lt;https://github.com/pytest-dev/pytest/issues/6061&gt;`_: Added the pluginmanager as an argument to ``pytest_addoption``
  so that hooks can be invoked when setting up command line options. This is
  useful for having one plugin communicate things to another plugin,
  such as default values or which set of command line options to add.



Improvements
------------

- `5061 &lt;https://github.com/pytest-dev/pytest/issues/5061&gt;`_: Use multiple colors with terminal summary statistics.


- `5630 &lt;https://github.com/pytest-dev/pytest/issues/5630&gt;`_: Quitting from debuggers is now properly handled in ``doctest`` items.


- `5924 &lt;https://github.com/pytest-dev/pytest/issues/5924&gt;`_: Improved verbose diff output with sequences.

  Before:

  ::

      E   AssertionError: assert [&#39;version&#39;, &#39;...version_info&#39;] == [&#39;version&#39;, &#39;...version&#39;, ...]
      E     Right contains 3 more items, first extra item: &#39; &#39;
      E     Full diff:
      E     - [&#39;version&#39;, &#39;version_info&#39;, &#39;sys.version&#39;, &#39;sys.version_info&#39;]
      E     + [&#39;version&#39;,
      E     +  &#39;version_info&#39;,
      E     +  &#39;sys.version&#39;,
      E     +  &#39;sys.version_info&#39;,
      E     +  &#39; &#39;,
      E     +  &#39;sys.version&#39;,
      E     +  &#39;sys.version_info&#39;]

  After:

  ::

      E   AssertionError: assert [&#39;version&#39;, &#39;...version_info&#39;] == [&#39;version&#39;, &#39;...version&#39;, ...]
      E     Right contains 3 more items, first extra item: &#39; &#39;
      E     Full diff:
      E       [
      E        &#39;version&#39;,
      E        &#39;version_info&#39;,
      E        &#39;sys.version&#39;,
      E        &#39;sys.version_info&#39;,
      E     +  &#39; &#39;,
      E     +  &#39;sys.version&#39;,
      E     +  &#39;sys.version_info&#39;,
      E       ]


- `5934 &lt;https://github.com/pytest-dev/pytest/issues/5934&gt;`_: ``repr`` of ``ExceptionInfo`` objects has been improved to honor the ``__repr__`` method of the underlying exception.

- `5936 &lt;https://github.com/pytest-dev/pytest/issues/5936&gt;`_: Display untruncated assertion message with ``-vv``.


- `5990 &lt;https://github.com/pytest-dev/pytest/issues/5990&gt;`_: Fixed plurality mismatch in test summary (e.g. display &quot;1 error&quot; instead of &quot;1 errors&quot;).


- `6008 &lt;https://github.com/pytest-dev/pytest/issues/6008&gt;`_: ``Config.InvocationParams.args`` is now always a ``tuple`` to better convey that it should be
  immutable and avoid accidental modifications.


- `6023 &lt;https://github.com/pytest-dev/pytest/issues/6023&gt;`_: ``pytest.main`` returns a ``pytest.ExitCode`` instance now, except for when custom exit codes are used (where it returns ``int`` then still).


- `6026 &lt;https://github.com/pytest-dev/pytest/issues/6026&gt;`_: Align prefixes in output of pytester&#39;s ``LineMatcher``.


- `6059 &lt;https://github.com/pytest-dev/pytest/issues/6059&gt;`_: Collection errors are reported as errors (and not failures like before) in the terminal&#39;s short test summary.


- `6069 &lt;https://github.com/pytest-dev/pytest/issues/6069&gt;`_: ``pytester.spawn`` does not skip/xfail tests on FreeBSD anymore unconditionally.


- `6097 &lt;https://github.com/pytest-dev/pytest/issues/6097&gt;`_: The &quot;[...%]&quot; indicator in the test summary is now colored according to the final (new) multi-colored line&#39;s main color.


- `6116 &lt;https://github.com/pytest-dev/pytest/issues/6116&gt;`_: Added ``--co`` as a synonym to ``--collect-only``.


- `6148 &lt;https://github.com/pytest-dev/pytest/issues/6148&gt;`_: ``atomicwrites`` is now only used on Windows, fixing a performance regression with assertion rewriting on Unix.


- `6152 &lt;https://github.com/pytest-dev/pytest/issues/6152&gt;`_: Now parametrization will use the ``__name__`` attribute of any object for the id, if present. Previously it would only use ``__name__`` for functions and classes.


- `6176 &lt;https://github.com/pytest-dev/pytest/issues/6176&gt;`_: Improved failure reporting with pytester&#39;s ``Hookrecorder.assertoutcome``.


- `6181 &lt;https://github.com/pytest-dev/pytest/issues/6181&gt;`_: The reason for a stopped session, e.g. with ``--maxfail`` / ``-x``, now gets reported in the test summary.


- `6206 &lt;https://github.com/pytest-dev/pytest/issues/6206&gt;`_: Improved ``cache.set`` robustness and performance.



Bug Fixes
---------

- `2049 &lt;https://github.com/pytest-dev/pytest/issues/2049&gt;`_: Fixed ``--setup-plan`` showing inaccurate information about fixture lifetimes.


- `2548 &lt;https://github.com/pytest-dev/pytest/issues/2548&gt;`_: Fixed line offset mismatch of skipped tests in terminal summary.


- `6039 &lt;https://github.com/pytest-dev/pytest/issues/6039&gt;`_: The ``PytestDoctestRunner`` is now properly invalidated when unconfiguring the doctest plugin.

  This is important when used with ``pytester``&#39;s ``runpytest_inprocess``.


- `6047 &lt;https://github.com/pytest-dev/pytest/issues/6047&gt;`_: BaseExceptions are now handled in ``saferepr``, which includes ``pytest.fail.Exception`` etc.


- `6074 &lt;https://github.com/pytest-dev/pytest/issues/6074&gt;`_: pytester: fixed order of arguments in ``rm_rf`` warning when cleaning up temporary directories, and do not emit warnings for errors with ``os.open``.


- `6189 &lt;https://github.com/pytest-dev/pytest/issues/6189&gt;`_: Fixed result of ``getmodpath`` method.



Trivial/Internal Changes
------------------------

- `4901 &lt;https://github.com/pytest-dev/pytest/issues/4901&gt;`_: ``RunResult`` from ``pytester`` now displays the mnemonic of the ``ret`` attribute when it is a
  valid ``pytest.ExitCode`` value.
   ```
   
  
</details>


 

<details>
  <summary>Links</summary>
  
  - PyPI: https://pypi.org/project/pytest
  - Changelog: https://pyup.io/changelogs/pytest/
  - Homepage: https://docs.pytest.org/en/latest/
</details>



Co-authored-by: pyup-bot <github-bot@pyup.io>
vinaycalastry added a commit to vinaycalastry/pytest that referenced this issue Dec 11, 2019
Use `dict.keys()` to work around `__iter__` not working with a
multiprocessing DictProxy.

Ref: python/cpython#17333
Fixes pytest-dev#6254.
Ref: browsertron/pytest-parallel#36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
4 participants
You can’t perform that action at this time.