跳转至

KeenTune 测试计划

测试环境要求

组件 端口 服务
keentuned 9871 systemctl start keentuned
keentune-brain 9872 setsid python3 -c "from brain.brain import main; main()"
keentune-target 9873 systemctl start keentune-target
keentune-bench 9874 systemctl start keentune-bench

前置条件: - systemctl stop tuned(keentuned 与 tuned 冲突) - /etc/keentune/keentuned/conf/keentuned.conf 中配置 sysctl.json + wrk_http_long.json - /var/keentune/ 工作目录自动创建 - 多机测试需配置 SSH 免密登录


一、冒烟测试(Smoke Test)<10 分钟>

目标:快速验证核心链路可用,每次构建后必跑。

# 测试项 命令 断言
S1 服务可用 curl -s localhost:9871/status HTTP 200
S2 brain 可用 curl -s localhost:9872/avaliable HTTP 200
S3 target 可用 curl -s localhost:9873/status HTTP 200
S4 bench 可用 curl -s localhost:9874/status HTTP 200
S5 keentune help keentune help 退出码 0,含 Usage + Available Commands
S6 keentune version keentune -v 退出码 0,含 keentune version
S7 keentune init keentune init 退出码 0,含 Init success/etc/keentune/keentuned/conf/init.yaml 存在
S8 REST /cmd curl -s -X POST localhost:9871/cmd -d '{"cmd":"keentune --version"}' HTTP 200,"suc":true
S9 REST /status curl -s localhost:9871/status HTTP 200

二、BVT / 功能验证(Build Verification Test)<1 小时

目标:覆盖所有核心功能的正向路径。

2.1 参数动态调优(param tune)

# 测试项 命令 断言
B1 param tune 基础 keentune param tune -i 10 --job param1 退出码 0;日志含 Step1-6 + [BEST] Tuning improvement
B2 param list keentune param list 显示 sysctl.json + wrk_http_long.json
B3 param jobs keentune param jobs 显示 param1 且状态 finish
B4 param dump echo y \| keentune param dump -j param1 退出码 0;dump successfully/var/keentune/keentuned/profile/param1_group1.conf 存在
B5 param rollback keentune param rollback 退出码 0;rollback finishedsysctl -n 值恢复
B6 param delete echo y \| keentune param delete --job param1 退出码 0;delete successfully/var/keentune/keentuned/tuning_workspace/param1/ 不存在

2.2 静态 Profile

# 测试项 命令 断言
B7 profile list keentune profile list 显示内置 profile + param1_group1.conf
B8 profile info keentune profile info --name cpu_high_load.conf 退出码 0;显示 [sysctl]
B9 profile set keentune profile set param1_group1.conf 退出码 0;Succeededprofile list 显示 active
B10 profile rollback keentune profile rollback 退出码 0;rollback finished;恢复到备份值
B11 profile generate echo y \| keentune profile generate -n param1_group1.conf -o param1_group1 退出码 0;generate successfully;JSON 文件存在
B12 profile delete echo y \| keentune profile delete --name param1_group1.conf 退出码 0;delete successfully
B13 profile delete (内置) echo y \| keentune profile delete --name cpu_high_load.conf 退出码 1;not supported to delete

2.3 敏感度分析(sensitize)

# 测试项 命令 断言
B14 sensitize train echo y \| keentune sensitize train --data param1 --job param1 退出码 0;日志含 Step1-3 + identification results successfullyknobs.json 存在
B15 sensitize jobs keentune sensitize jobs 显示 param1
B16 sensitize delete echo y \| keentune sensitize delete --job param1 退出码 0;delete successfully;目录不存在

2.4 REST API

# 测试项 命令 断言
B17 REST /write curl -X POST localhost:9871/write -d '{"name":"test","data":"hello"}' HTTP 200;文件写入成功
B18 REST /read curl -X POST localhost:9871/read -d '{"name":"test"}' HTTP 200;返回之前写入的 data
B19 REST /benchmark_result curl -X POST localhost:9871/benchmark_result -d '<valid_data>' HTTP 200 (非 localhost 限制)
B20 REST /sensitize_result curl -X POST localhost:9871/sensitize_result -d '<valid_data>' HTTP 200

三、异常/可靠性测试 <2 小时

目标:验证错误处理和边界条件。

3.1 param tune 异常输入

