testzeus-test-suites#
Create and manage test suites with workflow orchestration in TestZeus.
Category: execution · Version: 1.0.0 · Requires: testzeus-auth
Triggers: test suite, create suite, workflow, suite run, orchestrate tests, schedule suite, suite workflow, DAG, node, edge, workflow definition, suite orchestration
Overview#
Test suites in TestZeus allow you to orchestrate multiple tests into a directed acyclic graph (DAG) workflow. Tests can run sequentially or in parallel, with dependencies between nodes.
Quick Reference#
# List suites
testzeus test-suites list
# Get suite details
testzeus test-suites get suite_id
# Create suite
testzeus test-suites create \
--name "checkout-flow" \
--workflow-definition '{...}'
# Run suite
testzeus test-suite-runs create \
--name "Run" \
--test-suite suite_id \
--input-values '{"base_url": "https://staging.example.com"}'
# Control runs
testzeus test-suite-runs pause run_id --mode graceful
testzeus test-suite-runs resume run_id
testzeus test-suite-runs cancel run_id
Workflow Definition Structure#
The workflow definition defines the DAG structure of your test suite:
{
"version": "1.0",
"inputs": [
{"name": "base_url", "type": "string", "required": true},
{"name": "locale", "type": "string", "required": false, "default": "en-US"}
],
"nodes": [
{
"id": "login",
"name": "Login Flow",
"test_id": "test_login_id",
"inputs": {"base_url": "$base_url"},
"settings": {"timeout": 300, "retries": 2}
},
{
"id": "checkout",
"name": "Checkout Flow",
"test_id": "test_checkout_id",
"inputs": {"base_url": "$base_url", "locale": "$locale"}
}
],
"edges": [
{
"id": "login-to-checkout",
"from_node": "login",
"to_node": "checkout",
"dependency_type": "temporal"
}
],
"outputs": [],
"settings": {"max_parallel_nodes": 3}
}
Workflow Components#
Version#
version: Must be “1.0”
Inputs (Optional)#
Define suite-level input parameters:
"inputs": [
{"name": "base_url", "type": "string", "required": true},
{"name": "count", "type": "number", "required": false, "default": 10}
]
Nodes#
Each node represents a test or nested suite:
"nodes": [
{
"id": "unique_node_id",
"name": "Human-readable name",
"test_id": "actual_test_uuid",
"suite_id": "nested_suite_uuid", // OR this (not both)
"inputs": {"param": "value"},
"settings": {
"timeout": 300,
"retries": 2,
"continue_on_failure": false
}
}
]
Edges#
Define dependencies between nodes:
"edges": [
{
"id": "edge_id",
"from_node": "node_id_1",
"to_node": "node_id_2",
"dependency_type": "temporal" // or "hard"
}
]
Dependency Types:
temporal: Wait for completion, run regardless of resulthard: Stop if upstream fails
Settings#
"settings": {
"max_parallel_nodes": 5,
"failure_strategy": "stop" // or "continue"
}
Create Test Suite#
Basic Sequential Flow#
testzeus test-suites create \
--name "Checkout Flow" \
--execution-mode lenient \
--workflow-definition '{
"version": "1.0",
"nodes": [
{
"id": "login",
"name": "Login",
"test_id": "y9b88f17vabx476"
},
{
"id": "add_cart",
"name": "Add to Cart",
"test_id": "x8c77f26uabx585"
},
{
"id": "checkout",
"name": "Checkout",
"test_id": "w7d66e15tabx694"
}
],
"edges": [
{"id": "e1", "from_node": "login", "to_node": "add_cart", "dependency_type": "temporal"},
{"id": "e2", "from_node": "add_cart", "to_node": "checkout", "dependency_type": "temporal"}
]
}'
With Input Schema#
testzeus test-suites create \
--name "Parameterized Suite" \
--input-schema '[{"name": "base_url", "type": "string", "required": true}, {"name": "locale", "type": "string", "required": false}]' \
--default-inputs '{"locale": "en-US"}' \
--workflow-definition '{...}'
Manage Test Suites#
List Suites#
testzeus test-suites list
testzeus test-suites list --filters status=ready
Get Suite Details#
testzeus test-suites get suite_id
testzeus test-suites get suite_id --expand tests,environment
Update Suite#
# Update name and status
testzeus test-suites update suite_id \
--name "New Name" \
--status ready
# Update workflow
testzeus test-suites update suite_id \
--workflow-definition '{...}'
Delete Suite#
testzeus test-suites delete suite_id
Run Test Suites#
Create Run#
testzeus test-suite-runs create \
--name "Checkout Daily Run" \
--test-suite suite_id \
--input-values '{"base_url": "https://staging.example.com"}'
Control Runs#
# Pause (graceful)
testzeus test-suite-runs pause run_id --mode graceful --reason "Maintenance window"
# Pause (force)
testzeus test-suite-runs pause run_id --mode force
# Resume
testzeus test-suite-runs resume run_id
# Cancel
testzeus test-suite-runs cancel run_id
# Delete
testzeus test-suite-runs delete run_id
List Runs#
testzeus test-suite-runs list
testzeus test-suite-runs list --filters status=running
Get Run Details#
testzeus test-suite-runs get run_id
View Node Runs#
testzeus test-suite-node-runs list \
--filters test_suite_run=run_id
testzeus test-suite-node-runs get node_run_id
Schedule Suite Runs#
# Create schedule
testzeus test-suite-schedules create \
--name "Daily Checkout" \
--test-suite suite_id \
--cron-expression "0 9 * * *" \
--input-values '{"base_url": "https://staging.example.com"}' \
--notification-channels channel_id
# List schedules
testzeus test-suite-schedules list
# Update schedule
testzeus test-suite-schedules update schedule_id \
--cron-expression "0 10 * * *" \
--is-active true
# Delete schedule
testzeus test-suite-schedules delete schedule_id
Nested Suites#
Create hierarchical test execution:
testzeus test-suites create \
--name "E2E Suite" \
--workflow-definition '{
"version": "1.0",
"nodes": [
{
"id": "auth",
"name": "Auth Suite",
"suite_id": "auth_suite_id"
},
{
"id": "main",
"name": "Main Suite",
"suite_id": "main_suite_id"
}
],
"edges": [
{"id": "e1", "from_node": "auth", "to_node": "main", "dependency_type": "hard"}
]
}'
Common Patterns#
Parallel Execution#
{
"nodes": [
{"id": "test1", "name": "Test 1", "test_id": "..."},
{"id": "test2", "name": "Test 2", "test_id": "..."},
{"id": "test3", "name": "Test 3", "test_id": "..."}
],
"edges": [],
"settings": {"max_parallel_nodes": 3}
}
Fan-In / Fan-Out#
{
"nodes": [
{"id": "setup", "name": "Setup", "test_id": "..."},
{"id": "test1", "name": "Test 1", "test_id": "..."},
{"id": "test2", "name": "Test 2", "test_id": "..."},
{"id": "teardown", "name": "Teardown", "test_id": "..."}
],
"edges": [
{"from_node": "setup", "to_node": "test1"},
{"from_node": "setup", "to_node": "test2"},
{"from_node": "test1", "to_node": "teardown"},
{"from_node": "test2", "to_node": "teardown"}
]
}
SDK Usage#
from testzeus_sdk import TestZeusClient
async def main():
async with TestZeusClient() as client:
# Create suite
suite = await client.test_suites.create({
"name": "checkout-flow",
"execution_mode": "lenient",
"workflow_definition": {
"version": "1.0",
"nodes": [
{"id": "login", "name": "Login", "test_id": "test_id"},
{"id": "checkout", "name": "Checkout", "test_id": "test_id_2"}
],
"edges": [
{"from_node": "login", "to_node": "checkout", "dependency_type": "temporal"}
]
}
})
# Run suite
run = await client.test_suite_runs.run(
display_name="Daily Checkout",
test_suite=suite.id,
input_values={"base_url": "https://staging.example.com"}
)
# Control
await client.test_suite_runs.pause(run.id, mode="graceful")
await client.test_suite_runs.resume(run.id)
Error Handling#
Common Errors#
Error |
Cause |
Solution |
|---|---|---|
|
Malformed JSON |
Validate JSON syntax |
|
Missing test_id |
Ensure test exists |
|
Circular dependencies |
Remove circular edges |
|
Status not “ready” |
Update status first |
Debugging#
# Get expanded run details
testzeus test-suite-runs get run_id --expand nodes
# List node run details
testzeus test-suite-node-runs list --filters test_suite_run=run_id
Component Schema#
Use TestSuiteView component:
{
"component": "TestSuiteView",
"props": {
"suiteName": "checkout-flow",
"nodes": [
{"id": "login", "name": "Login", "status": "passed", "duration": "1.2s"},
{"id": "cart", "name": "Cart", "status": "failed", "duration": "0.8s"},
{"id": "checkout", "name": "Checkout", "status": "skipped", "duration": "0s"}
],
"executionMode": "lenient"
}
}
Use SuiteRunCard component:
{
"component": "SuiteRunCard",
"props": {
"name": "checkout-flow",
"runId": "run_123",
"status": "running",
"progress": {"completed": 2, "total": 5},
"duration": "3m 45s"
}
}