Skip to content

Commit

Permalink
Merge pull request #3428 from nicoddemus/merge-master-into-features
Browse files Browse the repository at this point in the history
Merge master into features
  • Loading branch information
RonnyPfannschmidt authored Apr 25, 2018
2 parents 6e62fc9 + 63368e0 commit 5ba0663
Show file tree
Hide file tree
Showing 26 changed files with 201 additions and 61 deletions.
52 changes: 52 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,58 @@
.. towncrier release notes start
Pytest 3.5.1 (2018-04-23)
=========================


Bug Fixes
---------

- Reset ``sys.last_type``, ``sys.last_value`` and ``sys.last_traceback`` before
each test executes. Those attributes are added by pytest during the test run
to aid debugging, but were never reset so they would create a leaking
reference to the last failing test's frame which in turn could never be
reclaimed by the garbage collector. (`#2798
<https://github.com/pytest-dev/pytest/issues/2798>`_)

- ``pytest.raises`` now raises ``TypeError`` when receiving an unknown keyword
argument. (`#3348 <https://github.com/pytest-dev/pytest/issues/3348>`_)

- ``pytest.raises`` now works with exception classes that look like iterables.
(`#3372 <https://github.com/pytest-dev/pytest/issues/3372>`_)


Improved Documentation
----------------------

- Fix typo in ``caplog`` fixture documentation, which incorrectly identified
certain attributes as methods. (`#3406
<https://github.com/pytest-dev/pytest/issues/3406>`_)


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

- Added a more indicative error message when parametrizing a function whose
argument takes a default value. (`#3221
<https://github.com/pytest-dev/pytest/issues/3221>`_)

- Remove internal ``_pytest.terminal.flatten`` function in favor of
``more_itertools.collapse``. (`#3330
<https://github.com/pytest-dev/pytest/issues/3330>`_)

- Import some modules from ``collections.abc`` instead of ``collections`` as
the former modules trigger ``DeprecationWarning`` in Python 3.7. (`#3339
<https://github.com/pytest-dev/pytest/issues/3339>`_)

- record_property is no longer experimental, removing the warnings was
forgotten. (`#3360 <https://github.com/pytest-dev/pytest/issues/3360>`_)

- Mention in documentation and CLI help that fixtures with leading ``_`` are
printed by ``pytest --fixtures`` only if the ``-v`` option is added. (`#3398
<https://github.com/pytest-dev/pytest/issues/3398>`_)


Pytest 3.5.0 (2018-03-21)
=========================

Expand Down
6 changes: 2 additions & 4 deletions CONTRIBUTING.rst
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,7 @@ fix the bug itself.
Fix bugs
--------

Look through the GitHub issues for bugs. Here is a filter you can use:
https://github.com/pytest-dev/pytest/labels/type%3A%20bug
Look through the `GitHub issues for bugs <https://github.com/pytest-dev/pytest/labels/type:%20bug>`_.

:ref:`Talk <contact>` to developers to find out how you can fix specific bugs.

Expand All @@ -60,8 +59,7 @@ Don't forget to check the issue trackers of your favourite plugins, too!
Implement features
------------------

Look through the GitHub issues for enhancements. Here is a filter you can use:
https://github.com/pytest-dev/pytest/labels/enhancement
Look through the `GitHub issues for enhancements <https://github.com/pytest-dev/pytest/labels/type:%20enhancement>`_.

:ref:`Talk <contact>` to developers to find out how you can implement specific
features.
Expand Down
8 changes: 8 additions & 0 deletions _pytest/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,14 @@ def getfuncargnames(function, is_method=False, cls=None):
return arg_names


def get_default_arg_names(function):
# Note: this code intentionally mirrors the code at the beginning of getfuncargnames,
# to get the arguments which were excluded from its result because they had default values
return tuple(p.name for p in signature(function).parameters.values()
if p.kind in (Parameter.POSITIONAL_OR_KEYWORD, Parameter.KEYWORD_ONLY) and
p.default is not Parameter.empty)


if _PY3:
STRING_TYPES = bytes, str
UNICODE_TYPES = str,
Expand Down
3 changes: 2 additions & 1 deletion _pytest/helpconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,8 @@ def showhelp(config):
tw.line("to see available markers type: pytest --markers")
tw.line("to see available fixtures type: pytest --fixtures")
tw.line("(shown according to specified file_or_dir or current dir "
"if not specified)")
"if not specified; fixtures with leading '_' are only shown "
"with the '-v' option")

