{% macro break_id(id) %} {% for id_part in id | split(pat=".") %} {%- if loop.index > 1 %}.{% endif -%}{{- id_part -}} {% endfor %} {% endmacro break_id %}

Mantra Report for {%if project.name %}{{ project.name }}{% else %}unknown{% endif %} {%if project.version %}v{{ project.version }}{% endif %}

{% if tag.name %}

Tag: {%if tag.link %}{{ tag.name }}{% else %}{{ tag.name }}{% endif %}

{% endif %}

This report was generated by mantra with the following criteria:

Requirements

{%if not validation.is_valid %}

This report has {{ validation.invalid_reqs | length }} invalid requirement{% if validation.invalid_reqs | length != 1 %}s{% endif %}:

{% endif %} {% if unrelated.traces | length > 0 %}

{{ unrelated.traces | length }} unrelated traces.

{% endif %} {% if unrelated.coverage | length > 0 %}

{{ unrelated.coverage | length }} unrelated coverage.

{% endif %} {% if unrelated.verified_requirements | length > 0 %}

{{ unrelated.verified_requirements | length }} unrelated verified requirements.

{% endif %}

Overview

Status

{% for req in requirements %} {% endfor %}
ID Tracing Coverage Manual
{{ self::break_id(id=req.id) }} {% if req.manual %} (manual{% if not req.valid %}, invalid{% endif %}) {% elif req.deprecated %} (deprecated{% if not req.valid %}, invalid{% endif %}) {% elif not req.valid %} (invalid) {% endif %} {% if req.trace_info.traced %}
traced
{% elif req.manual %}
-
{% else %}
untraced
{% endif %}
{% if req.test_coverage_info.passed %}
passed
{% elif req.test_coverage_info.covered %}
failed
{% elif req.manual %}
-
{% else %}
uncovered
{% endif %}
{% if req.verified_info | length > 0 %}
verified
{% elif not req.manual %}
-
{% else %}
unverified
{% endif %}

Details

{% for req in requirements %}

{{ self::break_id(id=req.id) }} {% if req.manual %} (manual{% if not req.valid %}, invalid{% endif %}) {% elif req.deprecated %} (deprecated{% if not req.valid %}, invalid{% endif %}) {% elif not req.valid %} (invalid) {% endif %}

Parent: {% if req.parents %} {% for parent in req.parents %} {{ self::break_id(id=parent) }} {% endfor %} {% else %}none{% endif %}

{% if req.manual and not req.trace_info.traced %}

Status (manual)

{% if req.verified_info | length > 0 %}
verified
{% else %}
unverified
{% endif %}
{% else %}

Status

{% if req.verified_info | length > 0 %} {% elif req.manual %} {% endif %}
{% if req.trace_info.traced %}
traced
{% elif req.manual %}
-
{% else %}
untraced
{% endif %}
{% if req.test_coverage_info.passed %}
passed
{% elif req.test_coverage_info.covered %}
failed
{% elif req.manual %}
-
{% else %}
uncovered
{% endif %}
verified
unverified
{% endif %}

{{ req.title }}

{{ req.origin }} {% if req.rendered_data %}
{{ req.rendered_data | safe }}
{% endif %}
Details

Direct Children ({{ req.direct_children | length }})

{% if req.direct_children | length > 0 %} {% endif %}

Direct Traces ({{ req.trace_info.direct_traces | length }})

{% if req.trace_info.direct_traces | length > 0 %} {% for trace in req.trace_info.direct_traces %} {% endfor %}
name file line
{% if trace.item_name %}{{ trace.item_name }}{% else %}-{% endif %} {{ trace.filepath }} {{ trace.line }}
{% endif %}

Indirect Traces ({{ req.trace_info.indirect_traces | length }})

{% if req.trace_info.indirect_traces | length > 0 %} {% endif %}

Direct Coverage ({{ req.test_coverage_info.direct_coverage | length }})

{% if req.test_coverage_info.direct_coverage | length > 0 %}
    {% for test_run in req.test_coverage_info.direct_coverage %}
  • ‎{{ test_run.name }}
    {{ test_run.date | date(format="%Y-%m-%d %H:%M:%S", timezone="Europe/Berlin") }}

      {% for test in test_run.tests %}
    • {% if test.passed %}passed{% else %}failed{% endif %} ‎{{ test.name }}

      {% for trace in test.traces %} {% endfor %}
      file line
      ‎{{ trace.filepath }} {{ trace.line }}
    • {% endfor %}
  • {% endfor %}
{% endif %}

Indirect Coverage ({{ req.test_coverage_info.indirect_coverage | length }})

{% if req.test_coverage_info.indirect_coverage | length > 0 %}
    {% for coverage in req.test_coverage_info.indirect_coverage %}
  • Covered ID: {{ self::break_id(id=coverage.covered_id) }}

      {% for test_run in coverage.test_runs %}
    • ‎{{ test_run.name }}
      {{ test_run.date | date(format="%Y-%m-%d %H:%M:%S", timezone="Europe/Berlin") }}

        {% for test in test_run.tests %}
      • {% if test.passed %}passed{% else %}failed{% endif %} ‎{{ test.name }}

        {% for trace in test.traces %} {% endfor %}
        file line
        ‎{{ trace.filepath }} {{ trace.line }}
      • {% endfor %}
    • {% endfor %}
  • {% endfor %}
{% endif %}

Verified in Reviews ({{ req.verified_info | length }})

{% if req.verified_info | length > 0 %} {% for info in req.verified_info %} {% endfor %}
review-name review-date comment
{{ info.review_name }} {{ info.review_date }} {{ info.comment }}
{% endif %}
{% endfor %}

Tests

Overview

{% for test_run in tests.test_runs %}

‎{{ test_run.name }}
{{ test_run.date | date(format="%Y-%m-%d %H:%M:%S", timezone="Europe/Berlin") }}

{% if test_run.overview.failed_cnt > 0 or test_run.overview.ran_cnt != test_run.overview.test_cnt %} failed {% elif test_run.overview.skipped_cnt == test_run.overview.test_cnt %} skipped {% elif test_run.overview.passed_cnt == test_run.overview.test_cnt %} passed {% else %} partial-passed {% endif %}

Overview

  • Existing Tests: {{ test_run.overview.test_cnt }}

  • Run tests: {{ test_run.overview.ran_cnt }} ({{ test_run.overview.ran_ratio * 100 | round(precision = 2) }}%)

  • Passed tests: {{ test_run.overview.passed_cnt }} ({{ test_run.overview.passed_ratio * 100 | round(precision = 2) }}%)

  • Failed tests: {{ test_run.overview.failed_cnt }} ({{ test_run.overview.failed_ratio * 100 | round(precision = 2) }}%)

  • Skipped tests: {{ test_run.overview.skipped_cnt }} ({{ test_run.overview.skipped_ratio * 100 | round(precision = 2) }}%)

{% if test_run.rendered_data %}
{{ test_run.rendered_data | safe }}
{% endif %}

Tests

{% for test in test_run.tests %}

‎{{ test.name }}

{% if test.state == 'Passed'%} passed {% elif 'Skipped' in test.state %} skipped {% else %} failed {% endif %}

File: {{ test.filepath }}
Line: {{ test.line }}

Covers {{ test.covers | length }} requirement{% if test.covers | length != 1 %}s{% endif %}
{% endfor %}
Logs during test run...

{{ test_run.logs }}

{% endfor %}

Reviews ({{ reviews | length }})

{% for review in reviews %}

{{ review.name }}

{{ review.date }}

Reviewer: {{ review.reviewer }}

{{ review.comment }}

Verified Requirements ({{ review.requirements | length }})

{% if review.requirements | length > 0 %} {% endif %}
{% endfor %}