硬件:XENA Valkyrie 或 Vantage主机,测试板卡不限,本方法适用于其100M~400G所有速率端口

环境配置:Python 3

实现功能:

1.控制流量仪进行流量测试,预定配置的流量发送,报文统计,丢包率,延迟等信息的统计

2.单个Python脚本配合不同的JSON对象文件,来实现不同端口数量,不同拓扑模型下的流量测试

3.在发包测试前及运行过程中都对发包端口的链路状态进行监控100M/1G/2.5G/5G/10G

4.嵌入ARP探测,获取DUT的MAC信息,并记录在测试日志中

5.统计端口流量的Tx,Rx信息,丢包率,延迟信息

设计思路:main文件控制主流程,嵌入Statistics模块进行数据统计,CreateClass模块进行命令预定义

运行效果:

主要实现代码:

  1 import threading, time, json, random, queue, types, sys, socket
2 from binascii import hexlify
3 from TestUtilsL23 import XenaScriptTools
4 from CreateClass import StreamCreate
5 from Statistics import CollectTestresult
6
7 def BuildDict(ports, configvalue, watching, watching_2):
8 #Generate ports Dictionary
9 a = 1
10 for port in ports:
11 ip_address_b = configvalue['IP'][0:10]
12 ip_address_c = ip_address_b + str(a)
13 mac_a = configvalue['mac'][0:10]
14 if a > 9:
15 mac_address = mac_a + str(a)
16 else:
17 mac_address = mac_a + '0' + str(a)
18 ip_address_a = hexlify(socket.inet_aton(ip_address_c)).decode()
19 mac_ip = [str(mac_address), str(ip_address_a)]
20 watching[port] = mac_ip
21 a += 1
22
23 watching_2['type_eth'] = 'FFFF',
24 watching_2['type_vlan'] = '8100',
25 watching_2['type_ip'] = '08004500006A000000007F11BA2D',
26 watching_2['type_udp'] = '00000000',
27 watching_2['type_tcp'] = '000000000000000050000000E5A40000',
28 watching_2['tcpid'] = [hex(int(configvalue['tcpPort'][0]))[2:].zfill(4) + hex(int(configvalue['tcpPort'][1]))[2:].zfill(4)]
29
30
31 def PrintMes(ports, configvalue, ip_address):
32 localtime = time.asctime( time.localtime(time.time()) )
33 print("\n##############################################")
34 print(" 测试配置 ")
35 print("##############################################\n")
36 print("测试时间 : " + str(localtime))
37 print("设备IP地址 : " + ip_address)
38 print("测试端口 : " + str(ports))
39 print("测试模式 : " + configvalue['Stype'])
40 print("持续时间 : " + configvalue['testtime'])
41 print("报文类型 : " + configvalue['header_type'])
42 print("报文长度 : " + configvalue['packet'])
43 if configvalue['Stype'] == 'Aggregation':
44 print("上行VLAN : " + str(configvalue['uvlan']))
45 print("下行VLAN : " + str(configvalue['uvlan']))
46 print("WAN速率 : " + str(configvalue['wanrate']))
47 print("LAN速率 : " + str(configvalue['lanrate']))
48 else:
49 print("VLAN : " + str(configvalue['uvlan']))
50 print("速率设置 : " + str(configvalue['wanrate']))
51 print("端口速率 : " + str(configvalue['portrate']))
52 print("学习时间 : " + configvalue['learntime'])
53 print("丢包率设置 : " + configvalue['threshold'])
54 if configvalue['snlearnenable'] == '1':
55 print("自动学习SN : Enable")
56 else:
57 print("自动学习SN : Disable")
58 if configvalue['portspeedcheck'] == '1':
59 print("端口速率检测 : Enable" )
60 else:
61 print("端口速率检测 : Disable" )
62
63
64 def Maclearning(xm, ports, configvalue):
65 if configvalue['snlearnenable'] == '1':
66 xm.SendExpectOK(ports [1] + " PS_CREATE [0]")
67 xm.SendExpectOK(ports [1] + " ps_tpldid [0] 0")
68 xm.SendExpectOK(ports [1] + " PS_PACKETLENGTH [0] FIXED 70 1518")
69 xm.SendExpectOK(ports [1] + " PS_HEADERPROTOCOL [0] ETHERNET ARP")
70 learnIP_hex = hexlify(socket.inet_aton(configvalue['learnIP'])).decode()
71 xm.SendExpectOK(ports [1] + " PS_PACKETHEADER [0] 0xFFFFFFFFFFFF00000000000108060001080006040001000000000001C0A80164FFFFFFFFFFFF" + learnIP_hex)
72 xm.SendExpectOK(ports [1] + " PS_RATEPPS [0] 2")
73 xm.SendExpectOK(ports [1] + " PS_ENABLE [0] on")
74 xm.SendExpectOK(ports [1] + " P_TRAFFIC ON")
75 xm.SendExpectOK(ports [1] + " P_CAPTURE ON")
76 time.sleep(1)
77 xm.SendExpectOK(ports [1] + " P_CAPTURE OFF")
78 xm.SendExpectOK(ports [1] + " P_TRAFFIC OFF")
79 SN = xm.Send(ports[1] + " PC_PACKET [0] ?")
80 SN = SN.split(' ')[-1]
81 xm.SendExpectOK(ports [1] + " PS_DELETE [0]")
82 Serial = str(SN)
83 if SN == '<BADINDEX>':
84 print ("\nTest result :Failed;[ARP learning failed!!]")
85 sys.exit()
86 print ("DUT SN : " + str(Serial[16:28]))
87
88
89 def PortSpeed(xm, ports, PSC, configvalue):
90 if configvalue['PRcheck'] == '1':
91 xm.PortSyncCheck(ports)
92 i = 0
93 for port in ports:
94 PS = xm.Send(port + ' p_speed ?')
95 PS = PS.split(' ')[-1]
96 PSC.append(str(PS))
97 if configvalue['portspeedcheck'] == '1':
98 if str(PS) != configvalue['portrate'][i]:
99 print ('Test Result:Failed;[' + port + ' 端口速率不匹配,请检查配置...]')
100 sys.exit()
101 i += 1
102
103
104 def runtest(xm, ports, configvalue):
105 xm.PortTrafficStart(ports)
106 time.sleep(float(configvalue['learntime']))
107 xm.PortTrafficStop(ports)
108 time.sleep(0.5)
109 xm.Statisticsclear(ports)
110 time.sleep(0.5)
111 xm.Porttimelimit(ports, configvalue['testtime'])
112 time.sleep(0.2)
113 xm.PortTrafficStart(ports)
114 count = 0
115 print ("\n开始打流,请耐心等候, 测试时间约为" + configvalue['testtime'] + "秒......\n")
116 while True:
117 print (">>>>>>>>>", end='')
118 xm.Send(ports[0] + " P_TRAFFIC ?")
119 sys.stdout.flush()
120 count += 1
121 time.sleep(1)
122 if count > int(configvalue['testtime']):
123 print ('\n\n测试结束,正在收集测试数据......')
124 break
125 print()
126 xm.PortTrafficStop(ports)
127 time.sleep(1)
128
129
130 def main(argv):
131 a = sys.argv
132 configvalue = {}
133 filename = str(a[1])
134 with open(filename,'rb') as f:
135 configs=json.loads(f.read())
136
137 ip_address = configs.get('ip_address')
138 ports = configs.get('ports', '')
139 configvalue['uvlan'] = configs.get('uvlan', '')
140 configvalue['dvlan'] = configs.get('dvlan', '')
141 configvalue['tcpPort'] = configs.get('tcpUdpPort', '')
142 configvalue['packet'] = configs.get('packet', '')
143 configvalue['testtime'] = configs.get('testtime', '')
144 configvalue['threshold'] = configs.get('threshold', '')
145 configvalue['header_type'] = configs.get('headertype', '')
146 configvalue['learntime'] = configs.get('learntime', '')
147 configvalue['payload'] = configs.get('payload', '')
148 configvalue['wanrate'] = configs.get('wanrate', '')
149 configvalue['lanrate'] = configs.get('lanrate', '')
150 configvalue['portrate'] = configs.get('portrate', '')
151 configvalue['PRcheck'] = configs.get('PRcheck', '')
152 configvalue['IP'] = configs.get('IP', '')
153 configvalue['mac'] = configs.get('mac', '')
154 configvalue['snlearnenable'] = configs.get('snlernenable', '')
155 configvalue['learnIP'] = configs.get('learnIP', '')
156 configvalue['Stype'] = configs.get('Stype', '')
157 configvalue['portspeedcheck'] = configs.get('PScheck', '')
158
159 PSC = []
160 FCS = []
161 watching = {}
162 watching_2 = {}
163 testresult = {}
164
165 PrintMes(ports, configvalue, ip_address)
166
167 xm = XenaScriptTools(ip_address)
168 xm.LogonSetOwner("xena", "python_test_1")
169 xm.PortRelinquish(ports)
170 xm.PortReserve(ports)
171 xm.PortTrafficStop(ports)
172 xm.StreamsDelete(ports)
173 sc = StreamCreate(xm, ports, watching, watching_2, configvalue)
174 cr = CollectTestresult(xm, ports, PSC, configvalue, testresult, FCS)
175
176
177 BuildDict(ports, configvalue, watching, watching_2)
178 PortSpeed(xm, ports, PSC, configvalue)
179 if configvalue['snlearnenable'] == '1':
180 Maclearning(xm, ports, configvalue)
181 if configvalue['Stype'] == 'Loopback':
182 sc.Loopback(xm, ports, watching, watching_2, configvalue)
183 runtest(xm, ports, configvalue)
184 cr.LoopbackStatistics(xm, ports, testresult)
185 if configvalue['Stype'] == 'Eachother':
186 sc.Eachother(xm, ports, watching, watching_2, configvalue)
187 runtest(xm, ports, configvalue)
188 cr.EachotherStatistics(xm, ports, testresult)
189 if configvalue['Stype'] == 'Aggregation':
190 sc.Aggregation(xm, ports, watching, watching_2, configvalue)
191 runtest(xm, ports, configvalue)
192 cr.AggregationStatistics(xm, ports, testresult)
193 cr.FCSGetValue(xm, ports, FCS)
194 cr.OutputStatistics(ports, PSC, configvalue, testresult, FCS)
195 xm.PortRelease(ports)
196
197 if __name__ == '__main__':
198 sys.exit(main(sys.argv))

