openEuler/QoS-Deployment-Test:从零开始编写自定义测试用例的完整指南
【免费下载链接】QoS-Deployment-TestDocker-based openEuler Online-Offline Co-scheduling Test Suite.项目地址: https://gitcode.com/openeuler/QoS-Deployment-Test
前往项目官网免费下载:https://ar.openeuler.org/ar/
openEuler在线/离线混部QoS资源隔离能力验证测试套件是一个强大的Docker-based测试框架,专门用于验证openEuler内核的CPU、内存、网络和IO四维QoS资源隔离机制。对于想要扩展测试场景或创建自定义测试用例的用户来说,掌握如何编写测试用例是至关重要的技能。本文将为您提供从零开始编写自定义测试用例的完整教程,帮助您快速上手这个专业的测试框架。🚀
为什么需要自定义测试用例?
在实际的生产环境中,业务场景千变万化,标准测试用例可能无法完全覆盖您的特定需求。通过编写自定义测试用例,您可以:
- 模拟特定的业务负载模式
- 测试自定义的资源隔离策略
- 验证特定硬件配置下的性能表现
- 评估不同QoS参数组合的效果
- 创建回归测试以确保系统稳定性
测试框架架构解析
在开始编写自定义测试用例之前,让我们先了解QoS-Deployment-Test项目的整体架构:
├── start.sh # 主入口脚本 ├── common/common.sh # 公共函数库 ├── config/ # 配置文件目录 ├── deployment/ # Docker部署脚本 ├── init/ # 测试初始化与清理脚本 ├── benchmark/ # 基准测试执行脚本 └── output/ # 测试结果输出目录这个结构清晰的目录组织使得添加新测试用例变得非常简单。每个测试类型(CPU、MEM、NET、IO)都有自己独立的目录结构,遵循相同的设计模式。
编写自定义测试用例的5个步骤
步骤1:创建测试配置
首先,在config/目录下创建您的测试配置文件。例如,如果您要创建一个名为"DISK"的磁盘性能测试,可以创建config/disk.conf:
# DISK QoS Co-deployment Test — Benchmark Parameters # ============================================================================== # 离线磁盘I/O负载参数 OFFLINE_DISK_UTIL=70 OFFLINE_IO_PATTERN=randwrite # 在线业务参数 ONLINE_DISK_THREADS=4 ONLINE_IO_SIZE=4k # 测试持续时间(秒) TEST_DURATION=300配置文件采用简单的KEY=VALUE格式,确保没有空格围绕等号。所有参数都会在运行时被加载到环境中。
步骤2:创建初始化脚本
在init/目录下创建对应的初始化脚本。以init/disk/disk_init.sh为例:
#!/bin/bash disk_init() { local log_file=$1 local online_container=$2 local offline_container=$3 log_info "开始磁盘测试初始化" "$log_file" # 在线业务初始化 log_info "配置在线业务容器磁盘QoS" "$log_file" docker exec "$online_container" mkdir -p /test/online # 离线业务初始化 log_info "配置离线业务容器磁盘QoS" "$log_file" docker exec "$offline_container" mkdir -p /test/offline log_info "磁盘测试初始化完成" "$log_file" } disk_clean() { local log_file=$1 local online_container=$2 local offline_container=$3 log_info "清理磁盘测试环境" "$log_file" # 清理在线容器 docker exec "$online_container" rm -rf /test/online # 清理离线容器 docker exec "$offline_container" rm -rf /test/offline log_info "磁盘测试环境清理完成" "$log_file" }初始化脚本主要负责测试环境的准备和清理工作,包括创建测试目录、配置QoS参数等。
步骤3:创建基准测试脚本
在benchmark/目录下创建您的基准测试执行脚本。以benchmark/disk/disk_run.sh为例:
#!/bin/bash disk_run_online() { local log_file=$1 local result_file=$2 local online_container=$3 log_info "开始在线磁盘性能测试" "$log_file" # 执行在线业务磁盘测试 docker exec "$online_container" \ fio --name=online-test \ --directory=/test/online \ --size=1G \ --rw=randread \ --bs=4k \ --numjobs=${ONLINE_DISK_THREADS} \ --runtime=${TEST_DURATION} \ --output-format=json \ --output="$result_file.online.json" log_info "在线磁盘测试完成,结果保存到 $result_file" "$log_file" } disk_run_offline() { local log_file=$1 local offline_container=$2 log_info "开始离线磁盘负载生成" "$log_file" # 启动离线负载 docker exec -d "$offline_container" \ fio --name=offline-load \ --directory=/test/offline \ --size=2G \ --rw=${OFFLINE_IO_PATTERN} \ --bs=4k \ --numjobs=8 \ --runtime=${TEST_DURATION} \ --ioengine=libaio \ --rate=${OFFLINE_DISK_UTIL}% } disk_run() { cur_dir=$1 run_dir=$2 disk_conf=$3 log_file=$4 output_result=$5 online_container=$6 offline_container=$7 # 加载公共函数和配置 source "$cur_dir/common/common.sh" source "$disk_conf" # 执行测试 disk_run_offline "$log_file" "$offline_container" sleep 5 # 等待离线负载稳定 disk_run_online "$log_file" "$output_result" "$online_container" }基准测试脚本是测试用例的核心,负责执行实际的性能测试和负载生成。
步骤4:创建QoS配置脚本
QoS配置脚本用于设置和清理资源隔离策略。创建benchmark/disk/disk_co-deployment_config.sh:
#!/bin/bash disk_co_deployment_config() { local log_file=$1 local online_container=$2 local offline_container=$3 log_info "配置磁盘QoS资源隔离" "$log_file" # 为在线业务设置高优先级磁盘QoS docker exec "$online_container" \ echo "high" > /sys/fs/cgroup/blkio/blkio.qos_level # 为离线业务设置低优先级磁盘QoS docker exec "$offline_container" \ echo "low" > /sys/fs/cgroup/blkio/blkio.qos_level log_info "磁盘QoS配置完成" "$log_file" } disk_co_deployment_unconfig() { local log_file=$1 local online_container=$2 local offline_container=$3 log_info "清理磁盘QoS配置" "$log_file" # 恢复默认QoS设置 docker exec "$online_container" \ echo "normal" > /sys/fs/cgroup/blkio/blkio.qos_level docker exec "$offline_container" \ echo "normal" > /sys/fs/cgroup/blkio/blkio.qos_level log_info "磁盘QoS清理完成" "$log_file" }步骤5:集成到主测试框架
最后,需要在主入口脚本start.sh中添加对新测试类型的支持。找到测试类型处理部分,添加您的DISK测试:
# 在start.sh中找到测试类型处理逻辑 case "$TEST_TYPE" in "CPU") test_cpu ;; "MEM") test_mem ;; "NET") test_net ;; "IO") test_io ;; "DISK") # 添加新的测试类型 test_disk ;; "ALL") test_cpu test_mem test_net test_io # test_disk # 如果需要,也可以添加到ALL中 ;; *) log_error "未知测试类型: $TEST_TYPE" exit 1 ;; esac然后添加对应的测试函数:
test_disk() { log_info "开始磁盘QoS混部测试" # 加载磁盘测试配置 source_config "disk" # 执行初始化 run_init "disk" "disk_init" # 执行基准测试(无QoS) run_benchmark "disk" "disk_run" "direct" # 配置QoS run_co_deployment_config "disk" "disk_co_deployment_config" # 执行基准测试(有QoS) run_benchmark "disk" "disk_run" "qos" # 清理QoS配置 run_co_deployment_unconfig "disk" "disk_co_deployment_unconfig" # 清理环境 run_clean "disk" "disk_clean" log_info "磁盘QoS混部测试完成" }最佳实践与技巧
1. 使用公共函数库
充分利用common/common.sh中的日志函数,确保测试输出格式统一:
source "$PROJECT_ROOT/common/common.sh" log_info "测试开始" "$log_file" log_warn "注意:测试将持续5分钟" "$log_file" log_error "测试失败" "$log_file"2. 合理的错误处理
在脚本中添加适当的错误检查:
# 检查容器是否存在 if ! docker ps | grep -q "$container_name"; then log_error "容器 $container_name 不存在" "$log_file" return 1 fi # 检查命令执行结果 if ! docker exec "$container_name" command_to_run; then log_error "命令执行失败" "$log_file" return 1 fi3. 测试结果处理
遵循项目的结果处理规范,将结果输出到正确的目录:
# 结果文件路径 result_file="${OUTPUT_DIR}/disk/$(date +%Y%m%d_%H%M%S)_result.txt" # 提取关键指标 throughput=$(extract_metric "$result_file" "throughput") latency=$(extract_metric "$result_file" "latency") # 计算干扰率 interference_rate=$(calculate_interference "$baseline" "$co_deploy")4. 性能监控集成
考虑在测试过程中集成性能监控:
# 启动性能监控 start_monitoring() { local log_file=$1 local container=$2 local metric=$3 log_info "开始监控 $metric" "$log_file" docker exec -d "$container" \ collectd -f -C /etc/collectd.conf } # 收集监控数据 collect_metrics() { local log_file=$1 local result_file=$2 log_info "收集性能指标" "$log_file" # 从监控工具提取数据并保存到结果文件 }调试与验证
1. 单元测试
为您的测试用例创建简单的验证脚本:
#!/bin/bash # test_disk_validation.sh echo "验证磁盘测试配置..." if [ -f "config/disk.conf" ]; then echo "✓ 配置文件存在" else echo "✗ 配置文件缺失" fi echo "验证初始化脚本..." if [ -f "init/disk/disk_init.sh" ]; then echo "✓ 初始化脚本存在" else echo "✗ 初始化脚本缺失" fi echo "验证基准测试脚本..." if [ -f "benchmark/disk/disk_run.sh" ]; then echo "✓ 基准测试脚本存在" else echo "✗ 基准测试脚本缺失" fi2. 逐步执行
使用-t参数单独测试您的自定义测试用例:
# 仅执行磁盘测试 sh start.sh -t DISK # 部署并执行磁盘测试 sh start.sh -d -t DISK3. 日志分析
检查生成的日志文件,确保测试按预期执行:
# 查看最新的磁盘测试日志 tail -f log/disk/$(ls -t log/disk/ | head -1)常见问题与解决方案
问题1:测试用例无法识别
症状:运行sh start.sh -t DISK时提示"未知测试类型"
解决方案:
- 检查
start.sh中是否正确定义了DISK测试类型 - 确保测试函数
test_disk已正确实现 - 验证测试类型名称大小写是否匹配
问题2:配置文件加载失败
症状:测试运行时提示配置参数未定义
解决方案:
- 检查
config/disk.conf文件是否存在且可读 - 验证配置文件格式是否正确(KEY=VALUE,无空格)
- 确保在测试函数中正确调用
source_config "disk"
问题3:Docker命令执行失败
症状:Docker exec命令返回错误
解决方案:
- 确认容器名称正确且容器正在运行
- 检查容器内是否安装了必要的工具(如fio)
- 验证容器用户权限是否足够
问题4:性能指标提取错误
症状:干扰率计算结果异常
解决方案:
- 检查基准测试输出格式是否符合预期
- 验证指标提取函数的正确性
- 确保基线测试和混部测试使用相同的参数
扩展测试框架
添加新的资源类型
如果您需要测试其他类型的资源隔离(如GPU、NPU等),可以遵循相同的模式:
- 创建
config/gpu.conf配置文件 - 在
init/gpu/目录下创建初始化脚本 - 在
benchmark/gpu/目录下创建测试脚本 - 在
start.sh中添加GPU测试类型支持
集成外部监控工具
将Prometheus、Grafana等监控工具集成到测试框架中:
# 在测试开始时启动监控 start_prometheus() { docker run -d --name prometheus \ -p 9090:9090 \ -v ./prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus } # 在测试结束时收集数据 collect_prometheus_data() { curl -s "http://localhost:9090/api/v1/query?query=your_metric" \ > "${OUTPUT_DIR}/prometheus_data.json" }总结
通过本文的指南,您已经掌握了在openEuler/QoS-Deployment-Test框架中编写自定义测试用例的完整流程。从创建配置文件到集成到主框架,每个步骤都遵循了项目的设计原则和最佳实践。
记住编写高质量测试用例的关键:
- 模块化设计:保持每个脚本的单一职责
- 错误处理:添加适当的检查和恢复机制
- 日志记录:充分利用公共日志函数
- 结果一致性:确保输出格式符合框架规范
- 可重复性:测试结果应该可以稳定复现
随着您对框架的深入了解,您将能够创建更复杂、更贴近实际生产场景的测试用例,为openEuler的QoS资源隔离能力验证提供更有价值的测试覆盖。💪
现在就开始动手实践吧!创建一个简单的测试用例,验证您的新想法,为openEuler社区贡献您的测试智慧!
【免费下载链接】QoS-Deployment-TestDocker-based openEuler Online-Offline Co-scheduling Test Suite.项目地址: https://gitcode.com/openeuler/QoS-Deployment-Test
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考