for warningreport in reporter.stats.get('warnings', []):
tw.line("warning : " + warningreport.message, red=True)
Expand Down
6 changes: 3 additions & 3 deletions _pytest/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,9 +289,9 @@ def caplog(request):
Captured logs are available through the following methods::
* caplog.text() -> string containing formatted log output
* caplog.records() -> list of logging.LogRecord instances
* caplog.record_tuples() -> list of (logger_name, level, message) tuples
* caplog.text -> string containing formatted log output
* caplog.records -> list of logging.LogRecord instances
* caplog.record_tuples -> list of (logger_name, level, message) tuples
* caplog.clear() -> clear captured records and formatted log output string
"""
result = LogCaptureFixture(request.node)
Expand Down
2 changes: 1 addition & 1 deletion _pytest/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ def isinitpath(self, path):

def gethookproxy(self, fspath):
# check if we have the common case of running
# hooks with all conftest.py filesall conftest.py
# hooks with all conftest.py files
pm = self.config.pluginmanager
my_conftestmodules = pm._getconftestmodules(fspath)
remove_mods = pm._conftest_plugins.difference(my_conftestmodules)
Expand Down
21 changes: 13 additions & 8 deletions _pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
isclass, isfunction, is_generator, ascii_escaped,
REGEX_TYPE, STRING_TYPES, NoneType, NOTSET,
get_real_func, getfslineno, safe_getattr,
safe_str, getlocation, enum,
safe_str, getlocation, enum, get_default_arg_names
)
from _pytest.outcomes import fail
from _pytest.mark.structures import transfer_markers, get_unpacked_marks
Expand Down Expand Up @@ -75,7 +75,8 @@ def pytest_addoption(parser):
group = parser.getgroup("general")
group.addoption('--fixtures', '--funcargs',
action="store_true", dest="showfixtures", default=False,
help="show available fixtures, sorted by plugin appearance")
help="show available fixtures, sorted by plugin appearance "
"(fixtures with leading '_' are only shown with '-v')")
group.addoption(
'--fixtures-per-test',
action="store_true",
Expand Down Expand Up @@ -808,6 +809,7 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
argnames, parameters = ParameterSet._for_parametrize(
argnames, argvalues, self.function, self.config)
del argvalues
default_arg_names = set(get_default_arg_names(self.function))

if scope is None:
scope = _find_parametrized_scope(argnames, self._arg2fixturedefs, indirect)
Expand All @@ -816,13 +818,16 @@ def parametrize(self, argnames, argvalues, indirect=False, ids=None,
valtypes = {}
for arg in argnames:
if arg not in self.fixturenames:
if isinstance(indirect, (tuple, list)):
name = 'fixture' if arg in indirect else 'argument'
if arg in default_arg_names:
raise ValueError("%r already takes an argument %r with a default value" % (self.function, arg))
else:
name = 'fixture' if indirect else 'argument'
raise ValueError(
"%r uses no %s %r" % (
self.function, name, arg))
if isinstance(indirect, (tuple, list)):
name = 'fixture' if arg in indirect else 'argument'
else:
name = 'fixture' if indirect else 'argument'
raise ValueError(
"%r uses no %s %r" % (
self.function, name, arg))

if indirect is True:
valtypes = dict.fromkeys(argnames, "params")
Expand Down
3 changes: 2 additions & 1 deletion _pytest/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ def pytest_runtest_setup(item):

def pytest_runtest_call(item):
_update_current_test_var(item, 'call')
sys.last_type, sys.last_value, sys.last_traceback = (None, None, None)
try:
item.runtest()
except Exception:
Expand All @@ -114,7 +115,7 @@ def pytest_runtest_call(item):
sys.last_type = type
sys.last_value = value
sys.last_traceback = tb
del tb # Get rid of it in this namespace
del type, value, tb # Get rid of these in this frame
raise


Expand Down
1 change: 0 additions & 1 deletion changelog/3330.trivial.rst

This file was deleted.

1 change: 0 additions & 1 deletion changelog/3339.trivial

This file was deleted.

1 change: 0 additions & 1 deletion changelog/3348.bugfix.rst

This file was deleted.

2 changes: 0 additions & 2 deletions changelog/3360.trivial

This file was deleted.

1 change: 0 additions & 1 deletion changelog/3372.bugfix.rst

This file was deleted.

1 change: 1 addition & 0 deletions doc/en/announce/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Release announcements
:maxdepth: 2


release-3.5.1
release-3.5.0
release-3.4.2
release-3.4.1
Expand Down
30 changes: 30 additions & 0 deletions doc/en/announce/release-3.5.1.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
pytest-3.5.1
=======================================

pytest 3.5.1 has just been released to PyPI.

This is a bug-fix release, being a drop-in replacement. To upgrade::

pip install --upgrade pytest
The full changelog is available at http://doc.pytest.org/en/latest/changelog.html.

Thanks to all who contributed to this release, among them:

* Brian Maissy
* Bruno Oliveira
* Darren Burns
* David Chudzicki
* Floris Bruynooghe
* Holger Kohr
* Irmen de Jong
* Jeffrey Rackauckas
* Rachel Kogan
* Ronny Pfannschmidt
* Stefan Scherfke
* Tim Strazny
* Семён Марьясин


Happy testing,
The pytest Development Team
8 changes: 4 additions & 4 deletions doc/en/builtin.rst
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ For information on plugin hooks and objects, see :ref:`plugins`.

For information on the ``pytest.mark`` mechanism, see :ref:`mark`.

For information about fixtures, see :ref:`fixtures`. To see a complete list of available fixtures, type::
For information about fixtures, see :ref:`fixtures`. To see a complete list of available fixtures (add ``-v`` to also see fixtures with leading ``_``), type ::

$ pytest -q --fixtures
cache
Expand Down Expand Up @@ -77,9 +77,9 @@ For information about fixtures, see :ref:`fixtures`. To see a complete list of a
Captured logs are available through the following methods::
* caplog.text() -> string containing formatted log output
* caplog.records() -> list of logging.LogRecord instances
* caplog.record_tuples() -> list of (logger_name, level, message) tuples
* caplog.text -> string containing formatted log output
* caplog.records -> list of logging.LogRecord instances
* caplog.record_tuples -> list of (logger_name, level, message) tuples
* caplog.clear() -> clear captured records and formatted log output string
monkeypatch
The returned ``monkeypatch`` fixture provides these
Expand Down
2 changes: 1 addition & 1 deletion doc/en/example/reportingdemo.rst
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ get on the terminal - we are working on that)::
> int(s)
E ValueError: invalid literal for int() with base 10: 'qwe'
<0-codegen $PYTHON_PREFIX/lib/python3.5/site-packages/_pytest/python_api.py:613>:1: ValueError
<0-codegen $PYTHON_PREFIX/lib/python3.5/site-packages/_pytest/python_api.py:615>:1: ValueError
______________________ TestRaises.test_raises_doesnt _______________________
self = <failure_demo.TestRaises object at 0xdeadbeef>
Expand Down
2 changes: 1 addition & 1 deletion doc/en/example/simple.rst
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ the command line arguments before they get processed:
# content of conftest.py
import sys
def pytest_cmdline_preparse(args):
def pytest_load_initial_conftests(args):
if 'xdist' in sys.modules: # pytest-xdist plugin
import multiprocessing
num = max(multiprocessing.cpu_count() / 2, 1)
Expand Down
6 changes: 3 additions & 3 deletions doc/en/fixture.rst
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,11 @@ with a list of available function arguments.

.. note::

You can always issue::
You can always issue ::

pytest --fixtures test_simplefactory.py

to see available fixtures.
to see available fixtures (fixtures with leading ``_`` are only shown if you add the ``-v`` option).

Fixtures: a prime example of dependency injection
---------------------------------------------------
Expand All @@ -141,7 +141,7 @@ automatically gets discovered by pytest. The discovery of
fixture functions starts at test classes, then test modules, then
``conftest.py`` files and finally builtin and third party plugins.

You can also use the ``conftest.py`` file to implement
You can also use the ``conftest.py`` file to implement
:ref:`local per-directory plugins <conftest.py plugins>`.

Sharing test data
Expand Down
2 changes: 2 additions & 0 deletions doc/en/getting-started.rst
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,8 @@ Find out what kind of builtin :ref:`pytest fixtures <fixtures>` exist with the c

pytest --fixtures # shows builtin and custom fixtures

Note that this command omits fixtures with leading ``_`` unless the ``-v`` option is added.

Continue reading
-------------------------------------

Expand Down
2 changes: 1 addition & 1 deletion doc/en/test/plugin/terminal.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ command line options
``--full-trace``
don't cut any tracebacks (default is to cut).
``--fixtures``
show available function arguments, sorted by plugin
show available fixtures, sorted by plugin appearance (fixtures with leading ``_`` are only shown with '-v')

Start improving this plugin in 30 seconds
=========================================
Expand Down
4 changes: 4 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ def main():
'write_to': '_pytest/_version.py',
},
url='http://pytest.org',
project_urls={
'Source': 'https://github.com/pytest-dev/pytest',
'Tracker': 'https://github.com/pytest-dev/pytest/issues',
},
license='MIT license',
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
author=(
Expand Down
30 changes: 30 additions & 0 deletions testing/acceptance_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -988,3 +988,33 @@ def test_value():
''')
result = testdir.runpytest()
assert result.ret == 0


def test_frame_leak_on_failing_test(testdir):
"""pytest would leak garbage referencing the frames of tests that failed that could never be reclaimed (#2798)
Unfortunately it was not possible to remove the actual circles because most of them
are made of traceback objects which cannot be weakly referenced. Those objects at least
can be eventually claimed by the garbage collector.
"""
testdir.makepyfile('''
import gc
import weakref
class Obj:
pass
ref = None
def test1():
obj = Obj()
global ref
ref = weakref.ref(obj)
assert 0
def test2():
gc.collect()
assert ref() is None
''')
result = testdir.runpytest_subprocess()
result.stdout.fnmatch_lines(['*1 failed, 1 passed in*'])
13 changes: 13 additions & 0 deletions testing/python/metafunc.py
Original file line number Diff line number Diff line change
Expand Up @@ -622,6 +622,19 @@ def test_simple(x):
"*uses no argument 'y'*",
])

def test_parametrize_gives_indicative_error_on_function_with_default_argument(self, testdir):
testdir.makepyfile("""
import pytest
@pytest.mark.parametrize('x, y', [('a', 'b')])
def test_simple(x, y=1):
assert len(x) == 1
""")
result = testdir.runpytest("--collect-only")
result.stdout.fnmatch_lines([
"*already takes an argument 'y' with a default value",
])

def test_addcalls_and_parametrize_indirect(self):
def func(x, y):
pass
Expand Down
Loading

0 comments on commit 5ba0663

Please sign in to comment.