All eazyBI for Jira eazyBI for Confluence Private eazyBI

Zephyr Squad requirement coverage matrix
eazyBI for Jira

Overview

The Zephyr Squad requirement coverage matrix report requires data imported from the Zephyr Squad Test Management for Jira app.

Zephyr Requirement Coverage report represents an overview of requirements, their development, and testing status.

Requirement issues are imported in Jira Data Center (and Server) versions by default but are unavailable on Jira Cloud. This example includes additional steps to build a similar report also on Jira Cloud.

How to build report

On report rows, set Zephyr Squad Requirement dimension. Note that the Zephyr Squad Requirement dimension has only those requirement issues with at least one test related to it.

In the case of Jira Cloud, the Zephyr Squad Requirement dimension is not available by default. However, importing issue links can create a similar dimension Zephyr Squad Linked Requirement. The advanced settings for the requirement issue dimension might look like below:

[jira.customfield_zephyrreq]
name = "Zephyr Squad Linked Requirement"
inward_link = "is tested by"
outward_link = "tests"
issue_type = ["New Feature","Improvement","Task"] #list requirement issues types
multiple_values = true
dimension = true

On report pages, set filtering criteria for the report – dimensions Fix Version and Project. For the Fix Version, select hierarchy By status so you can easily check on unreleased versions. In the report, select Unresolved versions as the default value.

On report columns, set several default measures and properties describing the execution of each requirement issue.

  • Zephyr Squad Requirement status is requirement property and shows the current development status of requirement issues.
    In the case of Jira Cloud, this property is not available by default, and you should create it. In Measures, define a new calculated measure that would look up issue matching Zephyr Squad Requiremen on report rows and look up for the status of that issue. The expression for the calculated measure would look like this:

    [Status].[Status].getMemberNameByKey(
      [Zephyr Squad Linked Requirement].CurrentHierarchyMember.get('Status ID')
    )
  • Create new calculated measure Tests linked to requirement to see related test count regardless of the selected Fix version or Project for filtering tests execution results.

    -- annotations.group=Zephyr Squad User defined
    ([Measures].[Zephyr Squad Tests created],
    --ignore dimensions related to test cycles
    [Project].CurrentHierarchy.DefaultMember,
    [Fix Version].CurrentHierarchy.DefaultMember,
    [Time].CurrentHierarchy.DefaultMember,
    [Zephyr Squad Test Cycle].CurrentHierarchy.DefaultMember,
    [Zephyr Squad Test Executed by].CurrentHierarchy.DefaultMember,
    [Zephyr Squad Test Status].CurrentHierarchy.DefaultMember)
  • Zephyr Squad Test Execution count is Zephyr-specific measure and shows a count of all executions related to each requirement. Click on the measure header and choose option Drill into → Zephyr Squad → Zephyr Squad Tests Status to see the execution count split by results. Here are more details on how to drill into one measure by some dimension values.
    If you like, you can apply conditional cell formatting for each status to improve report readability. For example, click on the column PASS header and add cell formatting to show green background in case at least one execution has passed. In the formatting screen, choose option Range, enter Min value 1, and set the background color to green.
  • Create another calculated measure Unresolved defect list see a list of defect keys found during testing. The list contains only unresolved defects (issues with no resolution date) to get an instant view of known obstacles to complete the requirement.  The link to the defect is clickable, so you can open issues directly in Jira.
    Update the code YOUR_JIRA_DOMAIN to specify the path (URL) to your Jira domain. And set measure formatting to Markdown to represent links correctly.

    -- annotations.group=Zephyr Squad User defined
    Generate(
      --filter set of unresolved defects
      Filter(
        Descendants([Zephyr Squad Defect].CurrentMember, [Zephyr Squad Defect].[Defect]),
        IsEmpty([Zephyr Squad Defect].CurrentMember.Get('Resolved at')) AND
        [Measures].[Zephyr Squad Tests defect count] > 0
      ),
      --generate a list of clicable defect keys
      "[" ||
      [Zephyr Squad Defect].CurrentMember.Name ||
      "]" ||
      --update the YOUR_JIRA_DOMAIN with right URL for you
      "(http://YOUR_JIRA_DOMAIN/browse/" ||
      [Zephyr Squad Defect].CurrentMember.Name || 
      ")",
      ', '
    )
    
    --set measure Formatting to Text -> Markdown

If you would like to see the requirement split by individual tests on report rows, click on the requirement issue key and Drill across → Issue → Issue

Report definition for Jira Data Center

This definition does not work for Jira Cloud. The definition could be used for Jira Data Center or Server only.

If you have created the issue link dimension "Zephyr Squad Linked Requirement", then you should set the dimension "Zephyr Squad Linked Requirement" on report rows for report to work.

You can copy and import report definition into your eazyBI account to get this report together with all calculated measures. 

