# -*- coding: utf-8 -*-
"""Plugin that does basic test case validation.
Use ``--validate-test-cases`` to enable it.
Currently does not work on ``--collect-only`` due to pytest's implementation bug.
Error output lines are prefixed by ``[TCV-E]``.
If no error nappens, a line prefixed with ``[TCV-OK]`` appears at the end of collection.
"""
[docs]def pytest_addoption(parser):
group = parser.getgroup('cfme')
group.addoption(
'--validate-test-cases', dest='validate_tcs', action='store_true', default=False,
help="Enable test case validation")
[docs]def load_available_requirements():
"""Slightly hacky, run through all objects in the module and only pick the correct ones."""
from _pytest.mark import MarkDecorator
from cfme import test_requirements
names = set()
for requirement_name in dir(test_requirements):
if requirement_name.startswith('_') or requirement_name == 'pytest':
continue
requirement_marker = getattr(test_requirements, requirement_name)
if not isinstance(requirement_marker, MarkDecorator):
continue
if requirement_marker.name == 'requirement':
names.add(requirement_marker.args[0])
return names
[docs]def check_tier(item):
strings = []
tier = item.get_marker('tier')
if tier is None:
strings.append('[TCV-E] MISSING TIER: {}'.format(item.nodeid))
else:
try:
tier = tier.args[0]
except IndexError:
strings.append('[TCV-E] BAD TIER SPECIFICATION: {}'.format(item.nodeid))
else:
if not 1 <= tier <= 3:
strings.append('[TCV-E] BAD TIER NUMBER ({}): {}'.format(tier, item.nodeid))
return strings
[docs]def check_requirement(item, available_requirements):
strings = []
requirement = item.get_marker('requirement')
if requirement is None:
strings.append('[TCV-E] MISSING REQUIREMENT: {}'.format(item.nodeid))
else:
try:
requirement = requirement.args[0]
except IndexError:
strings.append('[TCV-E] BAD REQUIREMENT SPECIFICATION: {}'.format(item.nodeid))
else:
if requirement not in available_requirements:
strings.append(
'[TCV-E] BAD REQUIREMENT STRING ({}): {}'.format(requirement, item.nodeid))
return strings
[docs]def pytest_report_collectionfinish(config, startdir, items):
if not config.option.validate_tcs:
return
strings = []
available_requirements = load_available_requirements()
for item in items:
strings.extend(check_tier(item))
strings.extend(check_requirement(item, available_requirements))
if not strings:
strings.append('[TCV-OK] TEST CASES VALIDATED OK!')
else:
strings.append('[TCV-E] SOME TEST CASES NEED REVIEWING!')
return strings