Skip to main content
BlockX 把测试按”保护哪一层真相”分开:core 单测保护状态机,adapter 测试保护协议映射,process E2E 保护单个进程的对外 contract,contract / system E2E 保护组件之间的边界,perf 单独保护吞吐与时延。这一页只讲怎么跑、在哪、要什么;环境搭建见 本地开发环境

测试分层总览

e2e/perf 外,所有层都被 go test ./... 覆盖;需要 Python executor 的层在 venv 缺失时会 t.Skip 而不是失败(internal/testutil/python.goRequirePythonModules)。 几点补充:
  • make test 给所有包加了 -short,但除 perf 外没有一层因此被跳过,所以 make test 就是全量 E2E。
  • cmd/syncinvokerMakefileFAST_TEST_PACKAGES 中剔除后逐文件跑:每个测试都起独立进程 + Python executor,perf 用例又不受 -short 保护,整包一起跑会超出预算;逐文件跑让 SYNCINVOKER_TEST_TIMEOUT 成为每个文件的预算,并分别产出覆盖率再合并。
  • 单个模块的 -run 过滤示例:go test ./internal/worker/core/ -run TestWorkerCore_RequestTaskSlot
  • Python 单个模块:PYTHONPATH=python uv run --project python python -m unittest python.tests.test_executor_protocol_contract

测试组织约定

三份文件定义了怎么放、怎么命名:
  • blockx 仓库 docs/specs/worker-test-organization.md:适用于 internal/worker/**cmd/worker/cmd/bundle_worker/。三个层级:core unit(只测 Sans-IO 核心,禁止引入 HTTP、进程或 Python)、adapter integration(handler / subscriber / orchestrator / executor pool,允许 fake 与 stub)、process e2e(真实 cmd/worker 进程,只放在 cmd/<entrypoint>/)。文件名表达实现边界:worker_test.godispatcher_retry_test.gohandler_protocol_test.goworker_process_<slice>_test.go;禁止 misc_test.goe2e_test.go 这类弱语义名。顶层函数 Test<Boundary>_<Theme>t.Run 名必须写”场景 + 预期结果”。拆分阈值:一个文件超过 3 个逻辑块、一个顶层测试超过 8 个 t.Run、一个 process E2E 文件超过 6 个独立 contract。
  • blockx 仓库 docs/specs/python-test-organization.mdpython/tests/ 一个文件一个实现边界,test_<boundary>.pyTestCase<Boundary><Theme>Test;方法名”场景 + 预期结果”,例如 test_deadline_after_resume_prevents_followup_waiting
  • blockx 仓库 docs/specs/system-e2e-testing.md:contract 文件叫 contract_<behavior>_test.go、函数 TestContractE2E_<Boundary>_<Behavior>;system 文件叫 system_<behavior>_test.go、函数 TestSystemE2E_<Behavior>;一个 system 文件只放一个场景族。拿不准放哪层时默认放 contract 层。
AGENTS.md 的测试指南补充四条:Go 测试与实现放同目录的 *_test.go;状态机、协议映射、core/adapter 边界优先用表驱动;新行为要同时覆盖 happy path 与 spec 里的失败 / 超时路径;改了协议或生命周期语义就在同一个变更里更新对应 spec。
不同层断言不同真相:core 单测断状态迁移、幂等、命令输出、TTL 与结果收敛;adapter 测试断协议映射与错误翻译;process E2E 只断外部可观察行为(gRPC 返回、终态、日志字段)。不要在 E2E 里穷举 DispatcherCore 的 retry 矩阵,也不要用进程测试替代 handler 的错误映射断言。

测试工具与替身

testutil 没有 fake clock。core 的方法显式接收 now(例如 WorkerCore.HandleRequestTaskSlot(taskID string, ttlMs int64, now int64)),core 单测直接传时间值即可。

CI

.github/workflows/test.yml 在 PR 到 dev、push 到 dev 与手动触发时运行;除 Deploy Script Tests 外的 job 都通过 GitHub App token 配置 github.com/Chaintable/* 私有模块访问: .github/workflows/build.yml 只在推 tag 时构建并推送镜像,不跑测试。

性能测试

e2e/perf 每个用例自起 etcd + coordinator + worker,用 PERF_* 环境变量控制规模,checkSLOPERF_SLO_MULTIPLIER 放大后的阈值断言时延,阈值来源见 docs/specs/perf-methodology.md 整包由 e2e/perf/short_test.goTestMain 门控:BLOCKX_RUN_PERF 不为 1 时直接返回,一个用例都不跑。
  • 主要变量:PERF_N(每场景 task 数,默认 20)、PERF_C(并发,默认 4)、PERF_EXECUTOR_COUNT(默认 4)、PERF_IO_READS(默认 5)、PERF_SLO_MULTIPLIER(默认 1.0,CI 用 5)。test.sh 自身读 PERF_CPUPERF_MEMPERF_TIMEOUT,并透传 WORKER_CPU_PROFILEWORKER_TRACECOORDINATOR_CPU_PROFILECOORDINATOR_TRACE
  • 文件按 docs/specs/perf-methodology.md §3 的 Stage 命名:s0_framework_*s1_builder_*s2_call_count_*s3_cpu_*s4_io_*s5_plugin_*phase_*m3_stream_build_test.gocalibration_test.go 是规范之前的遗留文件。helpers_test.gorunScenario / startPerfInfra* / checkSLO 等脚手架。
  • 产物落 e2e/perf/_artifacts/(已 gitignore):<TestName>_<subtest>/spans.jsonlwith_trace 子测试的 OTel span,开关 BLOCKX_OTEL_SPAN_FILE + BLOCKX_OTEL_UDS_EVENTS=1)、<TestName>/*.pb.gz(pprof)、pyspy/
  • 离线分析 span:python3 analyze_spans.py e2e/perf/_artifacts/<TestName>_with_trace/spans.jsonl。脚本在仓库根,只接受一个位置参数,默认 /tmp/blockx_spans.jsonl
  • 报告:docs/specs/perf-test-report.md(v1 主报告)、perf-test-report-appendix.md(v1 附录)、perf-test-report-v2.md(当前唯一基线,cgroup 12 vCPU / 32G)、perf-capability-backend-report.md(能力后端框架税)。复现步骤在 docs/specs/perf-test-how-to-v2.md,方法论在 docs/specs/perf-methodology.md
  • cmd/perf 是打已部署环境的负载 CLI(-coordinator-n-c-mode),不属于 go testcmd/bundle-loadgen 是 bundle 集群的负载生成器,自带纯单测。

相关文档

  • 本地开发环境:venv、CGO、最小 worker 启动。
  • 贡献流程:PR 里要写验证命令。
  • WorkerCoordinatorSync InvokerBundle 集群:各组件页的”测试”小节指向对应文件。
  • blockx 仓库 docs/specs/worker-test-organization.mddocs/specs/python-test-organization.mddocs/specs/system-e2e-testing.md:组织规范。
  • blockx 仓库 docs/specs/perf-methodology.mddocs/specs/perf-test-how-to-v2.mde2e/perf/README.md:性能测试方法、复现与用例索引。
  • blockx 仓库 AGENTS.md:命令与测试指南的权威来源。