Command-line tool
qa-ai.mjs: one file, Node 18 or later, no dependencies. Runs tests, waits for the verdicts, writes JUnit and uploads app builds.
Get it#
curl -fsSL https://app.testsy.dev/cli/qa-ai.mjs -o qa-ai.mjs
export QA_AI_API_KEY=qa_… # Settings → API keys
node qa-ai.mjs version| Variable | |
|---|---|
QA_AI_API_KEY | Required. |
QA_AI_URL | The app's address. Default https://app.testsy.dev. |
Commands#
qa-ai run --project <p_id> [--test <t_id,…>] [--mode auto|cold|warm] [--timeout 45m]
[--junit file.xml] [--fail-on failed,error] [--no-wait]
[--build <app.apk | MyApp.app.zip | ab_id>]… [--label <text>]
qa-ai build upload <app.apk | MyApp.app.zip> --project <p_id> [--label <text>] [--json]
qa-ai builds --project <p_id>
qa-ai status <j_id…>
qa-ai projects
qa-ai tests --project <p_id>run starts every test in the project, or the tests you name (--project and --test can be combined), then checks every 15 seconds until each has a verdict, printing each result with its link, and a summary.
| Flag | |
|---|---|
--mode | auto (default), cold or warm: see learned paths. |
--timeout | How long to wait: 30s, 45m (default), 1h; a bare number is minutes. |
--junit <file> | Write a JUnit report: one test case per run; a failure as <failure>, any other non-pass as <error>. |
--fail-on | Verdicts that make it exit 1. Default failed,error. Also blocked, inconclusive. |
--no-wait | Print the run ids as JSON and exit 0. |
--build | App tests run these builds. A file is uploaded first; an ab_ id is used as is. Repeat it for several apps: each app test gets the build of its own app. |
--label | A label for uploaded builds. Default: the commit (GITHUB_SHA or CI_COMMIT_SHORT_SHA). |
build upload uploads a build in parts (three at a time) and prints its id, or the whole build with --json. On GitHub it also sets the step output build-id.
builds, tests and projects list ids; status prints runs as JSON.
In CI#
The tool recognises GitHub Actions, GitLab, CircleCI, Bitbucket, Buildkite, Azure Pipelines and Jenkins, and sends the commit, branch, job and job link with each run. On GitHub it adds a results table to the job summary. Each start sends an Idempotency-Key, and requests are retried on network errors and 5xx answers, so a retry never starts a run twice.
Exit codes#
0 every run passed (or none ended in a --fail-on verdict) · 1 a run ended in a --fail-on verdict · 2 a setup or API problem · 3 timed out.