# uip tm testcases

> `uip tm testcases` manages test cases within a Test Manager project: create, list, update, delete, link or unlink an Orchestrator automation, inspect historical results, and add or remove test cases from a test set. This page also documents `uip tm testcaselogs list-assertions`, which reads the assertion artifacts attached to a single test case log produced by a run.

`uip tm testcases` manages test cases within a Test Manager project: create, list, update, delete, link or unlink an Orchestrator automation, inspect historical results, and add or remove test cases from a test set. This page also documents `uip tm testcaselogs list-assertions`, which reads the assertion artifacts attached to a single test case log produced by a run.

A test case is the unit of authorship. It becomes runnable once it is linked to a package entry point with `testcases link-automation`, and it runs as part of a test set (see [testsets](./uip-test-manager-testsets.md)).

## Synopsis

```
uip tm testcases create --project-key <key> --name <name> [--description <text>] [--version <version>]
uip tm testcases list --project-key <key> [--filter <text>]
uip tm testcases list-result-history --project-key <key> --test-case-id <uuid> [filters…]
uip tm testcases update --project-key <key> --test-case-key <key> [--name <name>] [--description <text>]
uip tm testcases delete --project-key <key> --test-case-key <key>
uip tm testcases link-automation --project-key <key> --test-case-key <key> --folder-key <uuid> --package-name <name> --test-name <name>
uip tm testcases unlink-automation --project-key <key> --test-case-key <key>
uip tm testcases list-automations --project-key <key> --folder-key <uuid> [--package-name <name>]
uip tm testcases list-testsets --project-key <key> --test-case-key <key>
uip tm testcases add --test-set-key <key> --test-case-keys <keys>
uip tm testcases remove --test-set-key <key> --test-case-keys <keys>

uip tm testcaselogs list-assertions --project-key <key> --test-case-log-id <uuid>
```

All verbs honor the [global options](./global-options.md) and the standard [exit codes](./exit-codes.md). Every verb accepts `-t, --tenant <name>` and `--log-level <level>` (default `Information`).

## uip tm testcases create

Create a new test case inside a project.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — owning project.
- `--name <name>` *(required)* — test case name.
- `--description <text>` — free-form description. Defaults to empty.
- `--version <version>` — test case version string. Defaults to `1.0.0`.

### Example

```bash
uip tm testcases create \
  --project-key DEMO \
  --name "Login smoke" \
  --description "Logs in and out"
```

### Data shape

```json
{
  "Code": "TestCaseCreate",
  "Data": {
    "TestCaseKey": "DEMO:1",
    "Id": "a1b2c3d4-0000-0000-0000-000000000001",
    "Name": "Login smoke",
    "Description": "Logs in and out",
    "Version": "1.0.0"
  }
}
```

`TestCaseKey` (the public `PROJECT:N` identifier) is what you pass to other verbs. The internal `Id` is only needed for `list-result-history`.

## uip tm testcases list

List all test cases in a project. The CLI pages through results automatically; no paging options are exposed on this verb.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — project to list.
- `--filter <text>` — filter by name or key (server-side search).

### Example

```bash
uip tm testcases list --project-key DEMO --filter login
```

### Data shape

```json
{
  "Code": "TestCasesList",
  "Data": [
    {
      "TestCaseKey": "DEMO:1",
      "Name": "Login smoke",
      "Version": "1.0.0",
      "Description": "Logs in and out"
    }
  ]
}
```

## uip tm testcases list-result-history

List the historical test case logs for a single test case. Takes the internal `--test-case-id` (UUID), not the `PROJECT:N` key — look up the UUID via `testcases list` or from a previous `TestCaseCreate` output.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — owning project.
- `--test-case-id <uuid>` *(required)* — internal test case UUID.
- `--filter <text>` — search test case logs by name.
- `--only-failed` — shortcut for "show only failed logs" (default `false`).
- `--results <results...>` — space-separated results to include. Accepted values come from the SDK `Result` enum.
- `--statuses <statuses...>` — space-separated execution statuses. Accepted values come from the SDK `TestCaseLogExecutionStatus` enum.
- `--duration-period <period>` — filter by duration bucket. Accepted values come from the SDK `DurationPeriod` enum.
- `--top <number>` — page size. Defaults to `50`.
- `--skip <number>` — results to skip. Defaults to `0`.

:::note
The exact accepted values for `--results`, `--statuses`, and `--duration-period` are generated at runtime from the Test Manager SDK enums shipped with the installed tool version. Run `uip tm testcases list-result-history --help` to see the current set.
:::

### Example

```bash
uip tm testcases list-result-history \
  --project-key DEMO \
  --test-case-id a1b2c3d4-0000-0000-0000-000000000001 \
  --only-failed
```

### Data shape

```json
{
  "Code": "TestCaseResultHistory",
  "Data": [
    {
      "Id": "b2c3d4e5-0000-0000-0000-000000000001",
      "Result": "Failed",
      "Status": "Finished",
      "ExecutionEnd": "2025-04-15T12:00:00Z"
    }
  ]
}
```

## uip tm testcases update

Rename a test case or change its description. At least one of `--name` or `--description` is required; otherwise the command fails with a validation error.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — owning project.
- `--test-case-key <key>` *(required)* — test case key (e.g. `DEMO:1`).
- `--name <name>` — new name.
- `--description <text>` — new description.

### Example

```bash
uip tm testcases update \
  --project-key DEMO \
  --test-case-key DEMO:1 \
  --name "Login smoke (2026)"
```

### Data shape

```json
{
  "Code": "TestCaseUpdate",
  "Data": {
    "TestCaseKey": "DEMO:1",
    "Name": "Login smoke (2026)",
    "Description": "Logs in and out",
    "Result": "Updated"
  }
}
```

## uip tm testcases delete

Delete a test case by its key.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — owning project.
- `--test-case-key <key>` *(required)* — test case key (e.g. `DEMO:1`).

### Example

```bash
uip tm testcases delete --project-key DEMO --test-case-key DEMO:1
```

### Data shape

```json
{
  "Code": "TestCaseDelete",
  "Data": {
    "TestCaseKey": "DEMO:1",
    "Id": "a1b2c3d4-0000-0000-0000-000000000001",
    "Result": "Deleted"
  }
}
```

## uip tm testcases link-automation

Bind an Orchestrator package entry point to a test case. This is what makes the test case executable inside a test set.

Internally, the command resolves the folder display name from `--folder-key`, looks up the matching package entry point by name, then stores the binding on the test case. All four of `--folder-key`, `--package-name`, and `--test-name` must resolve to a concrete entry point or the command fails.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — owning project.
- `--test-case-key <key>` *(required)* — test case to bind.
- `--folder-key <uuid>` *(required)* — Orchestrator folder UUID (from `uip or folders list`).
- `--package-name <name>` *(required)* — Orchestrator package identifier (e.g. `InvoiceTests`).
- `--test-name <name>` *(required)* — the test case name inside the package (the entry point name).

### Example

```bash
uip tm testcases link-automation \
  --project-key DEMO \
  --test-case-key DEMO:1 \
  --folder-key f0f0f0f0-0000-0000-0000-000000000001 \
  --package-name InvoiceTests \
  --test-name SmokeTest
```

### Data shape

```json
{
  "Code": "TestCaseLinkAutomation",
  "Data": {
    "TestCaseKey": "DEMO:1",
    "PackageName": "InvoiceTests",
    "PackageSource": "Shared",
    "TestName": "SmokeTest",
    "Result": "Linked"
  }
}
```

`PackageSource` is the display name of the folder resolved from `--folder-key`.

## uip tm testcases unlink-automation

Remove the package-entry-point binding from a test case. After unlinking, the test case is no longer executable until it is linked again.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — owning project.
- `--test-case-key <key>` *(required)* — test case to unlink.

### Example

```bash
uip tm testcases unlink-automation --project-key DEMO --test-case-key DEMO:1
```

### Data shape

```json
{
  "Code": "TestCaseUnlinkAutomation",
  "Data": {
    "TestCaseKey": "DEMO:1",
    "Result": "Unlinked"
  }
}
```

## uip tm testcases list-automations

List the test entry points available in an Orchestrator folder — use this to discover the `--package-name` / `--test-name` values to pass to `link-automation`.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — owning project (used to scope the lookup).
- `--folder-key <uuid>` *(required)* — Orchestrator folder UUID.
- `--package-name <name>` — filter the list to one package (case-insensitive exact match).

### Example

