关于 ark-chainsaw-testing
帮助 Ark 开发者运行和编写 Chainsaw 端到端测试的技能。它提供测试命令、目录结构示例,以及避免脆弱检查方式的指导。
主要功能
- 01运行全部或指定测试
- 02提供测试目录结构示例
- 03说明 CRD 条件检查方式
- 04区分 Query 等待与断言
- 05提供真实 LLM 测试环境变量
适用场景
- 01运行 Ark 标准端到端测试
- 02调试失败的 Chainsaw 测试
- 03为 Ark 资源编写测试
- 04验证 Query 完成后的响应字段
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mckinsey/ agents-at-scale-ark --skill ark-chainsaw-testing安装后在 Claude Code 中输入/ark-chainsaw-testing确认已加载。
附带文件examples.md
详细介绍
Ark 链锯测试
为 Ark 资源运行并编写 Chainsaw 端到端测试。
运行测试
# Run all standard tests
(cd tests && chainsaw test --selector 'standard')
# Run specific test
chainsaw test ./tests/query-parameter-ref --fail-fast
# Debug mode - keep resources on failure
chainsaw test ./tests/query-parameter-ref --skip-delete --pause-on-failure
编写测试
请参阅 tests/CLAUDE.md,了解全面的模式。
如需查看展示正确测试编写模式的完整可运行示例,请参阅 examples.md。
测试结构
tests/my-test/
├── chainsaw-test.yaml # Test definition
├── mock-llm-values.yaml # Mock LLM config (if needed)
├── README.md # Required documentation
└── manifests/
├── a03-model.yaml # Model before Agent
├── a04-agent.yaml # Agent before Query
└── a05-query.yaml # Query last
反模式
使用 kubectl wait 检查 CRD 条件
切勿使用 kubectl wait --for=condition=Established 检查 CRD 是否就绪。当 .status.conditions 为 nil 时,此命令会因类型错误而崩溃(这是已知的 kubectl bug:kubernetes/kubernetes#66439):
error: .status.conditions accessor error: <nil> is of the type <nil>, expected []interface{}
改用带有 JMESPath 的 chainsaw assert——它会优雅地轮询,并等待字段出现:
# Bad - crashes if .status.conditions is nil
- script:
content: |
kubectl apply -f my-crd.yaml
kubectl wait --for=condition=Established crd/my-crd.example.com --timeout=60s
# Good - polls until condition appears, no nil crash
- script:
content: |
kubectl apply -f my-crd.yaml
- assert:
resource:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: my-crd.example.com
status:
(conditions[?type == 'Established']):
- status: "True"
此模式将脆弱的超时转换为明确的条件检查。对于任何 .status.conditions 初始值可能为 nil 的资源,同样适用。
使用 assert 而非 wait 等待 Query 完成
切勿使用 assert 等待 Query 完成。assert 会反复轮询 API 服务器;wait 使用 Kubernetes watch(由事件驱动),速度更快且开销更低:
# Bad - polls every few seconds, hammers the API server
- assert:
resource:
apiVersion: ark.mckinsey.com/v1alpha1
kind: Query
metadata:
name: test-query
status:
phase: done
# Good - uses a watch, fires once the condition is set
- wait:
apiVersion: ark.mckinsey.com/v1alpha1
kind: Query
name: test-query
timeout: 4m
for:
condition:
name: Completed
value: 'True'
仅在 wait 确认查询已完成后,才使用 assert——也就是说,用于验证完成后的响应字段。请将二者保留为独立步骤,以明确时序:
- name: wait-for-query-completion
try:
- wait:
apiVersion: ark.mckinsey.com/v1alpha1
kind: Query
name: test-query
timeout: 4m
for:
condition:
name: Completed
value: 'True'
- name: validate-response
try:
- assert:
resource:
apiVersion: ark.mckinsey.com/v1alpha1
kind: Query
metadata:
name: test-query
status:
(response != null): true
phase: done
使用 Shell 脚本检查条件
当 chainsaw 断言能够声明式地表达检查时,避免使用 Shell 脚本结合 kubectl get 和 jq 来验证资源状态。Shell 脚本遇到意外的 nil 值时会立即失败;断言则会重试,直到条件满足或超时。
# Bad - fails immediately if field is absent
- script:
content: |
val=$(kubectl get myresource foo -o jsonpath='{.status.phase}')
[ "$val" = "Ready" ] || exit 1
# Good - retries until condition is true
- assert:
resource:
apiVersion: example.com/v1
kind: MyResource
metadata:
name: foo
status:
phase: Ready
环境变量
用于真实的大模型测试(非 mock-llm):
export E2E_TEST_AZURE_OPENAI_KEY="your-key"
export E2E_TEST_AZURE_OPENAI_BASE_URL="your-endpoint"