众所周知,没有自动化支持的测试是很难在测试点覆盖,性能评估,开发迭代中取得高效率的进展。WiFi测试本来就是复杂艰难的过程,自动化测试的意义自然不言而喻。Spirent Octobox WiFi 测试床优势之一就是其完善的自动化支持能力。通过REST API提供灵活和全面的自动化接口,使自动化开发变得很简单。本文从开发一个测试实例出发,带读者一起体验一下Octobox自动化开发过程。
概述
Octobox REST API 是基于HTTP 的实现,通过GET, POST,PUT,DELETE方法和URI(Uniform Resource Identifier)实现参数设置,状态获取以及指令下发等操作。Octobox REST API 手册是基于Swagger的实现。在Octobox Server 的GUI上可以找到REST API 的Swagger链接。对于初学者它是一个非常有用的工具。本文将介绍如何利用这个文档工具,开始写第一个OCTOBOX自动化脚本。本文包括以下内容:
开发环境的搭建
REST API Swagger 文档
基于Python开发一个测试用例
Octobox REST API 接口不限制开发脚本的语言, 任何一种语言都可以调用REST API 接口,它遵循的是客户端-服务器的模型。例如,脚本调用一个API接口来获取一个状态,就是向一个URL地址发送一个HTTP GET请求, 然后在HTTP的响应中读取返回值。
准备一台独立的电脑作为脚本开发机,需要至少一个网口。操作系统是Linux 或Windows可依照开发者习惯。不要使用Octobox server 作自动化开发环境,因为复杂的安装和设置可能会对Server的配置产生影响,导致一些其他的问题。
自动化开发机的IP地址要和Octobox Server是 IP 可达的。因为所有的REST API 调用是通过HTTP 协议发给Octobox Server 进行处理的。而通常Octobox Server 上一定会配置的网段地址是172 和192两个网段。大多数的使用者还会为其配置第三个网口,接入公司内网或实验室网络例如:10.X.X.X 网段。 我们推荐自动化开发机避开192网段,因为它是用于打流测试的网段,所以172网段和10网段都是可以使用的。
根据开发者个人喜好,通常选择一款习惯的集成开发环境。例如Pycharm,VSCode ,Sublime Text等。下一步安装requests, python-socketio 和一些开发者可能需要的python package。
Octobox的REST API 提供的是Swagger 文档。什么是Swagger?Swagger是一种通用的规范和框架,用于设计、构建、文档化和使用RESTful Web服务。Swagger的核心是API描述语言,使得开发人员能够清晰地定义和描述API。它并不是Octobox产品所特有的,作为一种被广泛使用的工具,它提供了一套丰富的功能:包括接口定义、文档生成、接口测试等。用户可以在Octobox的软件界面上找到Swagger的链接如下图所示。点击“i” 图标后,在弹出的小窗上找到REST API 链接。
测试仪图形化界面上的所有的手工测试都可以通过REST API 自动化接口完成。REST API Swagger 文档包括API 的详细说明,可以交互地测试这些API接口,并获取它的返回值。Swagger文档是一个非常有用的工具,尤其是对于刚开始写自动化的工程师而言,要充分的学习和利用好这个文档工具。下面就通过两个简单的例子给大家讲讲这个工具的使用。
HTTP GET 方法举例:
HTTP 响应的Response
如下图所示,其中response body的内容是“RvR-demo” 这个用例的配置信息,json格式的数据可以下载成文件保存。
这个API是一个非常有用的接口。对于刚刚接触Octobox 自动化的开发者,可以参考这个GET方法返回的json 数据来定义测试用例模板。
调用API需要如下这些信息:
注意:这里自动化开发机在10.x.x.x网段与server互通,所以使用的是10网段地址,也可以使用172 管理网段。
REST API :/api/v1/testConfigs/
Parameter: testName, 即用例名称,值为:“RvR-demo”
Server IP 地址:10.25.203.110; 端口号:4000
HTTP Request URL: http://10.25.203.110:4000/api/v1/testConfigs/RvR-demo
HTTP POST 方法举例:
下面用post方法启动一个测试执行。如下图,在Swagger文档中找到 “AutoTest” 这项,设置testName 为我们刚刚存好的测试用例”RvR-demo“。pushConfig 参数 为 “true” 表示要对仿真器推送配置,然后再开始运行测试。如果设为“false” 则不给仿真器推配置,直接开始运行测试。
HTTP 响应的Response
API返回的response code 为202,body部分返回“ok”,说明测试用例已经被成功启动。这个操作等价于在GUI 的Autotest dashboard上按下“Start”按钮。这时打开GUI 页面,我们会发现测试用例“RvR-demo”已经被启动,并正在运行。如下图所示:
打开GUI, 如下图,可以看到"RvR-demo" 正在运行中。
调用API需要如下这些信息:
REST API :/api/v1/autotest/start
Parameter: testName, 即用例名称,值为:“RvR-demo”
Server IP 地址:10.25.203.110; 端口号:4000
HTTP Request URL: http://10.25.203.110:4000/api/v1/autotest/start/RvR-demo
总结, 上面这两个REST API, 一个是GET 方法,一个是POST方法。GET 方法中我们读取了一个已经存在的测试用例的配置,POST 方法我们启动了这个测试用例的执行。当然,我们也可以用API去创建一个测试用例,而不是像上面这样,在配置页面上手工的方式创建用例。在接下来的一个脚本开发的例子中,我们就可以看到怎样用API 来创建一个测试用例,并执行它。
上面我们介绍了如何利用Octobox提供的Swagger 工具使用REST API ,它可以作为开发脚本的手册使用。接下来我们通过python编写一个测试用例来了解一下Octobox自动化开发。
用例要求:创建64个WiFi 工作站,所有工作站同时联上被测物AP的WiFi,每个工作站和AP打一条下行10M UDP流量,一共64条 流。虽然这样的测试用例可以用图形化界面手工创建,但是过程会比较繁杂,这种情况正是体现自动化测试脚本的优势。
我们可以将测试参数放在一个json 格式的参数文件中。具体有哪些参数可以根据测试的具体要求。通常可以将测试床拓扑的参数如:仿真器管理口地址,衰减器地址存在一个测试床参数文件中。把测试用例参数,如流量类型TCP/UDP, 包长,发包速率,WiFi 频段,频宽等存在测试用例参数文件中。下面是一个测试床参数文件的例子。
{
"server_mgmt_ip": {
"label": "Management IP address of server - CHANGE if you have different IP addresses",
"val": "172.16.22.4"
},
"server_traffic_ip": {
"label": "Traffic IP address of server - CHANGE if you want different IP addresses",
"val": "192.168.15.4"
},
"server_subnet_mask": {
"label": "Traffic subnet mask of server - CHANGE if you want different subnet mask",
"val": "255.255.0.0"
},
"QA-A": {
"val": "172.16.20.1",
"label": "QA-A A"
},
"QA-B": {
"val": "172.16.20.2",
"label": "QA-A B"
},
"pal6-C-mgmt": {
"val": "172.16.27.3",
"label": "Management address for Pal6-C"
},
通常用到的测试组件有:仿真器Pal6,Stapal,衰减器 Attenuator或MPE。下面是衰减器和仿真器Pal6的配置。这些模板是如何获取的呢?这就要用到前面介绍的Swagger API 文档中“TestConfig”这个GET方法的返回数据。这个API 返回的json数据给出了所有组件的配置参数。但是这里需要指出的一点:写脚本时,不需要定义这个json数据里所有的参数,只需要选择其中的一些常用值进行设置,而剩下的值会保持其默认值。选择的原则是:选择在GUI上需要设置的参数。所以写自动化脚本之前,是要了解手工测试是如何配置参数的。
# 衰减器配置模板
quadAttens = [
{
"devName": "QA-A",
"address": testbed_configs["QA-A"]["val"],
"active": False,
"dB": 0,
"start": 0,
"stop": 90,
"devType": "quadAttens",
"dbMax": 90,
},
{
"devName": "QA-B",
"address": testbed_configs["QA-B"]["val"],
"active": False,
"dB": 0,
"start": 0,
"stop": 90,
"devType": "quadAttens",
"dbMax": 90,
}
]
# 仿真器Pal6的配置模板
# "BAND_DUAL":表示是Dual band 工作模式
# "BANDWIDTH_80_ADAPT":表示Bandwidth为80M
# "INTERFACE_AX":表示802.11ax 模式
# "SECURITY_WPA2":加密方式
# "RADIO_5":表示5G频段
# "streams":表示空间流数目为2
# "STA":表示Pal6工作在station模式。Pal6还可以配置工作在AP模式。
pal6_config = {
"managementAddr": "172.16.27.3",
"alias": "pal6-1",
"advRatesEnable": False,
"apStaMode": "STA",
"bandConfig": "BAND_DUAL",
"bandwidth": "BANDWIDTH_80_ADAPT",
"bridgeEnable": False,
"interface_": "INTERFACE_AX",
"ipAddress": "192.168.15.100",
"ipGateway": "192.168.15.1",
"ipMode": "IP_STATIC",
"ipNetmask": "255.255.0.0",
"palRadio": "RADIO_5",
"password": "12345678",
"primaryChannel": 36,
"radioEnabled": True,
"security": "SECURITY_WPA2",
"ssid": "Test-5G",
"streams": "2",
"vstaCount": 64,
"vstaConfig": []
}
avsta_config = {
"interface_": "INTERFACE_AX",
"bandwidth": "BANDWIDTH_80_ADAPT",
"security": "SECURITY_WPA2",
"ssid": "Test-5G",
"streams": "2",
}
在这个例子中,我们希望定义64 个WiFi 虚拟station,即vSTA, 用来模拟64个WiFi工作站连接AP,并打流。
# 通过循环定义64个vsta,虚拟station
vstaConfig = []
for i in range(0, 64):
vstaConfig.append(avsta_config)
vstasDict = {
"vstaCount": 64,
"vstaConfig": vstaConfig
}
#将vsta配置更新到pal6_config
pal6_config.update(vstasDict)
# 创建单个流量配置
# "bitrate":发包速率
# "udp":表示UDP类型的流量。也可以设置为"tcp"
# "testDuration":表示打流量的时长,单位是秒
# "settlingTime":表示稳定时间,单位是秒,不计入报告结果统计
# "ipStreams":相当于iperf 的参数 -P --parallel:number of parallel client threads to run
# "window":相当于iperf里的参数-w:TCP window size (socket buffer size)
traffic_apair = {
"to": {
"managementAddress": testbed_configs["server_mgmt_ip"]["val"],
"trafficAddress": testbed_configs["server_traffic_ip"]["val"],
"alias": "Server",
"devType": "server",
"radio": ""
},
"from": {
"managementAddress": testbed_configs["pal6-C-mgmt"]["val"],
"trafficAddress": "192.168.15.100",
"alias": "P6C_5",
"devType": "pal6",
"radio": "SECURITY_WPA2"
},
"name": "Traffic pair",
"testDuration": 30,
"settlingTime": 2,
"active": True,
"alias": "Traffic pair",
"bitrate": "10M",
"trafficType": "iperf3",
"udp": "udp",
"length": "",
"ipVersion": "ipv4",
"ipStreams": 2,
"window": "2M"
}
#根据上面的单个流量配置:traffic_apair,创建64个trafficPair的列表,这里主要是注意地址和名称的变化。
trafficPairList = []
for i in range(0, trafficPairsNum):
...
定义完测试组件,流量参数后,接下来就是定义一个autotest测试用例。
#创建一个autotest对象
print("Creating the complete test object.")
autotest_dict = {}
autotest_dict.update({
"name": "64vstas",
"rvrMode": "Static",
"synchroSnifferCapturing": False,
"trainingInterval": 2,
"stepDuration": 10,
"step": 10,
})
#更新测试配置:
autotest_dict.update({"quadAttens": quadAttens})
autotest_dict.update({"pal6s": [pal6_config]})
autotest_dict.update({"trafficPairs": trafficPairList})
调用创建测试的REST API在server上创建测试用例。创建成功后,调用Autotest start API接口,运行这个测试用例。测试运行起来后,首先会对仿真器,衰减器这些测试组件推送配置,流量配置,然后才开始发送流量并统计流量KPI。最后导出csv/json/pdf格式的测试报告。
# 创建测试用例
print("Create the test")
urlIP = testbed_configs["server_mgmt_ip"]["val"]
REST_TIMEOUT = 120
URL = "http://" + "{}:4000".format(urlIP) + "/api/v1/testConfigs"
testName = "RvR-demo"
myresponse = requests.post(URL, json=autotest_dict, timeout=REST_TIMEOUT)
if (myresponse.json() == "Test Configuration '{}' already exists!".format(testName)):
URL = "http://" + "{}:4000".format(urlIP) + "/api/v1/testConfigs/{}".format(testName)
print("测试用例已经存在,使用HTTP PUT API更新已存在的配置.")
myresponse = requests.put(URL, json=autotest_dict, timeout=REST_TIMEOUT)
#启动测试运行
print("Start autotest")
URL = "http://" + "{}:4000".format(urlIP) + "/api/v1/autotest/start/" + testName
pushConfig = {"pushConfigs": True}
myresponse = requests.post(URL, json=pushConfig, timeout=REST_TIMEOUT)
总结:
本文以一个简单Python样例,介绍如何使用Octobox的REST API开发自动化脚本,这仅仅是最基本的使用。Octobox测试床提供功能完备的自动化测试支持,可以解决很多手工测试没办法解决的问题,测试人员根据具体需求可以开发出更复杂,步骤更多的自动化测试用例。
关键字:Wi-Fi 自动化 REST API HTTP Octobox 指令 Swagger 测试用例开发 WiFi Station 仿真器 json Request Response
推荐阅读:
Octobox TR398 自动化使用指南(二):接收灵敏度测试
延伸阅读:
联系我们:
思博伦官方网站: www.spirent.cn
技术中心热线:400-810-9529
支持邮箱:support@spirent.com
售后网站:support.spirent.com
版权归思博伦通信科技(北京)有限公司所有,思博伦技术中心(SpirentServices)原创发布,转载请联系授权。
长按识别二维码,关注思博伦技术中心