JSON对象配置文件

{
"##常用配置修改":"", "ports": ["0/0","0/1","0/2","0/3","0/4","0/5"],
"packet": "FIXED 64 1518",
"testtime": "10", "##注意:dvlan和lanrate只有在Aggregation模式生效,其他模式仅需uvlan和wanrate":"",
"##其中vlan设置为-1则表示不添加vlan":"",
"uvlan": "-1",
"dvlan": "-1",
"wanrate": ["100", "100", "100","100", "100", "100"],
"lanrate": ["21", "22", "23","24"], "portrate": ["1000","1000","1000","1000","1000","1000"], "##Stype为测试模式,分别可以配置为:Loopback, Eachother, Aggregation":"",
"##其中Loopback为环回测试,Eachother为两两互打测试,Aggregation为汇聚测试":"",
"Stype":"Eachother", "##headertype为报文类型,分别可以配置为:TCP, UDP, IP, Ethernet":"",
"headertype": "Ethernet", "##threshold为丢包率设置":"",
"threshold": "0", "##不常用配置修改":"", "##发送学习报文的时间":"",
"learntime": "3", "##payload类型分别有: Pattern, Random":"",
"payload": "Pattern", "##PRcheck为使能端口状态检测,1为开启,0为关闭;使能后端口为连接的时候会报错":"",
"PRcheck": "1", "##PScheck为检测端口速率是否匹配,1为开启,0为关闭":"",
"PScheck":"1", "tcpUdpPort": ["1024", "2048"],
"IP": "192.168.163.1",
"mac": "000000033333", "##学习DUT的MAC地址":"",
"snlernenable": "0",
"learnIP": "192.168.2.1", "##测试仪IP地址":"",
"ip_address": "192.168.1.200"
}

