第 3 章配套代码索引
这一章的代码开始真的搭环境(Testcontainers、Docker、k6)。从这章起,你的数据开始具备可迁移性。
一、文件清单
| 文件 | 对应小节 | 内容 |
|---|---|---|
| 02-component-benchmark.md | 3.2 组件基准 | Testcontainers + 采样循环 + 四件事分开测 |
| 03-integration-and-e2e.md | 3.3 集成基准与全链路 | Ktor 集成基准 + k6 全链路脚本 |
| 04-load-profiles.md | 3.4 负载曲线 | 阶梯 / 恒定 / 尖峰三种 k6 脚本 |
| 05-soak-testing.md | 3.5 浸泡测试 | 浸泡脚本 + 趋势分析与泄漏判定 |
| 06-breakdown-testing.md | 3.6 破坏性测试 | 压到崩溃 + 现场取证 + 恢复测量 |
| 07-selection-and-cost.md | 3.7 层级选择与成本 | 层级选择辅助 + 测试预算计算 |
| 08-lab3.md | 3.8 Lab 3 | Lab 3 的骨架与记录模板 |
3.1(金字塔总览)没有配套代码——那一节是框架性的。
二、新增依赖
// build.gradle.kts
dependencies {
// 服务
implementation("io.ktor:ktor-server-core:3.0.0")
implementation("io.ktor:ktor-server-netty:3.0.0")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")
// 数据访问
implementation("com.zaxxer:HikariCP:5.1.0")
implementation("org.postgresql:postgresql:42.7.3")
// 组件基准(test 源集)
testImplementation("org.testcontainers:postgresql:1.20.1")
testImplementation("org.testcontainers:junit-jupiter:1.20.1")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.9.0")
// 集成基准
testImplementation("io.ktor:ktor-server-test-host:3.0.0")
testImplementation("io.ktor:ktor-client-cio:3.0.0")
}
三、需要 Docker
Testcontainers 需要本地 Docker 守护进程:
docker info > /dev/null 2>&1 && echo "Docker 可用" || echo "❌ 请先启动 Docker"
如果不能用 Docker:退而求其次的方案是连一个本地安装的 PostgreSQL,但必须在实验元数据里记录它的版本与配置。绝不要退回 H2(第 3.2 节的理由)。
四、实验目录约定
docs/experiments/E03-two-level-test/
├── README.md
├── scripts/ # k6 脚本快照(冻结)
└── results/
├── env.txt # 自动采集(第 1 章 1.7 节)
├── component-bench.txt
├── integration-bench.txt
└── k6-summary.json
五、三条纪律
- 每次测试前先跑
docs/code/01-metrics-and-slo/07-experiment-metadata.md的采集脚本——从这一章起,环境元数据开始真正影响结论。 - 先验证「实际 QPS == 设定 QPS」再看延迟——否则压测机可能才是瓶颈。
- 先做阳性对照:故意留一个已知瓶颈(比如没索引的列),确认你的测试方法能发现它。