A pytest plugin for creating TestRail runs and adding results
Project description
This is a pytest plugin for creating/editing testplans or testruns based on pytest markers. The results of the collected tests will be updated against the testplan/testrun in TestRail.
Version 3.0 brings major modernization:
Python 3.10+ required (Python 2 support dropped)
Full type hints throughout the codebase
Support for TestRail API pagination (TestRail 6.7+)
Proper exception handling with custom exception classes
API key authentication support (recommended over password)
Connection pooling via requests Session
Automatic retry on rate limiting (HTTP 429)
Logging instead of print statements
Installation
Using uv (recommended):
uv add pytest-testrail
Or using pip:
pip install pytest-testrail
Configuration
Config for Pytest tests
Add a marker to the tests that will be picked up to be added to the run.
from pytest_testrail.plugin import pytestrail
@pytestrail.case('C1234', 'C5678')
def test_foo():
# test code goes here
# With defect tracking
@pytestrail.case('C1234')
@pytestrail.defect('BUG-123', 'JIRA-456')
def test_bar():
# test code goes here
See a more detailed example here.
Config for TestRail
Settings file template config:
[API]
url = https://yoururl.testrail.net/
email = user@email.com
# Use API key (recommended) or password
api_key = your-api-key
# password = your-password
# timeout = 30
[TESTRUN]
assignedto_id = 1
project_id = 2
suite_id = 3
# Optional settings
# plan_id = 100
# milestone_id = 1
# include_all = false
[TESTCASE]
# custom_comment = Additional info appended to results
Or
Set command line options (see below)
Usage
Basically, the following command will create a testrun in TestRail, add all marked tests to run. Once the all tests are finished they will be updated in TestRail:
pytest --testrail --tr-config=<settings file>.cfg
Using API Key (Recommended)
API keys are more secure than passwords and can be revoked without changing your password. Generate an API key in TestRail under My Settings.
pytest --testrail --tr-url=https://example.testrail.net --tr-email=user@example.com --tr-api-key=your-api-key --tr-testrun-project-id=1 --tr-testrun-suite-id=1
All available options
--testrail Create and update testruns with TestRail
--tr-config=TR_CONFIG
Path to the config file containing information about
the TestRail server (defaults to testrail.cfg)
--tr-url=TR_URL TestRail address you use to access TestRail with your
web browser (config file: url in API section)
--tr-email=TR_EMAIL Email for the account on the TestRail server (config
file: email in API section)
--tr-password=TR_PASSWORD
Password for the account on the TestRail server
(config file: password in API section)
--tr-api-key=TR_API_KEY
API key for the account on the TestRail server
(recommended over password)
(config file: api_key in API section)
--tr-timeout=TR_TIMEOUT
Set timeout for connecting to TestRail server
(config file: timeout in API section)
--tr-testrun-assignedto-id=TR_TESTRUN_ASSIGNEDTO_ID
ID of the user assigned to the test run (config file:
assignedto_id in TESTRUN section)
--tr-testrun-project-id=TR_TESTRUN_PROJECT_ID
ID of the project the test run is in (config file:
project_id in TESTRUN section)
--tr-testrun-suite-id=TR_TESTRUN_SUITE_ID
ID of the test suite containing the test cases (config
file: suite_id in TESTRUN section)
--tr-testrun-suite-include-all
Include all test cases in specified test suite when
creating test run (config file: include_all in TESTRUN
section)
--tr-testrun-name=TR_TESTRUN_NAME
Name given to testrun, that appears in TestRail
(config file: name in TESTRUN section)
--tr-testrun-description=TR_TESTRUN_DESCRIPTION
Description given to testrun, that appears in TestRail
(config file: description in TESTRUN section)
--tr-run-id=TR_RUN_ID
Identifier of testrun, that appears in TestRail. If
provided, option "--tr-testrun-name" will be ignored
--tr-plan-id=TR_PLAN_ID
Identifier of testplan, that appears in TestRail. If
provided, option "--tr-testrun-name" will be ignored
--tr-version=TR_VERSION
Indicate a version in Test Case result.
--tr-no-ssl-cert-check
Do not check for valid SSL certificate on TestRail
host
--tr-close-on-complete
Close a test plan or test run on completion.
--tr-dont-publish-blocked
Do not publish results of "blocked" testcases in
TestRail
--tr-skip-missing Skip test cases that are not present in testrun
--tr-milestone-id=TR_MILESTONE_ID
Identifier of milestone, to be used in run creation
(config file: milestone_id in TESTRUN section)
--tc-custom-comment=TC_CUSTOM_COMMENT
Custom comment, to be appended to default comment for
test case (config file: custom_comment in TESTCASE
section)
Programmatic Usage
You can also use the API client directly in your code:
from pytest_testrail import APIClient, TestRailError
# Create client
client = APIClient(
base_url="https://example.testrail.net",
user="user@example.com",
password="your-api-key" # Can be API key or password
)
# Use context manager for automatic cleanup
with client:
# Get a test case
case = client.send_get("get_case/1")
# Add a result
result = client.send_post("add_result/1", {
"status_id": 1,
"comment": "Test passed!"
})
# Handle paginated results
for test in client.get_paginated("get_tests/1", "tests"):
print(test["case_id"])
Exception Handling
from pytest_testrail import (
APIClient,
TestRailError,
TestRailAPIError,
TestRailAuthenticationError,
TestRailRateLimitError
)
try:
client = APIClient(base_url, user, api_key)
result = client.send_get("get_case/1")
except TestRailAuthenticationError:
print("Invalid credentials")
except TestRailRateLimitError:
print("Rate limit exceeded")
except TestRailAPIError as e:
print(f"API error: {e.message}")
except TestRailError as e:
print(f"General error: {e}")
Development
This project uses uv for dependency management.
# Clone and install
git clone https://github.com/allankp/pytest-testrail.git
cd pytest-testrail
uv sync
# Run tests
uv run pytest
# Run linting
uv run ruff check pytest_testrail tests
uv run mypy pytest_testrail
# Test with different Python versions
uv run --python 3.10 pytest
uv run --python 3.12 pytest
Changelog
See CHANGELOG.md for version history.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pytest_testrail-3.1.1.tar.gz.
File metadata
- Download URL: pytest_testrail-3.1.1.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
61a21be4002f13950838f304e038f16748216e0ea668610674fe12f3adab2775
|
|
| MD5 |
2365094d864c0e98afdb8dfd797fbd99
|
|
| BLAKE2b-256 |
8bb9eb4b68e74b2c529c4753633c4ee7dcc400a0d30b2f1621e0c1ca4747dcf6
|
Provenance
The following attestation bundles were made for pytest_testrail-3.1.1.tar.gz:
Publisher:
release.yml on allankp/pytest-testrail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pytest_testrail-3.1.1.tar.gz -
Subject digest:
61a21be4002f13950838f304e038f16748216e0ea668610674fe12f3adab2775 - Sigstore transparency entry: 854014414
- Sigstore integration time:
-
Permalink:
allankp/pytest-testrail@a2dffa4124e581e30e81bb0f05cd270a2fc4e29d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/allankp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a2dffa4124e581e30e81bb0f05cd270a2fc4e29d -
Trigger Event:
push
-
Statement type:
File details
Details for the file pytest_testrail-3.1.1-py3-none-any.whl.
File metadata
- Download URL: pytest_testrail-3.1.1-py3-none-any.whl
- Upload date:
- Size: 18.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d2e4357b22fb77f1c6961637a6ce72178af91db689c83edd120d25b5a308ab51
|
|
| MD5 |
e453b07a8f8429a70aef857bf0cee55c
|
|
| BLAKE2b-256 |
7efe45f1b75c982a1e31f7743b4fcd8aac3594ca4c62b472aa06c8566310b3d3
|
Provenance
The following attestation bundles were made for pytest_testrail-3.1.1-py3-none-any.whl:
Publisher:
release.yml on allankp/pytest-testrail
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pytest_testrail-3.1.1-py3-none-any.whl -
Subject digest:
d2e4357b22fb77f1c6961637a6ce72178af91db689c83edd120d25b5a308ab51 - Sigstore transparency entry: 854014431
- Sigstore integration time:
-
Permalink:
allankp/pytest-testrail@a2dffa4124e581e30e81bb0f05cd270a2fc4e29d -
Branch / Tag:
refs/heads/main - Owner: https://github.com/allankp
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a2dffa4124e581e30e81bb0f05cd270a2fc4e29d -
Trigger Event:
push
-
Statement type: