测试基础设施
测试基础设施
相关源文件
本章引用的主要源码文件:
.claude/mcp.jsonLICENSEdocs/TERMINAL_BENCH.mdscripts/audit_terminal_bench_submission.pyscripts/benchmark_swarm.pyscripts/benchmark_takehome.pyscripts/jcode_harbor_agent.pyscripts/record_demo.shscripts/run_terminal_bench_campaign.pyscripts/run_terminal_bench_harbor.shscripts/screenshot_watcher.shscripts/test_caching_detailed.pyscripts/test_reload.pyscripts/test_soft_interrupt.pyscripts/test_swarm.pyscripts/test_swarm_debug.pysrc/ambient.rssrc/ambient_runner.rssrc/channel.rssrc/id.rssrc/notifications.rssrc/safety.rssrc/server/client_api.rssrc/server/client_disconnect_cleanup.rssrc/tool/ambient.rssrc/tui/app/remote/reconnect.rstests/e2e/ambient.rstests/e2e/binary_integration.rstests/e2e/burst_spawn.rstests/e2e/main.rstests/e2e/provider_behavior.rstests/e2e/safety.rstests/e2e/session_flow.rstests/e2e/test_support/mod.rstests/e2e/transport.rs
jcode 的测试基础设施是一个多层系统,旨在确保 TUI、Agent 运行时、服务端-客户端协议以及后台 Ambient 模式的可靠性。它涵盖了从底层单元测试到复杂的 Python 驱动集成脚本,这些脚本模拟了真实的开发者工作流和大规模基准测试。
端到端测试套件
主要的测试载体是位于 tests/e2e/ 目录下的端到端(E2E)测试套件。这些测试验证了会话的完整生命周期——从用户输入到工具执行和 Provider 流式响应——且无需实际的 LLM API 密钥。
模拟提供方与测试环境
该套件使用了一个 MockProvider tests/e2e/test_support/mod.rs:6,它实现了 Provider 特征 tests/e2e/test_support/mod.rs:13。这使得测试可以预置特定的 LLM 响应(包括工具调用和内容块),以验证 Agent tests/e2e/test_support/mod.rs:10 和 Server tests/e2e/test_support/mod.rs:14 的响应方式。
TestEnvGuard tests/e2e/test_support/mod.rs:56-91 通过以下方式确保隔离性:
- 为
JCODE_HOME创建一个临时目录tests/e2e/test_support/mod.rs:78。 - 设置
JCODE_TEST_SESSION=1以绕过某些仅在生产环境生效的安全检查tests/e2e/test_support/mod.rs:80。 - 管理一个全局的
JCODE_HOME_LOCK,以防止并发的 E2E 测试干扰共享资源tests/e2e/test_support/mod.rs:34-54。
测试模块
- 会话流程:验证
run_turn逻辑,包括多轮对话和会话恢复tests/e2e/session_flow.rs。例如,test_multi_turn_conversation确保 Agent 在多次调用之间保持状态tests/e2e/provider_behavior.rs:4-40。 - Ambient 模式:通过模拟定时任务并验证后台循环来测试
AmbientRunnertests/e2e/ambient.rs。 - 安全性:通过确保受限工具触发权限工作流来验证
SafetySystemtests/e2e/safety.rs。 - 传输层:比较 Unix 域套接字(UDS)和 WebSocket 网关的行为
tests/e2e/transport.rs。 - 二进制集成:直接测试编译后的
jcode二进制文件,以确保 CLI 标志和环境变量的行为符合预期tests/e2e/binary_integration.rs。 - 突发启动:压力测试服务器处理快速并发客户端连接到已恢复会话的能力
tests/e2e/burst_spawn.rs:171-210。
来源: tests/e2e/main.rs:1-17, tests/e2e/test_support/mod.rs:1-124, tests/e2e/provider_behavior.rs:4-70, tests/e2e/burst_spawn.rs:171-210
调试套接字与无头测试
jcode 服务器暴露了一个调试套接字,允许外部工具检查和操控服务器的内部状态。
实现与控制
调试套接字支持诸如 server:info 之类的命令,用于验证服务器是否就绪 tests/e2e/test_support/mod.rs:184。Client 结构体提供了通过 connect_debug_with_path 连接到此套接字的辅助方法 src/server/client_api.rs:34-42。
数据流:通过调试套接字的外部控制
下图展示了外部脚本如何通过调试控制机制与内部 Agent 状态进行交互。
来源: tests/e2e/test_support/mod.rs:167-192, src/server/client_api.rs:30-42, src/tui/app/remote/reconnect.rs:18-27
Python 集成与基准测试
scripts/ 目录下的一组 Python 脚本负责处理复杂的集成和基准测试场景。
Harbor 与 Terminal-Bench
jcode 与 Harbor 环境集成,用于在 Terminal-Bench 上进行评估 docs/TERMINAL_BENCH.md。
- JcodeHarborAgent:一个专门的 Agent 包装器,用于在容器化的基准测试环境中运行
jcodescripts/jcode_harbor_agent.py:176-185。 - 活动管理:
run_terminal_bench_campaign.py编排大规模运行,跟踪成功率并生成results.jsonlscripts/run_terminal_bench_campaign.py:147-152。
集成脚本
| 脚本 | 用途 |
|---|---|
test_swarm.py | 编排多 Agent 协调测试 scripts/test_swarm.py。 |
test_reload.py | 验证跨服务器重启/切换的状态持久化 scripts/test_reload.py。 |
test_soft_interrupt.py | 模拟流式传输过程中的用户中断 scripts/test_soft_interrupt.py。 |
audit_terminal_bench_submission.py | 在提交前验证基准测试结果 scripts/audit_terminal_bench_submission.py。 |
来源: scripts/jcode_harbor_agent.py:176-200, scripts/run_terminal_bench_campaign.py:119-152, src/tui/app/remote/reconnect.rs:188-190, scripts/test_reload.py:1-10, scripts/test_swarm.py:1-10
后台主动与安全性测试
对 AmbientRunner 和 SafetySystem 进行测试,以确保后台任务和通知功能正常运行。
通知分发器
NotificationDispatcher src/notifications.rs:50-54 在多个渠道上进行测试:
- ntfy.sh:带优先级的推送通知
src/notifications.rs:174-184。 - 桌面:本地机器通知
src/notifications.rs:187-197。 - 邮件:使用
build_permission_email_html为权限请求发送富文本 HTML 邮件src/notifications.rs:106-130。
后台主动生命周期数据流
来源: src/notifications.rs:50-130, src/ambient.rs:68-83, src/tool/ambient.rs:19-41, src/ambient_runner.rs:1-4
TUI 与性能工具
tui_bench 二进制文件
tui_bench 工具用于分析渲染管线,特别关注 IncrementalMarkdownRenderer 和布局计算。
重载与切换测试
测试 TUI 从服务器重载中恢复的能力,通过模拟 RemoteDisconnectReason src/tui/app/remote/reconnect.rs:50-69 并验证 RemoteRunState src/tui/app/remote/reconnect.rs:18-27 是否正确地在 WaitingForReload 阶段之间进行转换 src/tui/app/remote/reconnect.rs:219。cleanup_client_connection src/server/client_disconnect_cleanup.rs:55-78 中的服务端逻辑确保在检测到重载标记时,Agent 被标记为 Reloading 而非 Crashed src/server/client_disconnect_cleanup.rs:33-38。
来源: src/tui/app/remote/reconnect.rs:15-69, src/tui/app/remote/reconnect.rs:208-220, src/server/client_disconnect_cleanup.rs:21-38