diff options
author | stark, steven <ss820f@att.com> | 2018-07-09 11:33:13 -0700 |
---|---|---|
committer | stark, steven <ss820f@att.com> | 2018-07-09 11:48:02 -0700 |
commit | 7e08a8738145295de2937f00231e4ec13db1e9b0 (patch) | |
tree | 656064ba46985550a219cab47c72514a68447a88 | |
parent | fb9c5e35e22f7fe4465ea33b4e2ac85ccfd33bee (diff) |
[VVP] Track Requirements to Test Cases
Change-Id: I35c7630d0aabb970e67323e1e895a57cbcb23fb2
Issue-ID: VVP-79
Signed-off-by: stark, steven <ss820f@att.com>
-rw-r--r-- | ice_validator/tests/conftest.py | 11 | ||||
-rw-r--r-- | ice_validator/tests/helpers.py | 25 | ||||
-rw-r--r-- | requirements.txt | 3 |
3 files changed, 38 insertions, 1 deletions
diff --git a/ice_validator/tests/conftest.py b/ice_validator/tests/conftest.py index 69709af..84429cf 100644 --- a/ice_validator/tests/conftest.py +++ b/ice_validator/tests/conftest.py @@ -147,3 +147,14 @@ def pytest_generate_tests(metafunc): if 'templates' in metafunc.fixturenames: from .parametrizers import parametrize_templates parametrize_templates(metafunc) + + +def pytest_report_collectionfinish(config, startdir, items): + """Generates a simple traceability report to sysout""" + print("Traceability Report") + print("==================================================================") + for item in items: + if hasattr(item.function, "requirement_ids"): + for req_id in item.function.requirement_ids: + print(req_id + "," + item.function.__module__ + "," + + item.function.__name__) diff --git a/ice_validator/tests/helpers.py b/ice_validator/tests/helpers.py index 9cde1fa..82d0201 100644 --- a/ice_validator/tests/helpers.py +++ b/ice_validator/tests/helpers.py @@ -39,6 +39,7 @@ # import yaml +from boltons import funcutils def check_basename_ending(template_type, basename): @@ -76,3 +77,27 @@ def get_parsed_yml_for_yaml_files(yaml_files, sections=[]): parsed_yml_list.append(yml) return parsed_yml_list + + +def validates(*requirement_ids): + """Decorator that tags the test function with one or more requirement IDs. + + Example: + >>> @validates('R-12345', 'R-12346') + ... def test_something(): + ... pass + >>> assert test_something.requirement_ids == ['R-12345', 'R-12346'] + """ + def decorator(func): + # NOTE: We use a utility here to ensure that function signatures are + # maintained because pytest inspects function signatures to inject + # fixtures. I experimented with a few options, but this is the only + # library that worked. Other libraries dynamically generated a + # function at run-time, and then lost the requirement_ids attribute + @funcutils.wraps(func) + def wrapper(*args, **kw): + return func(*args, **kw) + wrapper.requirement_ids = requirement_ids + return wrapper + decorator.requirement_ids = requirement_ids + return decorator diff --git a/requirements.txt b/requirements.txt index a33e916..ce8e47f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -40,4 +40,5 @@ pytest PyYAML -pytest-tap
\ No newline at end of file +pytest-tap +boltons |