Skip to content
Talk to our solutions team

CLI Reference

Testing has two surfaces, and they are not equivalent.

SurfaceProvides
kis testThe v2 functional runner only — kis test -t tests/ and its flags
test.svcEvery mode: test, tests, api, load, agent, orchestrator

The kis CLI exposes the v2 runner as a top-level command, so kis test -t tests/ works and takes the flags below. It does not expose the other modes: kis test load is parsed as the v2 runner with an ignored positional argument, not as the load runner. Use test.svc for anything beyond the v2 runner.

kis test -t <path> [flags]
CommandPurposeDoc
test (alias run)v2 functional test runner — the recommended way to run API testsGetting started, Test definitions
testsv1.5 hierarchy runner (steps/testcases/scenarios/testplans directories); also drives load tests via --loadLegacy tests mode, Load testing
loadlegacy load runner over testplan+config+profile YAML tripleLoad testing
apiPostman-style collection runner (requests: files) — a CLI runner, not a serverLegacy tests mode
agentdistributed load worker; dials the orchestrator over gRPCServer modes
orchestratordistributed control plane; gRPC server + HTTPS APIServer modes
versionprint name, version, build commit, build timestamp

Exit codes: 0 success, 1 on any test failure (v2 test), load/tests-mode failures, or cobra errors; -1 for bare invocation with no command. The legacy test plan runner and api log per-item failures but still exit 0 — don’t gate CI on those two.

kis test (alias: kis test run) — v2 functional runner

Section titled “kis test (alias: kis test run) — v2 functional runner”

Runs a test YAML file or a directory tree of suites. No files are written by default: results stream to the console and the process exits 0/1. See Test definitions for the YAML schema.

Terminal window
kis test -t tests/ # run a suite tree; env auto-discovered
kis test -t tests/data.yaml # run one file
kis test -t tests/ -e env.yaml -n staging # multi-env file; pick "staging"
kis test -t tests/ --tags smoke
kis test -t tests/ -v url=http://localhost:8080 -v password=secret
kis test -t tests/ --db .test/results.db --junit .test/junit.xml
kis test -t tests/ --dry-run # validate tree + templates, no HTTP calls
FlagShortDefaultDescription
--tests-tRequired. Path to a test YAML file or directory.
--env-eEnvironment YAML/JSON file. Auto-discovered next to --tests when omitted (see below).
--name-nEnvironment name inside a multi-env env file.
--vars-vInline key=value variables. Highest precedence. Repeatable.
--tagsInclude tags. Commas inside one entry = AND; repeat the flag = OR.
--exclude-tagsSame syntax; matched tests are removed. Exclusion wins over inclusion.
--dbDuckDB file path. Results persist only when provided.
--junitJUnit XML output path (CI integration).
--dry-runfalseValidate suite tree and template resolution without making HTTP calls.
--no-colorfalseDisable ANSI colors (auto-disabled when stdout isn’t a TTY).
--use-guppifalseRoute through the guppi TestExecutionEngine instead of the in-process sequential runner.

Low → high: suite.yaml variables: → env file → --vars.

When --env is omitted, the runner looks in the tests directory (or the directory containing the tests file) for, in order — first hit wins:

  1. env.local.yaml / env.local.yml / env.local.json
  2. env.<name>.yaml / .yml / .json — only when --name is set
  3. env.yaml / env.yml / env.json

The discovered path is announced on stderr. Commit env.yaml, keep env.local.yaml in .gitignore for personal overrides.

Flat — a plain map of variables:

url: http://localhost:8080
password: secret

Multi-env — every top-level value is a map; keys are environment names:

default:
url: http://localhost:8080
staging:
url: https://api.staging.kis.ai

Selection rules: --name <key> picks that block (error lists known keys if missing); no --name picks default; a multi-env file with neither default nor --name is an error. Flat files ignore --name. Accepted extensions: .yaml, .yml, .json (extensionless parses as YAML).

test.svc tests — hierarchy runner (functional + load)

Section titled “test.svc tests — hierarchy runner (functional + load)”

Runs directory-based collections in the steps:/testcases:/scenarios:/testplans: format (see Legacy tests mode). Adding --load switches the same test definitions into load mode (see Load testing).

Terminal window
test.svc tests -p examples/01-rest-basics -d examples/env.json -s
test.svc tests -p examples/01-rest-basics -t teststep -e get-users -s
test.svc tests -p examples/06-load-test --load examples/06-load-test/profile.yaml --profile default
FlagShortDefaultDescription
--path-p<product path>/testsPath to the collection directory.
--patterntype-tallFilter by type: testplan, testscenario, testcase, teststep.
--pattern-eName of the test entity to execute.
--datapath-dData file path, repeatable. .json/.yaml merge into variables; .csv fans out one run per row.
--vars-vInline variables as key=value map.
--loadLoad-profile YAML path. Presence switches to load mode.
--profiledefaultProfile name (key under loadprofiles:).
--logresponses-sfalseLog response bodies.
--loglinenumbers-nfalseLog line numbers.
--loglevel-lpanicLog level: debug, info, warn, error, panic.
--prefixtestLog file prefix.

Output: <prefix>-<RFC3339Nano timestamp>.log plus stdout, and a hierarchy summary table after the run. Any suite failure exits 1.

Drives the legacy testplan format with a config file and a load-profile file. Prefer test.svc tests --load for new load tests; this command remains for existing v1 plans.

Terminal window
test.svc load -i test.yaml -c config.yaml -r load.yaml -l default -e dev
FlagShortDefaultDescription
--input-itest.yamlTest plan YAML.
--config-cconfig.yamlConfig YAML; environments come from its top-level environments: key.
--profiles-rload.yamlLoad-profile YAML (loadprofiles: key). When empty, profiles are read from the input file itself.
--loadprofile-ldefaultProfile name under loadprofiles:.
--env-edefaultEnvironment name.
--output-otest_outputAccepted but unused. The output prefix actually comes from the environment’s output key.

Renders a live terminal dashboard while running; writes test-load-<timestamp>.log and <prefix>_summary.txt. Failures exit 1.

Executes Postman-style request collections (requests: YAML files). Despite the name this is a CLI runner, not a server.

Terminal window
test.svc api -c my-collection # <product path>/api/my-collection
test.svc api -p ./api/my-collection # explicit path
test.svc api -c my-collection -r login # single request by name
FlagShortDefaultDescription
--collection-cCollection name, resolved under <product>/api/<collection> or via <product>/api/collections.yaml.
--path-pExplicit collection directory (wins over --collection).
--folderSubfolder within the collection.
--request-rExecute a single request by name.
--datapath-dData file paths (repeatable).
--vars-vInline variables.
--loglevel-lpanicLog level.
--logresponses-sfalseLog response bodies.
--loglinenumbers-nfalseLog line numbers.

Request failures are logged and execution continues (exit 0).

test.svc agent / test.svc orchestrator — distributed mode

Section titled “test.svc agent / test.svc orchestrator — distributed mode”

Server modes for distributed test execution. Both take the shared infra flag set (--config/-f, default .test.yaml, plus --port, --sid, --config_url, service-discovery and TLS cert flags). See Server modes for config keys, endpoints, and the distributed execution flow.

  • The root command registers two subcommands named test; the v2 runner wins and the legacy plan runner is unreachable under that name. Treat the legacy test flag set (-i/-c/-e/-o) as historical.
  • --output/-o on load is accepted but never read; the file prefix comes from the environment map’s output key.
  • The root infra flags (--sid, --config_url, …) are registered non-persistently: they apply to the bare root, agent, and orchestrator, not to the test-running subcommands.
  • agent logs “Using config file:” with the wrong variable — the file actually loaded is the one passed via --config/-f.