公众号里可以插入音视频,插一首歌试试,可以边听边看,不过听歌还需要自己点一下,而不是背景音乐的模式有点遗憾。第一期聊了个基本框架,本期介绍一下如何用Python实现iperf3自动化打流。
用过iperf的同学都了解,iperf打流是通过服务端和客户端相互配合的,在建立网络连接的两台设备之间,一个开启服务端,另一个开启客户端,在客户端这边发起数据通信,iperf2只支持客户端发送数据,服务端接收,iperf3支持Reverse test mode, 通过-R参数可以反向传输,实现服务端发送,客户端接收,这一点其实对WiFi测试来说方便了不少,WiFi的性能测试对我们硬件来说,会关注发射和接收两个方向,所以-R可以比较方便的在客户端实现两个方向的变换,如果用iperf2的话还需要交换服务端和客户端的指令。
iperf需要在两个设备上运行,而我们的自动化脚本只需要在一台设备执行,那么意味着设备之间我们需要通信,然后去执行iperf的指令,这里推荐使用ssh方式,各大系统通用,不管你是Windows还是Linux,无阻碍沟通,当然如果是手机作为DUT的时候可能需要用到usb调试接口来进行通信。一般对WiFi的性能测试而言,是AccessPoint和Station之间对打,简称AP和STA,至于DUT是AP还是STA,取决于设备本身,比如WiFi路由器一般都是AP角色,手机一般都是STA角色。
ssh在Python中的应用在系列一里面指标测试的时候已经提到过了,推荐使用paramiko库,我们来看一下实际使用方法。
# 导入模块,调整一下注释的方式,放到代码最上方,有些注释比较长,代码后面不便于阅读,不过手机屏幕不管怎么调整还是小了点
import paramiko
# 实例一个对象
ssh = paramiko.SSHClient()
# 默认情况下,paramiko不会接受不受信任的主机密钥,因此需要手动设置接受不受信任的主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接到ip地址为192.168.1.1的远程服务器,端口22,用户名root,密码admin
ssh.connect('192.168.1.1',port=22,username='root',password='admin')
# 执行远程命令,关闭iperf3程序
stdin, stdout, stderr = ssh.exec_command('taskkill.exe /im iperf3.exe /f')
# 打印命令输出
print(stdout.read().decode())
# 关闭连接
ssh.close()
通过上面的方法,我们可以和远程设备建立连接,并执行远程指令。正常情况下我们需要先开iperf的服务端,再执行客户端指令。比如如果我们的DUT是AP的时候,那么STA会选择高性能的无线网卡,为了便于测试,一般选择PC机上安装PCIE无线网卡,这样我们的Python脚本可以在PC机上运行,不需要额外的测试机,本身机器也作为性能测试的一部分。当然实际测试时可以根据设备来灵活设计一下测试的框架,比如打流可以直接是DUT(AP)<-->STA,如果DUT有以太网口,那么也可以是PC(ETH)<-->DUT(AP)<-->STA。
简单举个iperf3在两台设备之间打流的例子,当然iperf3有很多参数,具体参数用哪些,需要根据实际的测试需求去调整,会影响测试结果,这里就不一一展开。
# 结合前面ssh登录到一个DUT(AP)上执行iperf3的服务端
ssh.exec_command('iperf3 -s')
# python脚本执行在STA的本地PC(Windows)上,那么客户端指令可以直接通过调用os执行
# 导入os模块
import os
# 执行iperf3客户端指令进行打流
os.system('iperf3.exe -c 192.168.1.1 -t 90 -P 8')
打流之后可以把log输出到文件或者直接提取结果作为最终的测试数据输出。