案例一:利于Python调用JSON对象来实现对XENA流量测试仪的灵活发包测试,能够适应Pair,Rotate,1-to-Many等多种拓扑模型的更多相关文章

  1. 在VS2015中用C++创建DLL并用C++调用且同一时候实现对DLL的调试

    一:用C++创建DLL            依照[在VS2015中用C++编写可被其他语言调用的动态库DLL]提示创建C++编写的DLL.或參考[在VS2015中用C++创建DLL并用C#调用且同一 ...

  2. Python中Json对象处理的jsonpath-rw

    这两天在写一个爬虫,需要从网站返回的json数据提取一些有用的数据. 向url发起请求,返回的是response,在python3中,response.content是二进制bytes类型的,需要用d ...

  3. python中json对象转换出错解决方法

    今天在使用python中的json转换碰到一个问题: 接收一个post的json字符串: s={"username":"admin","passwor ...

  4. python 解析json loads dumps

    认识 引用模块 重要函数 案例 排序 缩进参数 压缩 参考 认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standa ...

  5. json对象与字符串互转

    javascript 1 JSON.parse() 方法用于将一个 JSON 字符串转换为对象. JSON.parse(text[, reviver]) text:必需, 一个有效的 JSON 字符串 ...

  6. python处理json总结

    一.首先,了解下什么是JSON? JSON:JavaScript Object Notation [JavaScript 对象表示法] JSON 是一种轻量级的数据交换格式,完全独立于任何程序语言的文 ...

  7. flex 遍历Object或者JSON对象内容的实现代码

    private function init():void { //新建对象 var obj:Object = new Object(); //增加key-value obj["name&qu ...

  8. jQuery调用WCF服务传递JSON对象

    下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...

  9. PHP“Cannot use object of type stdClass as array” (php在调用json_decode从字符串对象生成json对象时的报错)

    php再调用json_decode从字符串对象生成json对象时,如果使用[]操作符取数据,会得到下面的错误 错误:Cannot use object of type stdClass as arra ...

随机推荐

  1. Codeforces Round #555 (Div. 3) C1,C2【补题】

    D1:思路:L,R指针移动,每次选最小的即可. #include<bits/stdc++.h> using namespace std; #define int long long #de ...

  2. TensorFlow(十):卷积神经网络实现手写数字识别以及可视化

    上代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = inpu ...

  3. 简述*args and **kwargs

    为了能让一个函数接受任意数量的位置参数:* 为了接受任意数量的关键字参数:** *参数只能出现在函数定义中最后一个位置参数后面,而**参数只能出现在最后一个参数 解决的问题:构造一个可接受任意数量参数 ...

  4. SpringBoot JPA懒加载异常 - com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy

    问题与分析 某日忽然发现在用postman测试数据时报错如下: com.fasterxml.jackson.databind.JsonMappingException: could not initi ...

  5. Asp.Net.Mvc+MEF+EF 项目 ,源码在GitHub ..希望对大家有所帮助

    自己开源的 一个 Asp.Net + MEF+ EF 的 项目 . 供大家学习和使用, 点击进入GitHub

  6. Linux Touch命令的8种常见使用方法

    Linux touch命令不仅可以用于在Linux上创建空文件. 您可以使用它来更改现有文件的时间戳,包括其访问权限和修改时间. 本文介绍了8种可以通过Linux终端使用touch命令的方案. 我们在 ...

  7. Docker Dockerfile 定制镜像

    使用 Dockerfile 定制镜像  镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么无法重复的问题 ...

  8. BZOJ1941Hide and Seek

    做KD_tree的入门题. 问题就是求出任意一个点距其他点的最大曼哈顿距离和最小曼哈顿距离差,然后对其取min即可. 这个东西就是KD_tree可以轻松解决的了. 下面总结一下做KD_tree(不带修 ...

  9. DES算法实现

    概述(团队项目) DES是一个分组加密算法,它以64位为分组对数据加密.同时DES也是一个对称算法:加密和解密用的是同一个算法.DES是一个包含16个阶段的"替换–置换"的分组加密 ...

  10. linux文件管理指令

    总述 所有指令都可以使用--help来查看说明 例如:cat --help -x 表示参数 1.cat:用于打印文件(cat -x filename) 参数: -n:由1开始对每行进行编号 -b:由1 ...