1. 脚本概述位置: tests/run_tests.sh功能: SONiC 测试框架的标准化测试执行入口2. 函数解析2.1 show_help_and_exit() - 帮助信息# 打印所有可用参数说明后退出参数列表:-h/?:帮助-n*:测试床名称(必填)-t*:拓扑类型 t0|t1|ptf等(必填)-d:DUT名称(逗号分隔)-i:inventory 文件-c:指定测试用例-I:只测试指定目录(如 vlan)-m:测试方法 group|individual|debug-S:跳过的目录-s:跳过的测试脚本-q:失败 n 次后停止-u:跳过 pretest/posttest-w:暖启动(不清缓存)-x:调试模式(打印命令)-6:IPv6 管理模式2.2 get_dut_from_testbed_file() - 解析测试床# 从 ansible/testbed.yaml 获取DUT信息处理逻辑:└── yaml 格式:Python 解析 conf-name 匹配 └── 处理 converged_peers 拓扑合并2.3 setup_environment() - 环境初始化# 设置测试运行的基础环境关键变量:BASE_PATH${SCRIPT_PATH}/..INVENTORYlab,veos(默认)SKIP_FOLDERSptftests,acstests,saitests,scripts,k8s,sai_qualifySKIP_FILEStest_pretest.py,test_posttest.pyTEST_METHODgroup(默认)PYTEST_EXECpython3-m pytest环境变量:ANSIBLE_CONFIG${BASE_PATH}/ansibleANSIBLE_LIBRARY${BASE_PATH}/ansible/library/ANSIBLE_CONNECTION_PLUGINS${BASE_PATH}/ansible/plugins/connectionANSIBLE_CLICONF_PLUGINS${BASE_PATH}/ansible/cliconf_pluginsANSIBLE_TERMINAL_PLUGINS${BASE_PATH}/ansible/terminal_plugins进程清理:pkill-9pytest pkill-9ansible-playbook pkill-9-f^ssh.*/\.ansible2.4 setup_test_options() - 测试选项配置# 发现并过滤测试用例执行流程:1.发现测试:find./-nametest_*.py2.排除目录:SKIP_FOLDERS(默认跳过 ptftests 等)3.排除文件:test_pretest.py,test_posttest.py4.按目录过滤:INCLUDE_FOLDERS(如-Ivlan 只测试 vlan 目录)5.按脚本过滤:TEST_CASES/TEST_CASES_FILE生成的PYTEST_COMMON_OPTS:--inventory ${INVENTORY}--host-pattern ${DUT_NAME}--testbed ${TESTBED_NAME}--testbed_file ${TESTBED_FILE}--log-cli-level ${CLI_LOG_LEVEL}--log-file-level ${FILE_LOG_LEVEL}--allow_recover-rav--ignore${SKIP_FOLDERS}2.5 prepare_dut() - 预检阶段# 执行测试前的准备工作命令:pytest-m pretest--topology util pretest 典型任务:├──sanity_check(健康检查)├── 清理旧配置 ├── 收集设备信息 └── 准备测试环境2.6 cleanup_dut() - 清理阶段# 测试结束后的清理工作命令:pytest-m posttest--topology util posttest 典型任务:├── 恢复配置 ├── 收集诊断信息 ├── 清理测试数据 └── show techsupport2.7 run_group_tests() vs run_individual_tests()# group 模式:所有测试一起运行 pytest ${TEST_CASES}...# individual 模式:逐个脚本运行fortest_scriptin${TEST_CASES};dopytest ${test_script}...# 失败处理:rc10/12sanity 失败,rc15duthost 失败,rc16ptf 不可达 done3. 执行流程图┌─────────────────────────────────────────────────────────┐ │ 入口: ./run_tests.sh[参数]│ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ setup_environment()│ │ ├─ 设置 PYTHONPATH/ANSIBLE_* │ │ ├─ 设置 INVENTORY │ │ └─pkill清理进程 │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ clear_cache()│ │ └─rm-rftests/_cache │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ get_dut_from_testbed_file()│ │ └─ 解析 testbed.yaml → DUT_NAME │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ validate_parameters()│ │ ├─ 检查-n(testbed)必填 │ │ ├─ 检查-t(topology)必填 │ │ └─ 检查 DUT_NAME / DPU_NAME │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ setup_test_options()│ │ ├─ 发现测试:find./-nametest_*.py│ │ ├─ 过滤目录:-Ivlan → 只 vlan 目录 │ │ ├─ 过滤拓扑:--topologyt0 │ │ └─ 生成 PYTEST_COMMON_OPTS │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ prepare_dut()[unless-uor debug]│ │ └─ pytest-mpretest(健康检查环境准备)│ │ 失败 →exit65(pretest 专用退出码)│ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ run_tests()[核心测试执行]│ │ ├─ group: pytest 批量执行 │ │ ├─ individual: 逐个脚本执行 │ │ └─ debug: 仅显示配置 │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ cleanup_dut()[unless-uor debug]│ │ └─ pytest-mposttest(清理收集诊断)│ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │exit${RC}│ │ └─0成功,1失败,65pretest失败 │ └─────────────────────────────────────────────────────────┘4. 日志输出位置logs/ ├── pretest.xml # pretest 测试报告 ├── pretest.log # pretest 日志 ├── posttest.xml # posttest 测试报告 ├── posttest.log # posttest 日志 ├── tr.xml # 测试结果报告 └── test.log # 测试日志
SONiC-mgmt系列3:run_tests.sh 详细分析
发布时间:2026/6/23 13:41:10
1. 脚本概述位置: tests/run_tests.sh功能: SONiC 测试框架的标准化测试执行入口2. 函数解析2.1 show_help_and_exit() - 帮助信息# 打印所有可用参数说明后退出参数列表:-h/?:帮助-n*:测试床名称(必填)-t*:拓扑类型 t0|t1|ptf等(必填)-d:DUT名称(逗号分隔)-i:inventory 文件-c:指定测试用例-I:只测试指定目录(如 vlan)-m:测试方法 group|individual|debug-S:跳过的目录-s:跳过的测试脚本-q:失败 n 次后停止-u:跳过 pretest/posttest-w:暖启动(不清缓存)-x:调试模式(打印命令)-6:IPv6 管理模式2.2 get_dut_from_testbed_file() - 解析测试床# 从 ansible/testbed.yaml 获取DUT信息处理逻辑:└── yaml 格式:Python 解析 conf-name 匹配 └── 处理 converged_peers 拓扑合并2.3 setup_environment() - 环境初始化# 设置测试运行的基础环境关键变量:BASE_PATH${SCRIPT_PATH}/..INVENTORYlab,veos(默认)SKIP_FOLDERSptftests,acstests,saitests,scripts,k8s,sai_qualifySKIP_FILEStest_pretest.py,test_posttest.pyTEST_METHODgroup(默认)PYTEST_EXECpython3-m pytest环境变量:ANSIBLE_CONFIG${BASE_PATH}/ansibleANSIBLE_LIBRARY${BASE_PATH}/ansible/library/ANSIBLE_CONNECTION_PLUGINS${BASE_PATH}/ansible/plugins/connectionANSIBLE_CLICONF_PLUGINS${BASE_PATH}/ansible/cliconf_pluginsANSIBLE_TERMINAL_PLUGINS${BASE_PATH}/ansible/terminal_plugins进程清理:pkill-9pytest pkill-9ansible-playbook pkill-9-f^ssh.*/\.ansible2.4 setup_test_options() - 测试选项配置# 发现并过滤测试用例执行流程:1.发现测试:find./-nametest_*.py2.排除目录:SKIP_FOLDERS(默认跳过 ptftests 等)3.排除文件:test_pretest.py,test_posttest.py4.按目录过滤:INCLUDE_FOLDERS(如-Ivlan 只测试 vlan 目录)5.按脚本过滤:TEST_CASES/TEST_CASES_FILE生成的PYTEST_COMMON_OPTS:--inventory ${INVENTORY}--host-pattern ${DUT_NAME}--testbed ${TESTBED_NAME}--testbed_file ${TESTBED_FILE}--log-cli-level ${CLI_LOG_LEVEL}--log-file-level ${FILE_LOG_LEVEL}--allow_recover-rav--ignore${SKIP_FOLDERS}2.5 prepare_dut() - 预检阶段# 执行测试前的准备工作命令:pytest-m pretest--topology util pretest 典型任务:├──sanity_check(健康检查)├── 清理旧配置 ├── 收集设备信息 └── 准备测试环境2.6 cleanup_dut() - 清理阶段# 测试结束后的清理工作命令:pytest-m posttest--topology util posttest 典型任务:├── 恢复配置 ├── 收集诊断信息 ├── 清理测试数据 └── show techsupport2.7 run_group_tests() vs run_individual_tests()# group 模式:所有测试一起运行 pytest ${TEST_CASES}...# individual 模式:逐个脚本运行fortest_scriptin${TEST_CASES};dopytest ${test_script}...# 失败处理:rc10/12sanity 失败,rc15duthost 失败,rc16ptf 不可达 done3. 执行流程图┌─────────────────────────────────────────────────────────┐ │ 入口: ./run_tests.sh[参数]│ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ setup_environment()│ │ ├─ 设置 PYTHONPATH/ANSIBLE_* │ │ ├─ 设置 INVENTORY │ │ └─pkill清理进程 │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ clear_cache()│ │ └─rm-rftests/_cache │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ get_dut_from_testbed_file()│ │ └─ 解析 testbed.yaml → DUT_NAME │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ validate_parameters()│ │ ├─ 检查-n(testbed)必填 │ │ ├─ 检查-t(topology)必填 │ │ └─ 检查 DUT_NAME / DPU_NAME │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ setup_test_options()│ │ ├─ 发现测试:find./-nametest_*.py│ │ ├─ 过滤目录:-Ivlan → 只 vlan 目录 │ │ ├─ 过滤拓扑:--topologyt0 │ │ └─ 生成 PYTEST_COMMON_OPTS │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ prepare_dut()[unless-uor debug]│ │ └─ pytest-mpretest(健康检查环境准备)│ │ 失败 →exit65(pretest 专用退出码)│ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ run_tests()[核心测试执行]│ │ ├─ group: pytest 批量执行 │ │ ├─ individual: 逐个脚本执行 │ │ └─ debug: 仅显示配置 │ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │ cleanup_dut()[unless-uor debug]│ │ └─ pytest-mposttest(清理收集诊断)│ └─────────────────────┬───────────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────┐ │exit${RC}│ │ └─0成功,1失败,65pretest失败 │ └─────────────────────────────────────────────────────────┘4. 日志输出位置logs/ ├── pretest.xml # pretest 测试报告 ├── pretest.log # pretest 日志 ├── posttest.xml # posttest 测试报告 ├── posttest.log # posttest 日志 ├── tr.xml # 测试结果报告 └── test.log # 测试日志