Browse the Knowledge Hub211 resources
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
At a glance
TestRail at a glance
- 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
- Start a 30-day Cloud trial and create a project with a single repository.
- Enable the API under Administration, then create an API key in your user settings.
- Write or import a first set of cases into sections that mirror product areas.
- Create a run, execute a few cases by hand and look at the run report.
- 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 --helpA 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_idWhat 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 propertyPushing 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
| Tool | Where it lives | Hosting | Pricing model | Free option |
|---|---|---|---|---|
| TestRail | Standalone app, integrates with Jira | Cloud, or on-premises from 10 seats | Per user: Essentials, Professional, Enterprise | 30-day trial, no free plan |
| Xray | Inside Jira, as a Marketplace app | Jira Cloud or Data Center | Licence tier must match Jira user tier | Trial through the Atlassian Marketplace |
| Zephyr | Inside Jira, from SmartBear | Jira Cloud, with an on-premises option | Essential, Standard and Advanced editions | Free trial |
| Qase | Standalone app with Jira integration | Cloud; dedicated VPC on Enterprise | Per seat, cheaper collaborator seats | Free plan with limits |
Head-to-head comparisons
TestRail alternativesFAQ
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
Xray
Jira-native test management where tests, executions and plans are Jira issues with full traceability.
Zephyr
SmartBear’s Jira test management app, renamed from Zephyr Scale to Zephyr in 2025, keeping test cases, cycles and plans in its own library linked to Jira.
Qase
Modern test management platform with a generous free tier and a strong API for automation reporting.
Resources
Where to go next
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.