自微软发起SONIC(Software for Open Network in the Cloud)项目后, 国内一线互联网厂商以及运营商也都在持续跟进,而关于测试这一块,目前在github社区上 sonic-mgmt都不断有代码更新,本篇文章将介绍一下sonic-mgmt执行函数,希望能帮助对sonic-mgmt感兴趣的伙伴们理解,也欢迎交流讨论。
一、sonic-mgmt执行方式的变迁
在2019年前,sonic-mgmt依靠的还是ansible,通过使用ansible-playbook来执行用例,但随着sonic-mgmt的不断优化,目前社区框架已转为pytest,并重新定制了ansible模块用于与设备交互。目前有两种方法来执行pytest测试用例,一种是使用 tests/run_test.sh来执行,另一种则是直接使用pytest命令来执行,本篇文章将重点介绍run_test.sh的流程,解析这个函数起到哪些作用。
run_test.sh整体流程
函数可大体分为如下几块:
- 帮助检查模块:负责对执行的指令进行检查,看是否包含一些必要的信息,比如是否指定了testbed,指定的被测设备名称是否存在等,如若执行指令不符合要求会停止程序并打印相关提示信息,来帮助执行人更正执行指令
 - 环境设置模块:负责获取一些环境的默认参数,export环境变量
 - 测试用例执行:将输入的执行指令解析后,拼接pytest执行指令,执行测试用例
 - 环境清理:完成测试后清理DUT配置
 
run_test.sh支持的部分常用指定参数表
| 
 参数  | 
 说明  | 
| 
 -h -?  | 
 帮助提示  | 
| 
 -a  | 
 是否进行auto-recover,可选参数<True|False>,默认True  | 
| 
 -c  | 
 指定测试用例,例如-c module/test_case.py  | 
| 
 -d  | 
 指定dutname,dutname会检查是否在指定的testbed里  | 
| 
 -e  | 
 额外参数  | 
| 
 -f  | 
 指定testbed,默认为testbed.csv  | 
| 
 -i  | 
 指定设备信息文件,与testbed.csv文件对应,描述登录设备的ip、账号与密码  | 
| 
 -k  | 
 指定loglevel,error|warning|info|debug (default debug)"  | 
| 
 -l  | 
 指定cliloglevel, error|warning|info|debug (default warning)"  | 
| 
 -n  | 
 指定topo名称,toponame会检查是否在指定的testbed里  | 
| 
 -s  | 
 指定需要跳过的用例  | 
| 
 -u  | 
 指定是否跳过util group用例,默认为True  | 
二、使用run_test.sh执行测试用例的方法
1、执行某一类或者某一个单用例,通过-c 参数指定
/run_tests.sh -d <dut_name> -n <testbed_name> -u -c "snmp/test_*.py"
2、批量运行多个用例,如下命令将执行test_link_flap以及test_reboot用例
./run_tests.sh -d <dut_name> -n <testbed_name> [-s ] -u -c "platform_tests/test_link_flap.py platform_tests/test_reboot.py"
3、更灵活一点的方式,例如下列命令将执行snmp路径下,跳过snmp/test_snmp_cpu.py外的其他用例。
/run_tests.sh -d <dut_name> -n <testbed_name> -u -c "snmp/test_*.py" -s "snmp/test_snmp_cpu.py"
ps:使用这种执行方式需要注意必须使用双引号,否则会出现ERR。