Back to All Articles
Fundamentals

Test Management Tools — JIRA, TestRail & Zephyr Guide

Honnesh Muppala May 5, 2026 14 min read

What is a Test Management System (TMS)?

A Test Management System (TMS) is software specifically designed to store, organise, execute, and report on test cases. As QA teams grow beyond a handful of people and products beyond a few features, spreadsheets — the default first-pass tool — fail in predictable ways.

Why spreadsheets fail at scale:

What a TMS provides: version-controlled test cases, execution history linked to builds, traceability from requirements to test cases to bugs, configurable reporting dashboards, and audit trails for regulated environments.

TMS Workflow — Architecture Diagram

How test artefacts flow from requirements through execution to reporting:

Requirements (JIRA Stories)
Test Cases (TMS)
Test Execution
Bug Reports (JIRA)
Traceability Matrix
Test Report

In a well-configured TMS workflow, every test case is linked to one or more JIRA stories (the requirements it verifies). Every test execution result is recorded against a specific build and sprint. Every bug discovered during execution is linked to the test case that found it. The traceability matrix is a live view of this web of relationships — not a document you create manually, but a report the TMS generates from the structured data.

JIRA Basics for QA Engineers

JIRA is the dominant issue tracking and project management tool in software development. Understanding its structure is fundamental for QA engineers, even if you use a separate TMS for test cases.

JIRA Issue Types

JIRA Project Structure

JQL for QA

JIRA Query Language (JQL) is essential for QA engineers who need to slice data from the project. Useful QA queries:

-- All open bugs assigned to me in the current sprint
assignee = currentUser() AND issuetype = Bug AND status != Done AND sprint in openSprints()

-- All P1 bugs in this project regardless of status
project = MYPROJECT AND issuetype = Bug AND priority = Highest

-- All bugs found in the last sprint that are still open
project = MYPROJECT AND issuetype = Bug AND sprint = "Sprint 12" AND status != Done

-- All stories with no acceptance criteria (requires custom field)
project = MYPROJECT AND issuetype = Story AND "Acceptance Criteria" is EMPTY

-- Bugs assigned to QA for verification
project = MYPROJECT AND issuetype = Bug AND status = "Ready for QA Verification"

Zephyr Scale — JIRA Plugin for Test Management

Zephyr Scale (formerly Zephyr for JIRA, now a SmartBear product) is the most widely used JIRA plugin for test management. It adds a full test management layer directly within JIRA, so test cases, test cycles, and execution results live in the same system as requirements and bugs — no context switching to a separate tool.

Zephyr Scale core concepts:

Creating Test Cases in Zephyr Scale

Well-structured test cases in Zephyr follow a consistent format that makes them executable by any QA engineer — not just the person who wrote them:

Test Summary: Concise title in the format "[Feature] — [Scenario]". Example: "Login — Valid credentials redirect to dashboard." Not: "Test login."

Preconditions: The starting state required before executing the test. "User account exists with email: testuser@example.com and password: Test1234. User is not currently logged in. Browser is Chrome 120 in incognito mode."

Test Steps (Step / Action / Expected Result format):

Step 1 | Navigate to https://staging.example.com/login
       | The login page loads with email and password fields visible

Step 2 | Enter "testuser@example.com" in the Email field
       | The email field contains the entered value

Step 3 | Enter "Test1234" in the Password field
       | The password field shows masked characters

Step 4 | Click the "Log In" button
       | A loading indicator appears briefly

Step 5 | Wait for page to load
       | User is redirected to the dashboard (/dashboard)
       | The header displays "Welcome back, Test User"
       | The navigation shows all authenticated menu items

Priority: High/Medium/Low — reflecting the business importance of the scenario, not the estimated execution time.

Labels: "regression", "smoke", "authentication", "web" — enables filtering when building test cycles.

Automation status: "Not automated", "Automated", "Cannot be automated". This field drives the automation backlog — filter by "Not automated" + "High priority" to identify automation candidates.

Test Cycles in Zephyr Scale

Test cycles are where test cases are assembled into an executable unit for a specific purpose — a sprint, a release, a regression run, or a UAT session. Cycle workflow:

  1. Create the cycle: Name it clearly ("Sprint 13 Regression — v2.4.0"), set the sprint association, set the environment (Staging), and set the owner.
  2. Add test cases: Filter the test repository by label, component, priority, or folder to add the relevant cases. For sprint testing, add all cases linked to the sprint's stories. For regression, add all cases labelled "regression."
  3. Assign testers: Bulk-assign cases to team members. Zephyr tracks who executed each case.
  4. Execute: As QA runs each test, update the result in real time: Pass, Fail, Blocked. If Fail, link the bug created in JIRA directly from the execution result.
  5. Clone cycles: For the next sprint's regression, clone the previous cycle and update it — add new test cases, remove obsolete ones. This preserves history and reduces setup time.

Bulk execution is available for cases that are trivially passing (environment setup validations, for example) — mark multiple cases as passed simultaneously rather than one-by-one to save time.

From Virtusa: We used Zephyr Scale (then Zephyr for JIRA Server) for all mobile test management. The feature that delivered the most value was the Traceability Report — a live view of which user stories had test cases, which did not, and which had open bugs. Before releases, I ran the traceability report to verify that every story in the release had at minimum one executed test case with a Pass result. Stories with no test cases were immediately escalated: either they needed test cases written and executed, or the story was out of scope and needed to be removed from the release. The report turned coverage from a gut feeling into a measured, defensible claim.

Xray — Alternative JIRA Plugin

Xray is Zephyr Scale's primary competitor in the JIRA plugin market. It takes a different philosophical approach: where Zephyr uses its own test case format, Xray treats tests as first-class JIRA issue types. This means test cases are searchable in JIRA's main issue search, appear in boards and backlogs alongside stories, and follow the same workflow configurations as other issue types.

Xray's key differentiators:

Choose Xray over Zephyr when your team uses BDD/Gherkin heavily, when you want tests to appear in the JIRA backlog alongside stories, or when Cucumber CI integration is a requirement rather than a nice-to-have.

TestRail — Standalone Test Management

TestRail (by Gurock, now part of Idera) is the most popular standalone test management tool — not a JIRA plugin, but a dedicated web application with its own data model and UI. This gives it independence from any project management tool while offering API integrations with JIRA, GitHub, Jenkins, and others.

TestRail's structure:

TestRail API

TestRail's REST API enables automated result pushing from CI pipelines. The most common use case is updating test results directly from pytest or JUnit after an automated test run, so that automated pass/fail results appear alongside manual results in the same TestRail run — giving a unified view of coverage.

The core API endpoint for updating a result:

POST https://yourorg.testrail.io/index.php?/api/v2/add_result_for_case/{run_id}/{case_id}

Headers:
  Content-Type: application/json
  Authorization: Basic base64(email:api_key)

Body:
{
  "status_id": 1,          // 1=Passed, 2=Blocked, 4=Retest, 5=Failed
  "comment": "Automated test passed in 2.3s",
  "elapsed": "2s",
  "version": "v2.4.0-build-347"
}

Status IDs: 1 = Passed, 2 = Blocked, 3 = Untested, 4 = Retest, 5 = Failed. Custom statuses can be added in TestRail's administration panel.

pytest Integration with TestRail using trcli

trcli is TestRail's official CLI tool for pushing test results from common formats (JUnit XML, pytest) into TestRail without custom API code:

# Install trcli
pip install trcli

# Run pytest and generate JUnit XML output
pytest tests/ --junitxml=test_results.xml

# Push results to TestRail
trcli -y \
  -h https://yourorg.testrail.io \
  --project "My Project" \
  -u user@example.com \
  -p YOUR_API_KEY \
  parse_junit \
  --suite-id 1 \
  --run-id 42 \
  -f test_results.xml

For mapping pytest test functions to specific TestRail case IDs, add the case ID as a marker in the test function:

import pytest

@pytest.mark.testrail(case_id=1234)
def test_login_valid_credentials(page):
    """TestRail Case C1234 — Login with valid credentials"""
    page.goto("/login")
    page.fill("#email", "user@example.com")
    page.fill("#password", "Test1234")
    page.click("#loginBtn")
    assert page.url == "https://staging.example.com/dashboard"

With this setup, every CI pipeline run automatically updates TestRail with the latest automated test results. Manual execution results sit alongside automated results in the same run, giving the team a single source of truth for overall coverage.

From Amazon: Device firmware test results at Amazon were pushed to TestRail via a custom Jenkins post-build step using the TestRail API. Every nightly build run updated the corresponding TestRail test run with pass/fail results and build metadata. This meant that at any point during the release cycle, a manager could open TestRail and see exactly how many test cases were passing, failing, or untested against the latest build — without waiting for a daily QA status email. Real-time visibility into test execution status is one of the highest-value process improvements a QA team can implement.

Traceability Matrix

A traceability matrix is a document (or report) that maps requirements to test cases to bugs. It answers three questions: Does every requirement have at least one test case? Have all test cases been executed? Are there requirements with open bugs?

Traceability matrix structure:

| Requirement (JIRA Story) | Test Cases (TMS IDs)    | Execution Status | Bugs       |
|--------------------------|------------------------|------------------|------------|
| AUTH-101: User Login     | T-201, T-202, T-203    | All Passed       | None       |
| AUTH-102: Password Reset | T-204, T-205           | T-204 Failed     | BUG-445    |
| AUTH-103: Session Mgmt   | T-206, T-207, T-208    | T-208 Blocked    | BUG-446    |
| AUTH-104: Account Lock   | T-209                  | Passed           | None       |
| AUTH-105: OAuth Login    | None                   | Not tested       | N/A        |

AUTH-105 with no test cases is the most actionable row in this matrix — it will be flagged in any pre-release review. The traceability matrix makes coverage gaps impossible to ignore.

How to build a traceability matrix: in Zephyr Scale, use the Traceability Report (auto-generated). In TestRail, use the Coverage Report per milestone. In a spreadsheet-based approach, maintain a manually-updated mapping document — but this is a last resort; TMS-generated reports are far more reliable.

Why it matters for audits: regulated industries (finance, healthcare, aerospace, medical devices) require documented evidence that every requirement has been tested. The traceability matrix is the primary artefact auditors examine. An incomplete matrix is a compliance failure.

Test Reporting in a TMS

A TMS generates several report types that provide different views of quality status:

TMS Tool Comparison

Dimension JIRA + Zephyr Scale JIRA + Xray TestRail qTest Azure Test Plans
Pricing model Per-user add-on to JIRA Per-user add-on to JIRA Standalone SaaS, per-user Enterprise pricing Included in Azure DevOps
JIRA integration Native (same JIRA instance) Native (same JIRA instance) Good (API + plugin) Good (API) Not applicable
REST API quality Good — SmartBear API Good — Xray API Excellent — well documented Good Good — Azure DevOps API
CI integration Via API or Zephyr CLI Native Cucumber sync trcli, API, JUnit XML API, JUnit XML Azure Pipelines native
BDD/Gherkin support Manual feature file link Excellent — native Cucumber sync Via API integration Good Moderate
Learning curve Medium — JIRA familiarity helps Medium — steeper for BDD config Low — clean, intuitive UI High — feature-rich but complex Low if team already uses Azure

Choosing the Right TMS — Decision Guide

The right TMS depends on your specific context. Key decision factors:

Best Practices for Test Management


Back to Blog
From Experience — Amazon: At Amazon's Device OS team, the bar for defect reports was exceptionally high. Every bug required the exact build number, reproduction rate (e.g. "3 out of 5 attempts"), full environment configuration, and a video wherever possible. It felt like overhead at first — but it meant any developer could pick up a ticket and reproduce the issue immediately without back-and-forth. During Alexa and Echo release cycles, this discipline directly reduced the triage loop from days to hours. A well-written bug report is not documentation overhead — it is the fastest path to a fix.