Create dashboard-managed QA coverage with ta / testerarmy.
The CLI is a control plane for the TesterArmy dashboard: manage projects, environments, credentials, and saved tests, and queue runs that execute in TesterArmy cloud. Use a cloud-reachable preview or tunnel environment to validate development changes.
When to Use
- Create persistent QA coverage for a feature or product area.
- Convert acceptance criteria into dashboard tests.
- Add or update smoke, regression, auth, billing, onboarding, or mobile flows.
Setup
Check auth:
ta status --json
If needed:
ta auth
ta auth --api-key <key>
TESTERARMY_API_KEY=<key> ta status --json
ta signout
ta logout
Most commands that call the API accept --api-key <key> and --base-url <url>.
Use env vars or saved auth by default.
Discover scope:
ta projects list --json
ta projects get <projectId> --json
ta groups list --project <projectId> --json
ta tests list --project <projectId> --json
Use IDs exactly as returned.
Project Context
Create a project:
echo '{"name":"Example","url":"https://example.com","projectType":"web"}' | ta projects create --json
echo '{"name":"Example staging"}' | ta projects update <projectId> --json
ta projects files <projectId> --json
Project commands: list, get, create, update, delete, environments,
environments-create, environments-delete, credentials,
credentials-create, files.
Manage saved environments (remote run targets such as Staging or QA):
ta projects environments <projectId> --json
ta projects environments-create <projectId> --name Staging --url https://staging.example.com --json
ta projects environments-delete <projectId> <environmentId> --json
Production and PR Preview are built-in environments and cannot be deleted.
Target a saved environment on runs with --env <nameOrSlug> or
--project-environment-id <id>.
Delete projects only when explicitly requested:
ta projects delete <projectId> --json
Store app knowledge:
ta memories list --project <projectId> --json
echo '{"category":"site_structure","title":"Auth route","content":"Login is at /login","importance":"high"}' | ta memories create --project <projectId> --json
ta memories delete <memoryId> --project <projectId> --json
Memory categories: site_structure, test_insights, user_preferences.
Create credentials for login or inbox flows:
ta projects credentials <projectId> --json
echo '{"kind":"login","label":"Admin","username":"admin@example.com","password":"secret"}' | ta projects credentials-create <projectId> --json
echo '{"kind":"inbox","label":"Signup inbox"}' | ta projects credentials-create <projectId> --json
Never print real secrets in final messages.
Tests
Create:
echo '{"title":"Login flow","description":"User can sign in and reach the dashboard","steps":[{"title":"Navigate to /login","type":"act"},{"title":"Sign in with the saved admin credentials","type":"login","credentialId":"<credentialId>"},{"title":"Dashboard loads and shows the project list","type":"assert"}]}' | ta tests create --project <projectId> --json
Create in a group:
echo '{"title":"Pricing CTA","steps":[{"title":"Open /pricing","type":"act"},{"title":"Click the primary CTA","type":"act"},{"title":"Signup or dashboard flow starts","type":"assert"}]}' | ta tests create --project <projectId> --group <groupId> --json
Payload:
{
"title": "string, required",
"description": "string, optional",
"platform": "web or mobile, optional",
"steps": [
{ "title": "User action", "type": "act" },
{ "title": "Expected result", "type": "assert" },
{ "title": "Login instruction", "type": "login", "credentialId": "uuid" },
{ "title": "Use temporary email", "type": "login", "temporaryEmail": true },
{ "title": "Upload the sample invoice PDF", "type": "files" },
{ "title": "Screenshot label", "type": "screenshot" }
]
}
Write good steps:
- Write plain-language instructions you would give to a teammate.
- Describe the user's intent, not selectors, waits, DOM structure, or component names.
- Give each step one clear job with a clear stopping point.
- Split actions and checks into separate steps.
- Use labels visible in the UI, such as
Pricing,New Project,Save, orInvite teammate. - Include business context that disambiguates the goal, such as project names, emails, plan names, or expected statuses.
- Make assertions specific enough to pass or fail confidently.
- Quote exact copy only when exact copy matters; otherwise describe the expected meaning.
Examples:
| Avoid | Write |
|---|---|
Click the button with class .nav-item:nth-child(3), wait 500ms, then assert URL contains /pricing. |
Open the Pricing page from the header. |
Log in, create a project, invite a teammate, run a test, and verify the result. |
Split into focused steps: log in, create the project, invite the teammate, run the test, then verify the result. |
Add the Pro plan to the cart and make sure the cart is correct. |
Add the Pro plan to the cart. then Verify the cart shows the Pro plan with the correct monthly price. |
Verify the dashboard looks good. |
Verify the dashboard shows a Projects card, a Recent Runs card, and no visible error banner. |
Before creating or updating a test, check:
- Could a teammate follow these steps without seeing the code?
- Does each step have one clear intent?
- Are actions and assertions split?
- Are user-visible labels included where useful?
- Are credentials handled by a
loginstep or saved project credentials? - Is each expected result specific enough to evaluate?
Rules:
- Cover one user journey.
- Prefer 3-10 meaningful steps.
- Use
actfor navigation, clicks, typing, and other user actions. - Use
assertfor visible outcomes, persisted state, email delivery, or URL changes. - Use
loginwithcredentialIdortemporaryEmail; do not put passwords in step titles. - Use
filesfor uploading attached files. - Use
screenshotonly for important visual checkpoints. - Do not hide login, uploads, screenshots, or assertions inside broad action steps.
- Maximum 50 steps per test.
Inspect before changing:
ta tests list --project <projectId> --json
ta tests get <testId> --json
Update title, description, steps, or enabled:
echo '{"title":"Updated login smoke"}' | ta tests update <testId> --json
echo '{"steps":[{"title":"Open /login","type":"act"},{"title":"Sign in","type":"login","credentialId":"<credentialId>"},{"title":"Dashboard is visible","type":"assert"}]}' | ta tests update <testId> --json
echo '{"enabled":false}' | ta tests update <testId> --json
Replacing steps requires the complete array.
Toggle a test without deleting it:
ta tests disable <testId> --json
ta tests enable <testId> --json
Delete only when explicitly requested:
ta tests delete <testId> --json
Groups
Create suites:
ta groups list --project <projectId> --json
ta groups get <groupId> --json
echo '{"projectId":"<projectId>","name":"Smoke"}' | ta groups create --json
echo '{"name":"Core smoke"}' | ta groups update <groupId> --json
ta groups add-test <groupId> <testId> --json
ta groups remove-test <groupId> <testId> --json
Delete non-default groups only when explicitly requested:
ta groups delete <groupId> --json
Common groups: Smoke, Auth, Core journeys, Mobile smoke.
Runs
ta tests run queues the saved test in TesterArmy cloud. Add --wait for
validation; without it, exit code 0 only confirms that the run was queued.
ta tests run <testId> --wait --json
ta tests run <testId> --env staging --wait --json
ta tests run --group <groupId> --project <projectId> --wait --json
ta tests run <testId> --platform ios --app-id <appId> --wait --json
ta tests run <testId> --platform android --app-id <appId> --wait --json
Development targets must be reachable from the cloud browser. Save a preview or tunnel URL as an environment, then select it on the run:
ta projects environments-create <projectId> --name Development --url https://dev.example.com --json
ta tests run <testId> --env development --wait --json
Run options:
--env <nameOrSlug>or--project-environment-id <id>: select a saved project environment; do not combine them.--url <url>: target URL override for group runs; do not combine it with--env.--wait-timeout <ms>and--wait-interval <ms>: control how long to wait and the initial polling interval.--platform web|ios|android,--app-id, and--device-model: select the runtime and mobile build/device.- Group runs can use
--environment production|staging|previewto label the run origin. - Single-test runs can use
--mode fast|deep.
Save a local result artifact with shell redirection:
ta tests run <testId> --env development --wait --json > result.json
Runs:
ta runs list --project <projectId> --json
ta runs get <runId> --json
ta runs wait <runId> --timeout 600000 --json
ta runs messages <runId> --json
ta runs telemetry <runId> --json
ta runs cancel <runId> --json
Mobile App Coverage
Upload an iOS Simulator app or Android APK before cloud runs:
ta upload-app --app-path ios/build/Build/Products/Release-iphonesimulator/MyApp.app --project <projectId> --json
ta upload-app --app-path MyApp.apk --project <projectId> --remove-after 3600 --json
ta tests run <testId> --platform ios --app-id <appId> --wait --json
ta tests run <testId> --platform android --app-id <appId> --wait --json
Supported uploads: .app, .app.zip, .zip for iOS Simulator apps and .apk
for Android. Use --remove-after <seconds> to auto-delete uploaded apps.
Reporting
Report:
- Project ID/name
- Test IDs and titles created or updated
- Group IDs/names touched
- Remote validation command and result, if run
- Run ID or artifact/output path, if available
Do not claim durable coverage unless ta tests create or ta tests update ran.
References
| File | Description |
|---|---|
| reporting-template.md | Dashboard coverage report template |