文档目录

第 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

五、三条纪律

  1. 每次测试前先跑 docs/code/01-metrics-and-slo/07-experiment-metadata.md 的采集脚本——从这一章起,环境元数据开始真正影响结论。
  2. 先验证「实际 QPS == 设定 QPS」再看延迟——否则压测机可能才是瓶颈。
  3. 先做阳性对照:故意留一个已知瓶颈(比如没索引的列),确认你的测试方法能发现它。