一:说明
在硬件获取系统测试中,开关机也是一项很重要的测试项目。该项测试可以评估产品的硬件异常开关机下的稳定性。硬件环境搭建参考:搭建网络产品、物联网硬件产品自动化开关机测试环境_李夕的博客-CSDN博客
二:用到的工具
硬件:
PC电脑、WIFI继电器、无线路由器(2.4G)
软件:
网络助手、python脚本
二:测试拓扑
三:构思代码逻辑
1)根据不同的产品进行标识符的判断,比如网络产品能ping通表示设备启动完成,则可以使用ping进行检测设备启动情况,检测OK后进行断电在上电。
2)断电在上电的延时选择分为三种,(1):断电后经过固定的延时后进行上电。(2)断电后在延时范围内随机一个时间进行上电。(3) :初始一个延时和步进,断电后延时递增的方式进行上电。
根据以上判断就可以开始垒代码了,环境是使用的python3.6的环境。
import datetime
import socket
import time
import os
import random
count = 1
delay_time = open_time = 0
relay_mac = "xxxxxxxxxxxx"
#程序开始的前奏,去连接UDP以及后续判断断开继电器的标识符(这里是以ping通DUT为判断)
def go_start(interface_addr, relay_addr, dut_addr, up_type, relay_num):
global delay_time, count, open_time
#先进行udp本地连接
try:
udpSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udpSocket.bind(interface_addr)
#异常后退出
except Exception as e:
print("绑定失败,请检查本地IP或者查看IP是否被绑定!",e)
exit(-1)
#先进行继电器操作在运行前先将继电器打开,命令是固定格式,例如a1xxxxxxxxxx是 a1 + xxxxxxxx
#a1是继电器的第一路,bcff4d2b66eb是继电器的mac地址
command = "a" + relay_num + relay_mac
result = relay_control(udpSocket, relay_addr, command)
if result == False:
print("命令发送三次失败,退出!")
exit(-2)
else:
recv_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
open_time = round(time.time())
print(recv_time,"---->控制继电器开启成功。")
#进行业务流程
try:
#进行循环判断进行ping操作,如果ping不通会一直四循环的ping,不会在对继电器进行操作
while True:
pingResult = os.popen('ping -n 2 -w 1 %s'%dut_addr).read()
#print(pingResult)
#这里特指使用的是中文的windows系统,目前还没有对英文的windows操作系统以及linux系统进行适配
if '请求超时' not in pingResult and '无法访问目标网' not in pingResult:
#ping通被测设备后进行断开电源操作
command = "b" + relay_num + relay_mac
result = relay_control(udpSocket, relay_addr, command)
#这里判断返回结果是True后则进行断电操作
if result:
end_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
close_time = round(time.time())
time_t = close_time - open_time
print(end_time, "---->ping通被测设备,继电器断电成功!测试次数为:%d,"
"启动到断电总时间 %s"%(count, time_t))
sec = down_time(up_type)
time.sleep(sec)
count += 1
delay_time = sec
#打开继电器命令
command = "a" + relay_num + relay_mac
result = relay_control(udpSocket, relay_addr, command)
if result == False:
print("命令发送三次失败,退出!")
exit(-2)
start_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
open_time = round(time.time())
print(start_time, "---->继电器开启成功!本次延时开机时间:%d" % sec)
else:
time.sleep(2)
#pass
udpSocket.close()
except KeyboardInterrupt:
exit(0)
#通过UDP控制数据发送
def relay_control(udpSocket, relay_addr, command):
send_count = 0
while send_count < 3:
try:
#UDP发送目的地址和端口
send_dest_addr = (relay_addr, 8111)
#设置UDP的超时时间
udpSocket.settimeout(2)
"""
UDP的发送和接收,由于网络等原因,如果发送没有接收到回复会一直卡在
recvData里面,这里是设置了超时时间以及捕获超时的异常,异常后会进行再次尝试发送。
超过3次发送都超时则判断继电器不在线,退出。
"""
udpSocket.sendto(command.encode('utf-8'), send_dest_addr)
recvData = udpSocket.recvfrom(1024)
return True
except socket.timeout:
send_count += 1
return False
#根据选择的启动类型进行筛选,对应是固定延时开机还是随机或者升序
def down_time(up_type):
global delay_time
#启动类型选择1是固定模式,默认是断电后5s进行通电
if up_type == 1:
sec_t = 5
return sec_t
#启动类型选择2是递增模式,默认是限制最大是3600s。递增是1s。
elif up_type == 2:
if delay_time > 3600:
delay_time = 0
step = 1
sec_t = delay_time + step
return sec_t
#启动类型选择3是随机模式,默认是每次断电后延时在在5~15s随机选择一个秒数进行断电操作。
elif up_type == 3:
sec_t = random.randint(5, 15)
return sec_t
else:
print("停止类型设置错误,退出!")
exit(-3)
if __name__ == '__main__':
#配置测试电脑的IP和端口,端口是固定
interface_addr = ("xxx.xxx.xxx.xxx",8112)
#控制继电器的IP地址
relay_addr = "xxx.xxx.xxx.xxx"
#配置被测设备的IP地址
dut_addr = "xxx.xxx.xxx.xxx"
#dut_addr = "127.0.0.1"
#配置选择关闭后多长时间再次进行开启 1:固定间隔 2:递增间隔 3:随机间隔
up_type = 3
#继电器使用的线路对应继电器的1~4路
relay_num = "4"
#程序入口
go_start(interface_addr, relay_addr, dut_addr, up_type, relay_num)
以上代码就是在以ping作为判断标志后进行断电操作,执行结果如下: