Testers.AI SDKBETA powered by testers.ai
Docs Integrations FAQ Downloads Get API key → Get the SDK →
⚠️
Public beta. APIs may shift before 1.0. Pin the version you test with; the behaviour documented here is stable within 0.1.x. What beta means →

Add these AI testers to your existing tests

21 named specialists — pick by first name in any analyze_* call, or define your own.
See all + custom testers →

How it works

Three rules across every integration.

Jira

Creates one Jira issue per qualifying finding in the configured project.

Env varPurpose
TESTERSAI_JIRA_URLBase URL, e.g. https://acme.atlassian.net
TESTERSAI_JIRA_EMAILAccount email for API-token auth
TESTERSAI_JIRA_API_TOKENJira API token (create one)
TESTERSAI_JIRA_PROJECTProject key (e.g. QA)
TESTERSAI_JIRA_ISSUE_TYPEDefaults to Bug
TESTERSAI_JIRA_SEVERITIESComma-separated (default high,critical)
What gets created: Summary [testersai:<kind>:<severity>] <message>, description with category / location / evidence / context, labels testersai, testersai-<severity>, testersai-<category>.

Xray (Jira plugin)

Imports results into an existing Xray Test Execution, matching on a test_key context field.

Env varPurpose
TESTERSAI_XRAY_CLIENT_IDXray API client id
TESTERSAI_XRAY_CLIENT_SECRETXray API client secret
TESTERSAI_XRAY_EXECUTION_KEYExisting Test Execution key, e.g. EX-42
TESTERSAI_XRAY_URLDefaults to Xray Cloud. Override for self-hosted.

Pass the test key via context:

r = client.analyze_screenshot(
    img,
    context={"test_key": "QA-101"}
)

TestRail

Posts a result to an existing TestRail run, matching on a case_id context field.

Env varPurpose
TESTERSAI_TESTRAIL_URLBase URL, e.g. https://acme.testrail.io
TESTERSAI_TESTRAIL_USERAccount email
TESTERSAI_TESTRAIL_API_KEYAPI key
TESTERSAI_TESTRAIL_RUN_IDNumeric TestRail run id

The result is status_id=5 (Failed) when findings contain high/critical severity, else status_id=1 (Passed). Comment contains the finding list.

r = client.analyze_page_text(
    html,
    context={"case_id": 501}
)

Cypress Cloud

Attaches Testers.AI findings to the current Cypress Cloud run.

Env varPurpose
CYPRESS_RECORD_KEY (or TESTERSAI_CYPRESS_RECORD_KEY)Standard Cypress Cloud record key
CYPRESS_PROJECT_ID (or TESTERSAI_CYPRESS_PROJECT_ID)Project id
CYPRESS_RUN_IDRun id (usually injected by CI after cypress run --record)
TESTERSAI_CYPRESS_URLDefaults to https://api.cypress.io

No run id = silent no-op. The SDK won't post to a random run.

r = client.analyze_screenshot(
    img,
    context={
        "cypress_run_id": "run-555",
        "cypress_instance_id": "inst-abc",
        "spec": "login.cy.js",
    }
)

All four at once

You can turn on every integration simultaneously. A single analysis fires in parallel to all configured targets; any that fails is skipped silently.

context = {
    "test_key": "QA-9",          # → Xray
    "case_id": 77,                # → TestRail
    "cypress_run_id": "run-9",     # → Cypress Cloud
}
# Jira needs no context — creates an issue per high-severity finding.
r = client.analyze_console(logs, context=context)
Tested: sdk_test/integrations/test_integrations.py starts a mock TMS server, configures all four integrations pointed at it, and asserts the exact payloads posted to each endpoint — including the "broken TMS doesn't fail tests" resilience case.