自动化测试在版本到到测试部之前,可以完整的跑一遍用例,效果非常的不错,F7公司用tcl模拟NMS网管做自动化测试,很多网络公司用Python+Selenium是进行web自动化测试,其实采用Python+CLI做通信的自动化测试效果非常的不错
下面是几种语言的分类(python为动态语言:程序运行时,允许改变程序结构或变量类型)
Python在PC上工作,主控板运行有命令行CLI,通过Python连接到主控,下发对应的Table到主控,模拟网管的操作
主要的类是ConnectCli,包含下面函数:
1.cli_delay
参数:nsec(秒)
作用:延迟功能
2.cli_connect
参数:host、host_port、usr、pwd
作用:连接cli服务端
3.cli_close:
参数:void
作用:断开与cli服务端的连接
4.cli_sendcmd:
参数:可变长参数*args,要求包括全路径命令字串(如 $.cfg.vpn.getVpn),及此命令需要的参数
作用:向cli发送命令请求
5.cli_cmpassert:
参数:isSubStr,(0)标志需要全匹配(1)标志部分字串匹配;expected_ret,预期结果字串
作用:将传入的预期结果字串与cli处理结果字串进行比对,不相等则报
测试的例子是通过cli_connect连接到主控板的169.254.0.1:9000,并且输入用户名bg64和密码jupiter,之后就进去CLI了,其中提示符为prompt也就是'->'
cli_sendcmd就是模拟命令行输入,和在CLI窗口敲入$.l2cfg.xcfrr.set_xcfrr **是一样的,主要是加入了\r\n换行
cli_cmpassert刚好相反,输入set的时候,判断是否success,输入get的时候,比较获取到的字符串和输入字符串是否一致
整个思想就是模拟CLI的操作,获取CLI窗口的结果并和想得到的结果比较,一致的话就PASS,不一致就FAILED
代码如下:
import time
import socket
import string
import telnetlib
class ConnectCli:
prompt = '->'
@classmethod
def __cli_wait__(self, data):
print "*INFO* %s"%(data)
return self._tn.read_until(data)
@classmethod
def __cli_sendmsg__(self, data):
print "*INFO* %s"%(data)
self._tn.write(data)
@classmethod
def __cli_recvmsg__(self):
data = self._tn.read_very_eager()
print "*INFO* %s"%(data)
return data
@classmethod
def cli_delay(self, nsec):
print "*INFO* delay %ssec"%(nsec)
f_sec = float(nsec)
time.sleep(f_sec)
@classmethod
def cli_connect(self, host, host_port, usr,pwd):
print "*INFO*HOST=%s,PORT=%s"%(host,host_port)
verson ="version"+"\n"
self._tn = telnetlib.Telnet(host,host_port)
self.__cli_wait__("login:")
self.__cli_sendmsg__(usr)
self.__cli_wait__("Password:")
self.__cli_sendmsg__(pwd)
self.__cli_wait__(self.prompt)
self.__cli_sendmsg__(verson)
self.__cli_wait__(self.prompt)
@classmethod
def cli_close(self):
self._tn.close()
@classmethod
def cli_sendcmd(self, *args):
i = 0
tmp = ''
data = ''
data = str(args[0]) + ' '
data += str(args[1]) + ','
for i in range(len(args)-2):
data += str(args[i+2]) + ','
data += '\r\n'
self.__cli_sendmsg__(data)
@classmethod
def cli_cmpassert(self, *expected_subret):
#print "*INFO* expected returnvalue:%s"%(expected_subret)
data_true = ''
data_true =self.__cli_wait__(self.prompt)
data_exp = str(expected_subret[0])
m = re.search(data_exp, data_true)
if m is not None:
return
else:
raise AssertionError("Expectedsub_string to be %s but was %s"
%(data_exp, data_true))
#for test
if __name__ =='__main__':
ConnectCli.cli_connect("169.254.0.1","9000","bg64\n","jupiter\n")
ConnectCli.cli_sendcmd('$.l2cfg.xcfrr.set_xcfrr',"10,{tunnel_id=0x12c, dest_pe=0x0, outlabel2nnh=0xc8, bypass_tunnel_idx=0x15e,bypass_in_use=0x1, dest_net_id=0x0, reserved=0x0 }")
ConnectCli.cli_delay('5')
ConnectCli.cli_cmpassert('success')
ConnectCli.cli_sendcmd('$.l2cfg.xcfrr.get_xcfrr',"10,{300,0,0,0}")
ConnectCli.cli_delay('5')
ConnectCli.cli_cmpassert('{tunnel_id=0x12c, dest_pe=0x0, outlabel2nnh=0xc8, bypass_tunnel_idx=0x15e,bypass_in_use=0x1, dest_net_id=0x0, reserved=0x0 }')
ConnectCli.cli_close()