# 测试项 命令 期望
R1 缺少 --job keentune param tune -i 10 退出码 1;Incomplete or Unmatched command
R2 --job 无值 keentune param tune -i 10 --job 退出码 1;flag needs an argument
R3 --job 空串 keentune param tune -i 10 --job '' 退出码 1
R4 --job 空格 keentune param tune -i 10 --job ' ' 退出码 1
R5 重复 job keentune param tune -i 10 --job param1(两次) 退出码 1;already exists
R6 -i 无值 keentune param tune --job test -i 退出码 1;invalid argument
R7 -i 负数 keentune param tune -i -1 --job test 退出码 1;iteration >= 10
R8 -i 0 keentune param tune -i 0 --job test 退出码 1;iteration >= 10
R9 -i 小于10 keentune param tune -i 5 --job test 退出码 1;iteration >= 10
R10 -i 浮点 keentune param tune -i 5.2 --job test 退出码 1
R11 -i 字符串 keentune param tune -i hello --job test 退出码 1
R12 job 含 / --job /root/test 退出码 1;find unexpected characters '/'
R13 job 含 , --job test,a 退出码 1;find unexpected characters ','
R14 job 含 + --job test+1 退出码 1
R15 job 合法字符 --job _test1 退出码 0(下划线/数字可接受)

3.2 并发/中断测试

# 测试项 命令 期望
R16 tune 中途 stop 启动 keentune param tune -i 100 --job stop_test,执行 keentune param stop Abort parameter optimization job;jobs 状态为 stopped
R17 tune 期间 delete 启动 tuning → 中途 echo y \| keentune param delete --job stop_test 退出码 0;目录清理
R18 tune 期间 rollback 启动 tuning → 中途 keentune param rollback 退出码 1(有 running job)或回滚成功
R19 重复 init keentune init 执行两次 第二次提示已初始化或覆盖确认

3.3 profile 异常输入

# 测试项 命令 期望
R20 set 不存在的 profile keentune profile set not_exist.conf 退出码 1
R21 无 --name keentune profile info 报错或使用默认
R22 delete 不存在的 profile echo y \| keentune profile delete --name not_exist.conf 退出码 1

四、回归测试(Regression)<3 小时

目标:关键场景端到端验证,确保核心功能无回退。

4.1 全链路:调优→dump→set→rollback

# 测试项 流程
RG1 完整调优闭环 initparam tune -i 10 --job rg1param dumpprofile set rg1_group1.confprofile rollbackparam delete
RG2 敏感度闭环 initparam tune -i 30sensitize trainsensitize jobssensitize deleteparam delete

4.2 Tuned Profile 兼容性

# 测试项 验证点
RG3 latency_performance profile set latency_performance.confsysctl -n vm.swappiness = 10
RG4 throughput_performance profile set throughput_performance.confsysctl -n vm.dirty_ratio = 40
RG5 network_throughput profile set network_throughput.confsysctl -n net.ipv4.tcp_rmem = "4096 87380 16777216"
RG6 virtual_host profile set virtual_host.confsysctl -n vm.dirty_background_ratio = 5
RG7 oracle profile set oracle.confsysctl -n kernel.shmmni = 4096
RG8 realtime profile set realtime.conf → irqbalance banned_cpus / systemd CPUAffinity
RG9 hpc_compute profile set hpc_compute.conf → THP = always

4.3 REST API 安全性

# 测试项 验证点
RG10 /cmd 命令注入 POST {"cmd":"keentune param tune -i 10 --job x1 && rm -rf /"}
RG11 /cmd 非法命令 POST {"cmd":"rm -rf /"}
RG12 /cmd 远程 IP 从非 localhost 访问
RG13 /write 远程 IP 从非 localhost 访问
RG14 /read 远程 IP 从非 localhost 访问

五、多场景 / 多算法测试 <6 小时

目标:覆盖不同参数域和算法组合。

5.1 多参数域

# 测试项 参数文件 Benchmark
M1 sysctl 域 sysctl.json wrk_http_long.json
M2 nginx 域 nginx_conf.json wrk_http_long.json
M3 MySQL 域 mysql.json sysbench_mysql_read_write.json
M4 fio 域 fio.json fio benchmark
M5 iperf 域 iperf.json iperf benchmark
M6 sysbench 域 sysbench.json sysbench

5.2 多算法迭代

# 算法类型 算法 命令
M7 调优 random 修改 conf AUTO_TUNING_ALGORITHM=random → tune
M8 调优 hord 修改 conf → tune
M9 调优 lamcts 修改 conf → tune
M10 调优 bgcs 修改 conf → tune
M11 调优 tpe 修改 conf → tune
M12 敏感度 LASSO 修改 conf → sensitize train
M13 敏感度 MI(互信息) 修改 conf → sensitize train
M14 敏感度 GP(高斯过程) 修改 conf → sensitize train
M15 敏感度 XGBTotalGain 修改 conf → sensitize train
M16 敏感度 Xsen 修改 conf → sensitize train
M17 敏感度 SHAPKernel 修改 conf → sensitize train

5.3 多 Target 拓扑(需多机环境)

