aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorstark, steven <ss820f@att.com>2018-07-09 11:33:13 -0700
committerstark, steven <ss820f@att.com>2018-07-09 11:48:02 -0700
commit7e08a8738145295de2937f00231e4ec13db1e9b0 (patch)
tree656064ba46985550a219cab47c72514a68447a88
parentfb9c5e35e22f7fe4465ea33b4e2ac85ccfd33bee (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.py11
-rw-r--r--ice_validator/tests/helpers.py25
-rw-r--r--requirements.txt3
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