Currently Spack vendors `pytest` at a version which is three major versions behind the latest (3.2.5 vs. 6.2.4). We do that since v3.2.5 is the latest version supporting Python 2.6. Remaining so much behind the currently supported versions though might introduce some incompatibilities and is surely a technical debt. This PR modifies Spack to: - Use the vendored `pytest@3.2.5` only as a fallback solution, if the Python interpreter used for Spack doesn't provide a newer one - Be able to parse `pytest --collect-only` in all the different output formats from v3.2.5 to v6.2.4 and use it consistently for `spack unit-test --list-*` - Updating the unit tests in Github Actions to use a more recent `pytest` version
75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
from __future__ import absolute_import, division, print_function
|
|
|
|
import pytest
|
|
import sys
|
|
|
|
|
|
def pytest_addoption(parser):
|
|
group = parser.getgroup("debugconfig")
|
|
group.addoption('--setuponly', '--setup-only', action="store_true",
|
|
help="only setup fixtures, do not execute tests.")
|
|
group.addoption('--setupshow', '--setup-show', action="store_true",
|
|
help="show setup of fixtures while executing tests.")
|
|
|
|
|
|
@pytest.hookimpl(hookwrapper=True)
|
|
def pytest_fixture_setup(fixturedef, request):
|
|
yield
|
|
config = request.config
|
|
if config.option.setupshow:
|
|
if hasattr(request, 'param'):
|
|
# Save the fixture parameter so ._show_fixture_action() can
|
|
# display it now and during the teardown (in .finish()).
|
|
if fixturedef.ids:
|
|
if callable(fixturedef.ids):
|
|
fixturedef.cached_param = fixturedef.ids(request.param)
|
|
else:
|
|
fixturedef.cached_param = fixturedef.ids[
|
|
request.param_index]
|
|
else:
|
|
fixturedef.cached_param = request.param
|
|
_show_fixture_action(fixturedef, 'SETUP')
|
|
|
|
|
|
def pytest_fixture_post_finalizer(fixturedef):
|
|
if hasattr(fixturedef, "cached_result"):
|
|
config = fixturedef._fixturemanager.config
|
|
if config.option.setupshow:
|
|
_show_fixture_action(fixturedef, 'TEARDOWN')
|
|
if hasattr(fixturedef, "cached_param"):
|
|
del fixturedef.cached_param
|
|
|
|
|
|
def _show_fixture_action(fixturedef, msg):
|
|
config = fixturedef._fixturemanager.config
|
|
capman = config.pluginmanager.getplugin('capturemanager')
|
|
if capman:
|
|
out, err = capman.suspendcapture()
|
|
|
|
tw = config.get_terminal_writer()
|
|
tw.line()
|
|
tw.write(' ' * 2 * fixturedef.scopenum)
|
|
tw.write('{step} {scope} {fixture}'.format(
|
|
step=msg.ljust(8), # align the output to TEARDOWN
|
|
scope=fixturedef.scope[0].upper(),
|
|
fixture=fixturedef.argname))
|
|
|
|
if msg == 'SETUP':
|
|
deps = sorted(arg for arg in fixturedef.argnames if arg != 'request')
|
|
if deps:
|
|
tw.write(' (fixtures used: {0})'.format(', '.join(deps)))
|
|
|
|
if hasattr(fixturedef, 'cached_param'):
|
|
tw.write('[{0}]'.format(fixturedef.cached_param))
|
|
|
|
if capman:
|
|
capman.resumecapture()
|
|
sys.stdout.write(out)
|
|
sys.stderr.write(err)
|
|
|
|
|
|
@pytest.hookimpl(tryfirst=True)
|
|
def pytest_cmdline_main(config):
|
|
if config.option.setuponly:
|
|
config.option.setupshow = True
|