```bash
uip tm testcases list-automations \
  --project-key DEMO \
  --folder-key f0f0f0f0-0000-0000-0000-000000000001
```

### Data shape

```json
{
  "Code": "TestAutomationsList",
  "Data": [
    {
      "PackageName": "InvoiceTests",
      "TestName": "SmokeTest",
      "PackageVersion": "1.0.2"
    }
  ]
}
```

## uip tm testcases list-testsets

List every test set that contains a given test case.

### Arguments

None.

### Options

- `--project-key <key>` *(required)* — owning project.
- `--test-case-key <key>` *(required)* — test case key (e.g. `DEMO:1`).

### Example

```bash
uip tm testcases list-testsets --project-key DEMO --test-case-key DEMO:1
```

### Data shape

```json
{
  "Code": "TestCaseTestSetsList",
  "Data": [
    {
      "TestSetKey": "DEMO:10",
      "Name": "Smoke Suite",
      "FolderKey": "f0f0f0f0-0000-0000-0000-000000000001"
    }
  ]
}
```

## uip tm testcases add

Add one or more test cases to a test set. The CLI resolves every key to its internal UUID and calls the assignment endpoint in one request. If any key is unknown, the whole call fails before any change is made.

### Arguments

None.

### Options

- `--test-set-key <key>` *(required)* — test set to modify.
- `--test-case-keys <keys>` *(required)* — comma-separated test case keys (e.g. `DEMO:1,DEMO:2`). Whitespace around commas is ignored.

### Example

```bash
uip tm testcases add \
  --test-set-key DEMO:10 \
  --test-case-keys DEMO:1,DEMO:2
```

### Data shape

```json
{
  "Code": "TestCaseAdd",
  "Data": {
    "TestSetKey": "DEMO:10",
    "Added": "DEMO:1, DEMO:2",
    "Result": "Added"
  }
}
```

## uip tm testcases remove

Remove one or more test cases from a test set. Same semantics as `testcases add` but calls the unassignment endpoint.

### Arguments

None.

### Options

- `--test-set-key <key>` *(required)* — test set to modify.
- `--test-case-keys <keys>` *(required)* — comma-separated test case keys to remove.

### Example

```bash
uip tm testcases remove \
  --test-set-key DEMO:10 \
  --test-case-keys DEMO:1,DEMO:2
```

### Data shape

```json
{
  "Code": "TestCaseRemove",
  "Data": {
    "TestSetKey": "DEMO:10",
    "Removed": "DEMO:1, DEMO:2",
    "Result": "Removed"
  }
}
```

## uip tm testcaselogs list-assertions

List the assertions recorded for a single test case log. Every run of a test case produces exactly one test case log; its assertions are the individual checks the automation recorded (`Expect`, `VerifyExpression`, etc.). Use this when you want to surface *why* a test case log is marked `Failed`.

This verb is registered under `testcaselogs`, not `testcases`, but it is documented here because it reads assertion artifacts for a test case's log.

### Arguments

None.

### Options

- `--test-case-log-id <uuid>` *(required)* — test case log UUID. Get it from `uip tm executions testcaselogs list` or `uip tm testcases list-result-history`.
- `--project-key <key>` *(required)* — owning project.

### Example

```bash
uip tm testcaselogs list-assertions \
  --test-case-log-id a1b2c3d4-0000-0000-0000-000000000001 \
  --project-key DEMO
```

### Data shape

```json
{
  "Code": "TestCaseLogAssertions",
  "Data": [
    { "Message": "Title contains 'Welcome'", "Succeeded": true },
    { "Message": "Button 'Login' visible", "Succeeded": false }
  ]
}
```

## Related

- [project](./uip-test-manager-project.md) — scope that owns every test case.
- [testsets](./uip-test-manager-testsets.md) — group test cases into a runnable suite.
- [executions](./uip-test-manager-executions.md) — execution-level views of test case logs (`execution testcaselogs list`).
- [report](./uip-test-manager-report.md) — summary of a run, with failed cases and assertion text.

## See also

- [Test Manager overview](./uip-test-manager.md)
- [`uip or folders list`](./uip-orchestrator-folders.md) — source of `--folder-key`.
- [`uip or packages`](./uip-orchestrator-packages.md) — how Orchestrator packages and entry points are registered.