Report definition
{
  "cube_name": "Issues",
  "cube_reports": [ {
     "name": "Zephyr Squad requirement coverage matrix",
     "result_view": "table",
     "definition": {"columns":{"dimensions":[{"name":"Measures","selected_set":["[Measures].[Zephyr Squad Requirement status]","[Measures].[Tests linked to requirement]","[Measures].[Zephyr Squad Test Execution count]","[Measures].[Unresolved defect list]"],"members":[{"depth":0,"full_name":"[Measures].[Tests linked to requirement]","format_string":"#,##0","report_specific":true,"name":"Tests linked to requirement","calculated":true,"id":"[Measures].[Tests linked to requirement]"},{"depth":0,"name":"Zephyr Squad Test Execution count","full_name":"[Measures].[Zephyr Squad Test Execution count]","format_string":"#,##0","annotations":{"group":"Zephyr Squad","predefined":"true"},"calculated":true,"drilled_into_dimension":"Zephyr Squad Test Status"},{"depth":0,"full_name":"[Measures].[Unresolved defect list]","format_string":"MarkdownFormatter","report_specific":true,"name":"Unresolved defect list","calculated":true}]},{"name":"Zephyr Squad Test Status","selected_set":["[Zephyr Squad Test Status].[Status].Members"],"members":[],"bookmarked_members":[]}]},"rows":{"dimensions":[{"name":"Zephyr Squad Requirement","selected_set":["[Zephyr Squad Requirement].[Requirement].Members"],"members":[],"bookmarked_members":[]}],"nonempty_crossjoin":true},"pages":{"dimensions":[{"name":"Project","selected_set":["[Project].[All Projects]"],"members":[{"depth":0,"name":"All Projects","full_name":"[Project].[All Projects]","drillable":true,"type":"all"}],"bookmarked_members":[],"current_page_members":["[Project].[All Projects]"]},{"name":"Fix Version","selected_set":["[Fix Version].DefaultMember"],"members":[{"depth":0,"name":"All Fix Versions","full_name":"[Fix Version].[All Fix Versions]","drillable":true,"type":"all","expanded":true,"drilled_into":false},{"depth":1,"name":"ZB Kanban","full_name":"[Fix Version].[ZB Kanban]","drillable":true,"key":"ZK","expanded":true,"drilled_into":false,"parent_full_name":"[Fix Version].[All Fix Versions]"},{"depth":2,"name":"Unreleased","full_name":"[Fix Version].[ZB Kanban].[Unreleased]","drillable":true,"parent_full_name":"[Fix Version].[ZB Kanban]"}],"bookmarked_members":[],"current_page_members":["[Fix Version].[ZB Kanban].[Unreleased]"]}]},"options":{},"view":{"current":"table","maximized":false,"table":{"show_key":["Zephyr Squad Requirement"],"row_dimension_headers":{"Zephyr Squad Requirement":true},"cell_formatting":{"[Zephyr Squad Test Status].[UNEXECUTED]":{"type":"range","rules":[{"min":"1","background_color":"#B3BAC5"}]},"[Zephyr Squad Test Status].[PASS]":{"type":"range","rules":[{"background_color":"#34AD70","min":"1"}]},"[Zephyr Squad Test Status].[FAIL]":{"type":"range","rules":[{"min":"1","background_color":"#D4153B"}]},"[Zephyr Squad Test Status].[WIP]":{"type":"range","rules":[{"min":"1","background_color":"#FFD04D"}]},"[Zephyr Squad Test Status].[BLOCKED]":{"type":"range","rules":[{"min":"1","background_color":"#376BB7"}]}}}},"calculated_members":[]}
  } ],
  "calculated_members": [{"dimension":"Measures","name":"Zephyr Squad Requirement status","format_string":"","formula":"[Status].[Status].getMemberNameByKey(\n  [Zephyr Squad Requirement].CurrentHierarchyMember.get('Status ID')\n)"},{"dimension":"Measures","name":"Zephyr Squad Test Execution count","format_string":"","formula":"[Measures].[Zephyr Squad Tests scheduled] + [Measures].[Zephyr Squad Tests executed]"},{"name":"Unresolved defect list","dimension":"Measures","formula":"-- annotations.group=Zephyr Squad User defined\nGenerate(\n  --filter set of unresolved defects\n  Filter(\n    Descendants([Zephyr Squad Defect].CurrentMember, [Zephyr Squad Defect].[Defect]),\n    IsEmpty([Zephyr Squad Defect].CurrentMember.Get('Resolved at')) AND\n    [Measures].[Zephyr Squad Tests defect count] \u003e 0\n  ),\n  --generate a list of clicable defect keys\n  \"[\" ||\n  [Zephyr Squad Defect].CurrentMember.Name ||\n  \"]\" ||\n  --update the YOUR_JIRA_DOMAIN with right URL for you\n  \"(http://YOUR_JIRA_DOMAIN/browse/\" ||\n  [Zephyr Squad Defect].CurrentMember.Name || \n  \")\",\n  ', '\n)\n\n--set measure Formatting to Text -\u003e Markdown","format_string":"MarkdownFormatter"},{"name":"Tests linked to requirement","dimension":"Measures","formula":"-- annotations.group=Zephyr Squad User defined\n([Measures].[Zephyr Squad Tests created],\n--ignore dimensions related to test cycles\n[Project].CurrentHierarchy.DefaultMember,\n[Fix Version].CurrentHierarchy.DefaultMember,\n[Time].CurrentHierarchy.DefaultMember,\n[Zephyr Squad Test Cycle].CurrentHierarchy.DefaultMember,\n[Zephyr Squad Test Executed by].CurrentHierarchy.DefaultMember,\n[Zephyr Squad Test Status].CurrentHierarchy.DefaultMember)","format_string":""}]
}

See also