# 拓扑 描述
M18 2 group group1=localhost(sysctl), group2=target(nginx)
M19 3 group group1=localhost, group2=target, group3=bench
M20 4 group 四台机器各一 group,验证跨机参数下发和一致性

六、性能 / 压力测试

6.1 算法性能对比

# 测试项 描述
P1 算法收敛效率 对比 random/hord/tpe/lamcts/bgcs 在相同参数空间达到相同提升所需的迭代次数
P2 特征选择精度 对比 LASSO/MI/GP/XGBTotalGain/SHAP 识别关键参数的准确率
P3 大参数空间 100+ kbobs 参数空间下的搜索效率(算法是否能有效降维)

6.2 稳定性

# 测试项 描述
P4 长时间运行 连续 72 小时循环执行 init → tune → dump → set → rollback → delete,检查内存泄漏和服务存活
P5 高频启停 systemctl restart keentuned 连续 100 次,检查启动成功率和 DBus 注册
P6 大批量 job 创建 100 个连续 tuning job,检查 CSV 文件读写和目录管理

6.3 并发

# 测试项 描述
P7 DBus 并发 多个 keentune CLI 进程同时发起请求,检查互斥锁
P8 REST 并发 ab -n 1000 -c 50 localhost:9871/status,检查响应时间和内存

七、Go 单元测试

cd daemon && go test -mod=vendor -v ./...

覆盖:lock、service 创建、配置加载、param/profile/sensitize 操作、rollback、watch、abort 等 DBus 方法。

# 测试文件 测试数 覆盖内容
G1 daemon/service_test.go ~50+ gomonkey mock:lock 机制、service 创建/重载、param 删除、profile 操作、sensitize、tuning workflow、train、rollback、config watch、abort、dump

八、安装/部署测试

# 测试项 描述
I1 RPM 安装 rpm -ivh keentuned-*.rpm → 检查二进制 /usr/bin/keentuned, /usr/bin/keentune,配置 /etc/keentune/keentuned/,systemd unit
I2 RPM 卸载 rpm -e keentuned → 检查文件清理、服务移除
I3 源码编译 go mod vendor && make daemon && make cli → 检查 pkg/keentuned, pkg/keentune
I4 make install make install → 验证二进制、配置、man page、bash completion 安装位置
I5 systemd 启动 systemctl start keentunedsystemctl is-active keentuned = active
I6 端口冲突 端口 9871 被占用时 keentuned 启动失败,有明确错误提示
I7 tuned 冲突 tuned.service 运行中 → keentuned 启动警告

九、测试执行矩阵

阶段 测试集 耗时 触发条件
每次 commit 冒烟测试 (S1-S9) <10 min CI / pre-commit
每次 MR/PR 冒烟 + BVT (S1-S9, B1-B20) <1 h CI pipeline
每日构建 冒烟 + BVT + 异常测试 (R1-R22) <2 h Nightly CI
每周构建 全功能回归 (R1-R22, RG1-RG14) <3 h Weekly CI
发版前 全部(含多场景、性能、稳定性、安装) <24 h Release gate
按需 长时间稳定性 (P4) 72 h 手动触发
按需 多机拓扑 (M18-M20) 数小时 手动触发
按需 Go 单元测试 (G1) <5 min 代码变更触发

十、已知限制和待补测试

10.1 不跑的测试(test 目录中存在但默认不执行)

文件 原因
test_keenopt.py (30+ tests) 需要 keenopt Python 库,且 keenopt_suite 构建后未加入返回 suite
test_keenopt_performance.py (8 tests) 同上,性能对比非功能验证
test_wrk_benchmark.py (24 tests) 执行时间过长,需要 wrk HTTP 服务
test_long_stability.py 需手动设置 time_limit 属性,执行数小时到数天
test_rollback_all.py 被注释掉
test/installation/ 需要干净环境,不在 make check

10.2 需要补充的测试

领域 缺什么
Go 单元测试 只在 daemon 有测试;common/, modules/, api/ 包无测试
mock 测试 无 brain/target/bench 的 mock,集成测试依赖完整的 4 服务
协议测试 无 DBus 接口 schema 验证测试
配置热加载 conf watcher 的 fsnotify 测试仅在 Go unit test 中 mock,无集成验证
brain 端到端 无 GetAvailable/Acquire/Feedback/Best 的独立 mock 测试
benchmark 格式校验 benchmark 脚本输出 key=value,key=value 格式的验证测试不存在
日志轮转 file-rotatelogs 的轮转测试不存在
signal 处理 SIGTERM/SIGINT/SIGQUIT 优雅退出测试不存在
数据一致性 tuning/sensitize CSV 文件在异常退出时是否损坏

💬 评论