MCP Testing Package
This package provides a test harness for MCP (Model Context Protocol) tools, allowing you to define test scenarios in YAML or JSON format.
Features
- YAML/JSON Test Scenarios: Define tests declaratively
- Import Support: Link external data files to avoid cluttering test files
- Setup/Cleanup: Run setup and cleanup steps
- Assertions: Validate tool responses
- Result Storage: Store tool results for use in later steps
- Dependencies: Define dependencies between test steps
Test Scenario Format
Basic Structure
name: "Interactive object creation test"
description: "Test creating a backlog item interactively"
setup:
- name: "List milestones"
tool: "zqk_object_list"
args:
kind: "milestone"
store_result: "milestones"
tests:
- name: "Create object interactively"
tool: "zqk_create_object_interactive"
args:
kind: "backlog_item"
title: "Test Item"
import: "references.yaml"
import_path: "args"
expected:
success: true
has_field:
session_id: true
Import Support
Import external data files to keep test scenarios clean:
references.yaml:
milestone_refs:
- "MIL-001"
- "MIL-002"
goal_refs:
- "GOAL-001"
test-scenario.yaml:
tests:
- name: "Create object with references"
tool: "zqk_create_object_interactive"
args:
kind: "backlog_item"
title: "Test Item"
import: "references.yaml"
import_path: "args" # Merge into args
Top-Level Imports
Import complete scenario files:
name: "Composite test"
imports:
- "common-setup.yaml"
- "common-cleanup.yaml"
tests:
- name: "My test"
tool: "zqk_object_list"
args:
kind: "backlog_item"
Assertions
Validate tool responses:
tests:
- name: "Create object"
tool: "zqk_create_object_interactive"
args:
kind: "backlog_item"
expected:
success: true
has_fields:
- "session_id"
- "filled_template"
equals:
kind: "backlog_item"
matches:
session_id: "^interactive-.*"
Result Storage and Dependencies
Store results and use them in later steps:
setup:
- name: "Get milestone"
tool: "zqk_object_get"
args:
id: "MIL-001"
store_result: "milestone"
tests:
- name: "Create item with milestone"
tool: "zqk_create_object_interactive"
depends_on:
- "milestone"
args:
kind: "backlog_item"
milestone_refs:
- "${milestone.id}" # Variable interpolation (future)
Usage
package main
import (
"github.com/zqk-os/zqk/pkg/mcp/testing"
)
func main() {
loader := testing.NewScenarioLoader("./test-scenarios")
scenario, err := loader.LoadScenario("my-test.yaml")
if err != nil {
log.Fatal(err)
}
executor := testing.NewScenarioExecutor(server)
results, err := executor.RunScenario(scenario)
if err != nil {
log.Fatal(err)
}
// Process results
}
File Organization
test-scenarios/
├── scenarios/
│ ├── interactive-creation.yaml
│ └── object-query.yaml
├── data/
│ ├── references.yaml
│ ├── large-reference-list.yaml
│ └── test-data.yaml
└── common/
├── setup.yaml
└── cleanup.yaml