Skip to content

Pytest 3.7.1 isn't keeping class variables set by autouse function #3778

Closed
@s1113950

Description

@s1113950

Link to sample failure (it's a public project so hopefully you can see this?)
https://circleci.com/gh/IntelAI/mlt/1857

pytest env:

(.venv) root@2ca5ec29de7d:/usr/share/mlt# pytest --version
This is pytest version 3.7.1, imported from /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pytest.pyc
setuptools registered plugins:
  pytest-xdist-1.22.5 at /usr/share/mlt/.venv/local/lib/python2.7/site-packages/xdist/looponfail.py
  pytest-xdist-1.22.5 at /usr/share/mlt/.venv/local/lib/python2.7/site-packages/xdist/plugin.py
  pytest-forked-0.2 at /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pytest_forked/__init__.pyc
  pytest-cov-2.5.1 at /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pytest_cov/plugin.py

The vars get set as they used to, but then in between the variables being set by this class here and when the first test is called, the variables disappear:

class CommandTester(object):
    @classmethod
    @pytest.fixture(scope='class', autouse=True)
    def setup(self):
        self.registry = os.getenv('MLT_REGISTRY', 'localhost:5000')
        self.tfjob_templates = ('tf-dist-mnist', 'tf-distributed')
class TestConfig(CommandTester):
    def test_config_list(self):
        """
        Tests listing configs in an init directory
        """
        self.init()
def init(self, template='hello-world', template_repo=basedir(),
             enable_sync=False):
        self._set_new_mlt_project_vars(template)
>       init_options = ['mlt', 'init', '--registry={}'.format(self.registry),
                        '--template-repo={}'.format(template_repo),
                        '--namespace={}'.format(self.namespace),
                        '--template={}'.format(template), self.app_name]
E       AttributeError: 'TestConfig' object has no attribute 'registry'

I stepped through every line that was called, and it was all stuff in pytest or an associated package. In the beginning you'll notice that self.registry is indeed set.

======================================================================== test session starts ===============================================================[277/816]
platform linux2 -- Python 2.7.12, pytest-3.7.1, py-1.5.4, pluggy-0.7.1 -- /usr/share/mlt/.venv/bin/python2
cachedir: .pytest_cache
rootdir: /usr/share/mlt, inifile: tox.ini
plugins: xdist-1.22.5, forked-0.2, cov-2.5.1
collected 1 item

tests/e2e/test_config_updates.py::TestConfig::test_update_config
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /usr/share/mlt/tests/test_utils/e2e_commands.py(46)setup()
-> self.registry = os.getenv('MLT_REGISTRY', 'localhost:5000')
(Pdb) n
> /usr/share/mlt/tests/test_utils/e2e_commands.py(51)setup()
-> self.tfjob_templates = ('tf-dist-mnist', 'tf-distributed')
(Pdb) n
--Return--
> /usr/share/mlt/tests/test_utils/e2e_commands.py(51)setup()->None
-> self.tfjob_templates = ('tf-dist-mnist', 'tf-distributed')
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(800)call_fixture_func()
-> return res
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(800)call_fixture_func()->None
-> return res
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(942)pytest_fixture_setup()
-> fixturedef.cached_result = (result, my_cache_key, None)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(943)pytest_fixture_setup()
-> return result
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(943)pytest_fixture_setup()->None
-> return result
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(181)_multicall()                                                                 [241/816]
-> if res is not None:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(163)_multicall()
-> for hook_impl in reversed(hook_impls):
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(188)_multicall()
-> if firstresult:  # first result hooks return a single value
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(189)_multicall()
-> outcome = _Result(results[0] if results else None, excinfo)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(194)_multicall()
-> for gen in reversed(teardowns):
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(195)_multicall()
-> try:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(196)_multicall()
-> gen.send(outcome)
(Pdb) n
StopIteration: None
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(196)_multicall()
-> gen.send(outcome)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(198)_multicall()
-> except StopIteration:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(199)_multicall()
-> pass
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(194)_multicall()
-> for gen in reversed(teardowns):
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(201)_multicall()
-> return outcome.get_result()
(Pdb) n                                                                                                                                                     [205/816]
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(201)_multicall()->None
-> return outcome.get_result()
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/manager.py(61)<lambda>()->None
-> firstresult=hook.spec_opts.get('firstresult'),
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/manager.py(67)_hookexec()->None
-> return self._inner_hookexec(hook, methods, kwargs)
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/hooks.py(258)__call__()->None
-> return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(896)execute()->None
-> return hook.pytest_fixture_setup(fixturedef=self, request=request)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(606)_compute_fixture_value()
-> self.session._setupstate.addfinalizer(
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(607)_compute_fixture_value()
-> functools.partial(fixturedef.finish, request=subrequest),
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(608)_compute_fixture_value()
-> subrequest.node,
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(608)_compute_fixture_value()->None
-> subrequest.node,
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(533)_get_active_fixturedef()
-> self._fixture_defs[argname] = fixturedef
(Pdb) n                                                                                                                                                     [169/816]
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(534)_get_active_fixturedef()
-> return fixturedef
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(534)_get_active_fixturedef()-><Fixture...ig::()' >
-> return fixturedef
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(509)getfixturevalue()->None
-> return self._get_active_fixturedef(argname).cached_result[0]
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(463)_fillfixtures()
-> for argname in fixturenames:
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(463)_fillfixtures()->None
-> for argname in fixturenames:
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/fixtures.py(294)fillfixtures()->None
-> request._fillfixtures()
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/python.py(1435)setup()->None
-> fixtures.fillfixtures(self)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(367)prepare()
-> for col in needed_collectors[len(self.stack) :]:
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(367)prepare()->None
-> for col in needed_collectors[len(self.stack) :]:
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(104)pytest_runtest_setup()->None
-> item.session._setupstate.prepare(item)
(Pdb) n                                                                                                                                                     [132/816]
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(181)_multicall()
-> if res is not None:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(163)_multicall()
-> for hook_impl in reversed(hook_impls):
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(164)_multicall()
-> try:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(165)_multicall()
-> args = [caller_kwargs[argname] for argname in hook_impl.argnames]
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(165)_multicall()
-> args = [caller_kwargs[argname] for argname in hook_impl.argnames]
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(172)_multicall()
-> if hook_impl.hookwrapper:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(180)_multicall()
-> res = hook_impl.function(*args)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(181)_multicall()
-> if res is not None:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(163)_multicall()
-> for hook_impl in reversed(hook_impls):
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(188)_multicall()
-> if firstresult:  # first result hooks return a single value
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(191)_multicall()
-> outcome = _Result(results, excinfo)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(194)_multicall()
-> for gen in reversed(teardowns):
(Pdb) n                                                                                                                                                      [96/816]
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(195)_multicall()
-> try:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(196)_multicall()
-> gen.send(outcome)
(Pdb) n
StopIteration: None
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(196)_multicall()
-> gen.send(outcome)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(198)_multicall()
-> except StopIteration:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(199)_multicall()
-> pass
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(194)_multicall()
-> for gen in reversed(teardowns):
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(195)_multicall()
-> try:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(196)_multicall()
-> gen.send(outcome)
(Pdb) n
StopIteration: None
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(196)_multicall()
-> gen.send(outcome)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(198)_multicall()
-> except StopIteration:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(199)_multicall()
-> pass
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(194)_multicall()
-> for gen in reversed(teardowns):
(Pdb) n                                                                                                                                                      [58/816]
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(201)_multicall()
-> return outcome.get_result()
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/callers.py(201)_multicall()->[]
-> return outcome.get_result()
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/manager.py(61)<lambda>()->[]
-> firstresult=hook.spec_opts.get('firstresult'),
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/manager.py(67)_hookexec()->[]
-> return self._inner_hookexec(hook, methods, kwargs)
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/pluggy/hooks.py(258)__call__()->[]
-> return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(183)<lambda>()->[]
-> lambda: ihook(item=item, **kwds),
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(210)__init__()
-> self.stop = time()
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(210)__init__()->None
-> self.stop = time()
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(185)call_runtest_hook()-><CallInf...sult: []>
-> treat_keyboard_interrupt_as_exception=item.config.getvalue("usepdb"),
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(162)call_and_report()
-> hook = item.ihook
(Pdb) n                                                                                                                                                      [21/816]
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(163)call_and_report()
-> report = hook.pytest_runtest_makereport(item=item, call=call)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(164)call_and_report()
-> if log:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(165)call_and_report()
-> hook.pytest_runtest_logreport(report=report)
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(166)call_and_report()
-> if check_interactive_exception(call, report):
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(168)call_and_report()
-> return report
(Pdb) n
--Return--
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(168)call_and_report()-><TestRep...'passed'>
-> return report
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(76)runtestprotocol()
-> reports = [rep]
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(77)runtestprotocol()
-> if rep.passed:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(78)runtestprotocol()
-> if item.config.option.setupshow:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(80)runtestprotocol()
-> if not item.config.option.setuponly:
(Pdb) n
> /usr/share/mlt/.venv/local/lib/python2.7/site-packages/_pytest/runner.py(81)runtestprotocol()
-> reports.append(call_and_report(item, "call", log))
(Pdb) n
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /usr/share/mlt/tests/test_utils/e2e_commands.py(126)init()
-> self._set_new_mlt_project_vars(template)
(Pdb) n
> /usr/share/mlt/tests/test_utils/e2e_commands.py(127)init()
-> init_options = ['mlt', 'init', '--registry={}'.format(self.registry),
(Pdb) self.registry
*** AttributeError: 'TestConfig' object has no attribute 'registry'

full pip list is here:

(.venv) root@2ca5ec29de7d:/usr/share/mlt# pip list
Package        Version           Location
-------------- ----------------- ------------------------------------------------
apipkg         1.5
argh           0.26.2
atomicwrites   1.1.5
attrs          18.1.0
conditional    1.2
configparser   3.5.0
coverage       4.5.1
docopt         0.6.2
enum34         1.1.6
execnet        1.5.0
flake8         3.5.0
funcsigs       1.0.2
functools32    3.2.3.post2
jsonschema     2.6.0
mccabe         0.6.1
mlt            0.2.1+10.gfbc10bf /usr/share/mlt/.venv/lib/python2.7/site-packages
mock           2.0.0
more-itertools 4.3.0
packaging      17.1
pathlib2       2.3.2
pathtools      0.1.2
pbr            4.2.0
pip            18.0
pluggy         0.7.1
progressbar2   3.38.0
py             1.5.4
pycodestyle    2.3.1
pyflakes       1.6.0
pyparsing      2.2.0
pytest         3.7.1
pytest-cov     2.5.1
pytest-forked  0.2
pytest-xdist   1.22.5
python-utils   2.3.0
PyYAML         3.13
scandir        1.8
setuptools     40.0.0
six            1.11.0
tabulate       0.8.2
termcolor      1.1.0
tox            3.1.2
virtualenv     16.0.0
watchdog       0.8.3
wheel          0.31.1

This used to work with the prior version of pytest (we hadn't pegged pytest as we should have and tests all broke after the 8/2 release).

EDIT
Pegging to these versions made things work again:
https://github.com/IntelAI/mlt/commit/2d5ec3251da295051b0862fa0db3c6e71dbb22ec

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: bugproblem that needs to be addressedtype: regressionindicates a problem that was introduced in a release which was working previously

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions