View all services
Talk to QA Advisor
Browse the Knowledge Hub211 resources
/Tools Library/TestRail
Tools Library · Review and guide

TestRail review: pricing, alternatives and setup

TestRail is a standalone test case management tool from Gurock, part of Idera’s Sembi portfolio of software quality brands. Teams write and organise test cases, group them into runs, plans and milestones, record manual and automated results, and report on coverage and progress. It runs as a cloud service or on your own servers, and connects to Jira and CI pipelines rather than living inside an issue tracker.

QAble has evaluated this tool and works alongside it. The factual sections are complete; our view is bounded to what we have actually seen rather than a long-term verdict.

last reviewed
13 October 2026
version covered
TestRail 10 (10.x releases, 2026)
licence
Commercial

Reviewed by Viral Patel

Co-Founder, QAbleLast reviewed 13 October 2026

At a glance

TestRail at a glance

Official site
Vendor
Gurock / Sembi
Category
Test management
Licence
Commercial
Platforms
Cloud, Self-hosted
Integrates with
Jira, Jenkins, Selenium, Azure DevOps
First released
2010
Version reviewed
TestRail 10 (10.x releases, 2026)

Verdict

Our verdict on TestRail

Strengths

  • A clear model of cases, runs, plans and milestones that manual testers pick up quickly
  • Built-in reports on progress, coverage and defects without building Jira dashboards
  • The TestRail CLI uploads JUnit, Robot Framework and Cucumber results with one command
  • Cloud or on-premises, with on-premises available on Professional and Enterprise
  • Testers do not need Jira licences to write and run tests

Weaknesses

  • No free plan; every user is a paid seat after the 30-day trial
  • Links to Jira requirements and defects are an integration, not shared data
  • REST API rate limits on Cloud vary by plan, from 100 to 300 requests a minute
  • Versioning, approvals, SSO and audit logs are Enterprise-only

Our take

TestRail suits teams that want test management outside Jira: testers who do not all hold Jira licences, organisations with several trackers, or QA functions that want their own structure for suites, runs and reports. Its strengths are a clear case-and-run model, reporting that QA leads can use without building dashboards, and a mature API and CLI for pushing automated results. QAble has evaluated it rather than maintained a long-running instance, so treat this as a bounded take. The cost is a boundary: requirements and defects live in Jira, tests live in TestRail, and the link between them is an integration that needs care. The 10.x series improves that for Jira Cloud with Jira Issue Connect, and adds AI features that admins should review, since from 10.1 they are on by default.

We have evaluated this tool rather than maintained a long-running suite on it, so this is a bounded view rather than a long-term verdict. The rest of this page is factual.

How it works

What is TestRail and how does it work?

Cases are definitions, tests are instances

The core distinction in TestRail is between a test case and a test. A case is the reusable definition in the repository, with steps, expected results and custom fields. When you create a test run, TestRail creates a test for each case included, and results are recorded against those tests. The same case can therefore appear in many runs, one per build, release or configuration, each with its own status history. Most of TestRail’s behaviour, from reporting to the API, follows from this: the API’s add_result_for_case takes a run and a case, because the run is what turns a definition into something with a result.

Projects, suites and sections

Each project uses one of three repository types. Single repository keeps all cases in one tree of sections and subsections, and is the default for new projects. Single repository with baselines lets you branch copies of the case set for parallel product versions; TestRail’s own guidance is to use it only when several major versions must be maintained in parallel for a long time. Multiple test suites splits cases into separate suites, with the limitation that one run can only contain cases from one suite. Moving from a single repository to another type is easier than moving back, so the choice deserves thought at the start.

Plans, configurations and milestones

A test plan groups several runs, for example one per configuration such as browser or operating system, so a release can be tested across a matrix and reported as one unit. Milestones represent releases or sprints and collect runs and plans for progress reporting. Results carry a status: Passed, Blocked, Untested, Retest and Failed by default, with custom statuses available. Reports then roll up results by run, plan, milestone or project. This structure is what makes TestRail useful to QA leads, and also what makes it heavier than a lightweight checklist when a team only needs to track automated results.

Automation feeds in from outside

TestRail does not run tests. Automated suites run in your CI, and their results are pushed in, either through the REST API or the TestRail CLI, trcli, a Python tool that parses JUnit XML, Robot Framework and Cucumber reports, creates a run and uploads results. The CLI matches results to cases in one of two ways: code-first, where it creates and maintains cases from the test names and stores an automation ID, or specification-first, where you put an existing case ID such as C123 into the test name or a test property. The choice decides who owns the case list, the code or the testers.

Strengths

What it does well

Reporting for QA leads

Built-in reports cover run and plan progress, coverage of references such as requirements, defect summaries and comparisons across runs. For a QA lead who needs to answer what has been tested for this release, that is faster than assembling Jira filters and dashboards.

Jira Issue Connect

From TestRail 10.0, released to the default track on 9 February 2026, Jira Issue Connect brings live Jira fields such as status, assignee and fix version into TestRail for linked references and defects, and feeds that data into reports. It is available for Jira Cloud integrations only.

A command-line uploader for CI

trcli parses JUnit XML from Playwright, Cypress, JUnit, TestNG, pytest and others, plus Robot Framework and Cucumber reports, creates or updates the run, and uploads results in batches. It also manages cases, sections, runs and milestones from the command line, which removes most custom API scripting.

Bulk results through the REST API

The API covers projects, cases, runs, plans, results and more. add_results_for_cases posts many results to one run in a single request, keyed by case ID, which is what TestRail recommends on Cloud to stay inside rate limits. TestRail Cloud answers with HTTP 429 when the limit is exceeded.

Enterprise controls for regulated teams

The Enterprise plan adds test case versioning with review and approval, parameterised tests with datasets, audit logs, project-level administration, SSO through SAML, OAuth or OIDC, multi-factor authentication, configurable backups and cross-project reporting. Those are the features audit-driven organisations usually ask for first.

AI-assisted authoring and prioritisation

The 10.x releases add AI features, including test script generation in beta from 10.2 and AI test prioritisation from 10.5. They are enabled by default from 10.1, and administrators can switch them off or restrict them by role and project in the AI Hub, which is worth reviewing before rollout.

Pricing

TestRail pricing and licensing

TestRail is commercial and priced per user, with three plans. Essentials is for up to five users on Cloud only; Professional adds advanced reporting, deeper customisation, role-based access and on-premises deployment; Enterprise adds security, compliance and scale features. Essentials and Professional can be billed monthly or annually, Enterprise annually. Every plan has a 30-day free trial without a credit card, and there is no permanently free plan.

  • List prices on testrail.com on 13 October 2026, per user per month billed annually: Essentials $22, Professional $38, Enterprise $78.
  • Essentials: Cloud only, up to five users, REST API at 100 requests a minute. Professional: no user cap, 180 requests a minute. Enterprise: 300 requests a minute and 500 GB storage.
  • On-premises (Server): available on Professional and Enterprise, with a minimum of 10 seats and a 12-month contract.
  • Enterprise-only: SSO, MFA, audit logs, case versioning and approvals, datasets, backups with restore, cross-project reporting and priority support.
  • How cost scales: linearly with named users. Everyone who writes or runs tests needs a seat, so mixed teams of developers and testers add up quickly.
  • Hidden costs: integration upkeep with Jira and CI, and on-premises hosting, upgrades and backups if you self-host.

Checked against the vendor’s own pages on 13 October 2026. Pricing changes; confirm on the official site before buying.

Getting started

Getting started with TestRail

Setup, step by step

  1. Start a 30-day Cloud trial and create a project with a single repository.
  2. Enable the API under Administration, then create an API key in your user settings.
  3. Write or import a first set of cases into sections that mirror product areas.
  4. Create a run, execute a few cases by hand and look at the run report.
  5. Install trcli and upload a JUnit XML report from your automated suite into a new run.

Install

pip install trcli
# TestRail recommends Python 3.10 or newer
trcli --help

A first example

# Upload a JUnit XML report as a new TestRail run.
# -y accepts prompts to create missing cases or sections (needed in CI).
trcli -y \
  -h https://yourcompany.testrail.io \
  --project "Checkout" \
  -u "$TESTRAIL_USER" \
  -k "$TESTRAIL_API_KEY" \
  parse_junit \
  -f "reports/junit.xml" \
  --title "Nightly regression $(date +%F)" \
  --case-matcher auto   # code-first: match on automation_id

What trips people up first

Duplicate cases after the first few uploads. With the default code-first matching, trcli identifies cases by an automation ID built from the test’s class and name, and creates a new case when it sees one it does not know. Rename a test, move it to another class, or parametrise it differently, and TestRail gains a new case while the old one stops receiving results. Decide early whether code or testers own the case list. If testers own it, switch to specification-first matching, put the case ID in a test property or name, and let trcli report only against existing cases.

In practice

Using TestRail in practice

Structuring the repository before it grows

Start with a single repository per product and sections that mirror product areas, not teams or sprints, because areas outlive both. Keep cases short and outcome-focused; long step lists rot fastest. Use the references field for Jira issue keys so coverage reports work, and agree a small set of custom fields before people invent their own. Use milestones for releases and test plans for configuration matrices, rather than copying runs by hand. Resist baselines unless you genuinely maintain several major versions for a long time, which is TestRail’s own advice, and avoid the multiple-suites type unless suites are truly independent, since a run cannot span suites.

Mapping automated tests to existing cases

Where testers already own a case list, map automated tests to it explicitly. trcli’s property matcher reads a test_id property from the JUnit XML, and pytest can write one with its built-in record_property fixture, so a test declares which case it covers without changing its name. The name matcher works too, with the case ID in brackets in the test name, which suits frameworks that cannot set properties. One automated test can cover several cases, all of which get the same status. Run with --case-matcher property and TestRail reports against the cases testers already know.

# tests/test_checkout.py: tag each test with the TestRail case it covers
def test_guest_can_pay_by_card(record_property, checkout):
    # Written to the JUnit XML as <property name="test_id" value="C1042"/>
    record_property("test_id", "C1042")
    order = checkout.pay_by_card("4242 4242 4242 4242")
    assert order.status == "CONFIRMED"


def test_declined_card_shows_error(record_property, checkout):
    record_property("test_id", "C1043")
    result = checkout.pay_by_card("4000 0000 0000 0002")
    assert result.error == "Your card was declined"

# Run: pytest --junitxml=reports/junit.xml
# Upload: trcli ... parse_junit -f reports/junit.xml --case-matcher property

Pushing results from GitHub Actions

The pipeline runs tests as usual, keeps the JUnit report even when tests fail, and then uploads it. Run the upload step with if: always(), or a failing build will never reach TestRail, which is exactly when you want the results. Use a dedicated TestRail API user for CI so audit history is clear, store its key as a secret, and title runs with the branch and run number so they can be traced back. For pull requests, consider not uploading at all, or uploading to a separate milestone, since hundreds of short-lived runs clutter reports.

# .github/workflows/regression.yml
name: regression
on:
  push:
    branches: [main]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-python@v7
        with:
          python-version: '3.12'
      - run: pip install -r requirements.txt trcli
      - run: pytest --junitxml=reports/junit.xml
      - name: Upload results to TestRail
        if: always()   # upload failures too
        run: >
          trcli -y -h https://yourcompany.testrail.io --project "Checkout"
          -u "${{ secrets.TESTRAIL_USER }}" -k "${{ secrets.TESTRAIL_API_KEY }}"
          parse_junit -f reports/junit.xml --case-matcher property
          --title "main #${{ github.run_number }}"

Using the API directly

For tools trcli does not cover, the REST API is simple: HTTP basic authentication with a username and API key, JSON bodies, and endpoints under index.php?/api/v2/. Post results in bulk with add_results_for_cases rather than one call per result, because Cloud rate limits range from 100 requests a minute on Essentials to 300 on Enterprise, and TestRail returns 429 when you exceed them. Every case you post to must already be part of the run, so create the run with those case IDs, or with all cases included, first. Status IDs come from get_statuses; the defaults are 1 Passed, 2 Blocked, 4 Retest and 5 Failed.

# Add several results to run 381 in one request, keyed by case ID
curl -s -u "$TESTRAIL_USER:$TESTRAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST "https://yourcompany.testrail.io/index.php?/api/v2/add_results_for_cases/381" \
  -d '{
    "results": [
      { "case_id": 1042, "status_id": 1, "elapsed": "12s" },
      { "case_id": 1043, "status_id": 5,
        "comment": "Declined-card message missing", "defects": "PAY-217" }
    ]
  }'

Keeping TestRail and Jira in step

Decide which system owns what. Requirements and defects usually stay in Jira; TestRail holds cases, runs and results, and links to Jira through references on cases and defect IDs on results. On Jira Cloud, Jira Issue Connect in 10.x shows live Jira status, assignee and fix version inside TestRail and in reports, which reduces stale links. On Jira Data Center, plan a periodic check that referenced issues still exist and are still open where reports assume they are. Either way, push defects from TestRail into Jira rather than creating them twice, and keep the reference field mandatory on cases that cover a requirement, or coverage reports will look better than reality.

Pitfalls

Common pitfalls

Renamed tests creating duplicate cases

Why it happens: In code-first mode trcli matches on an automation ID derived from the test name and class, so renaming or moving a test makes TestRail create a new case and orphan the old one.

The fix: Update the automation_id on the existing case when renaming, or switch to property or name matching with explicit case IDs so names can change freely.

Results rejected because the case is not in the run

Why it happens: add_results_for_cases requires every referenced test to belong to the run. A run created with a selected set of cases rejects results for any other case with a 400 error.

The fix: Create the run with include_all, or with the exact case IDs the suite covers, or let trcli create the run from the report.

Hitting 429 Too Many Requests on Cloud

Why it happens: Posting one result per call, or polling the API from many CI jobs, exceeds the plan’s rate limit, which is 100 requests a minute on Essentials.

The fix: Use bulk endpoints such as add_results_for_cases, let trcli batch uploads, retry with backoff on 429, and spread uploads from parallel jobs.

Choosing multiple suites, then needing one run

Why it happens: In the multiple test suites project type, a run can contain cases from one suite only, so an end-to-end release run across product areas is impossible.

The fix: Use a single repository with sections for new projects, and group runs into a test plan if you already have several suites.

Failed builds never reaching TestRail

Why it happens: The upload step sits after the test step, and CI skips later steps when tests fail, so TestRail only ever sees green runs.

The fix: Run the upload with if: always() in GitHub Actions, or the equivalent in your CI, and fail the job on the test step’s result instead.

AI features switched on before anyone reviewed them

Why it happens: From TestRail 10.1, AI features are enabled by default for accounts, which may conflict with data policies in regulated organisations.

The fix: Review them in the AI Hub before rollout, and disable them or restrict them by role and project as your policy requires.

Compared

TestRail alternatives compared

ToolWhere it livesHostingPricing modelFree option
TestRailStandalone app, integrates with JiraCloud, or on-premises from 10 seatsPer user: Essentials, Professional, Enterprise30-day trial, no free plan
XrayInside Jira, as a Marketplace appJira Cloud or Data CenterLicence tier must match Jira user tierTrial through the Atlassian Marketplace
ZephyrInside Jira, from SmartBearJira Cloud, with an on-premises optionEssential, Standard and Advanced editionsFree trial
QaseStandalone app with Jira integrationCloud; dedicated VPC on EnterprisePer seat, cheaper collaborator seatsFree plan with limits

Head-to-head comparisons

TestRail alternatives

FAQ

Frequently asked questions

What is TestRail?

TestRail is a standalone test case management tool from Gurock, part of Idera’s Sembi portfolio of software quality brands. Teams write and organise test cases, group them into runs, plans and milestones, record manual and automated results, and report on coverage and progress. It runs as a cloud service or on your own servers, and connects to Jira and CI pipelines rather than living inside an issue tracker.

What are the best TestRail alternatives?

The alternatives most often weighed against TestRail are Xray, Zephyr and Qase. The comparison on this page sets them side by side on where it lives, hosting, pricing model and free option, and the verdict above says where TestRail is the wrong choice and which of them to pick instead.

Is TestRail free?

No. TestRail has no permanently free plan. Every plan, Essentials, Professional and Enterprise, includes a 30-day free trial without a credit card, after which each user is a paid seat. On 13 October 2026 the list prices, per user per month billed annually, were $22 for Essentials, $38 for Professional and $78 for Enterprise.

TestRail vs Xray: which should I choose?

Choose Xray if everyone already works in Jira and you want tests to be Jira issues, with traceability inside one tool; its licence must match your Jira user tier. Choose TestRail if testers do not all have Jira licences, you use more than one tracker, or you want test management and reporting separate from Jira. TestRail’s link to Jira is an integration, while Xray’s is native.

Can TestRail run automated tests?

No. TestRail stores cases and results; your CI runs the tests. Automated results are pushed in through the REST API or the TestRail CLI, trcli, which parses JUnit XML, Robot Framework and Cucumber reports and uploads them as a run. That keeps TestRail independent of any one framework, but it means the upload step has to be maintained in each pipeline.

Can TestRail be self-hosted?

Yes, on the Professional and Enterprise plans. On-premises deployment, called TestRail Server, needs at least 10 seats and a 12-month contract, and TestRail also publishes a Docker image for it. Essentials is Cloud only. Self-hosting gives you control of data location, but upgrades, backups and availability become your responsibility.

How do I connect TestRail to Jira?

Configure a Jira integration in TestRail’s administration settings, then use references on cases for requirements and the defects field on results for bugs. On Jira Cloud, TestRail 10 adds Jira Issue Connect, which shows live Jira status, assignee and fix version inside TestRail and includes Jira data in reports. Defects can be pushed from TestRail results into Jira rather than created twice.

What changed in TestRail 10?

TestRail 10.0 reached the default release track on 9 February 2026, adding Jira Issue Connect for Jira Cloud and moving the platform to PHP 8.3. Later 10.x releases added AI test script generation in beta, AI test prioritisation, Dark Mode and a High Contrast mode, and performance work for very large repositories. AI features are on by default from 10.1.

Alternatives

TestRail alternatives worth weighing

Resources

Where to go next

Ready

Picking the wrong tool costs more than picking late.

QAble advises on toolchain decisions and then implements them, with engineers who have run these tools on real delivery. Start with a free QA audit.

Talk to QA Advisor