Spirent Octobox自动化中文版教程(一)门道初探之Python实战基础篇

文摘   2024-07-30 11:40   北京  

众所周知,没有自动化支持的测试是很难在测试点覆盖,性能评估,开发迭代中取得高效率的进展。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自动化脚本。本文包括以下内容:

  1. 开发环境的搭建

  2. REST API Swagger 文档

  3. 基于Python开发一个测试用例


开发环境搭建

Octobox REST API 接口不限制开发脚本的语言, 任何一种语言都可以调用REST API 接口,它遵循的是客户端-服务器的模型。例如,脚本调用一个API接口来获取一个状态,就是向一个URL地址发送一个HTTP GET请求, 然后在HTTP的响应中读取返回值。

1

开发机的准备

准备一台独立的电脑作为脚本开发机,需要至少一个网口。操作系统是Linux 或Windows可依照开发者习惯。不要使用Octobox server 作自动化开发环境,因为复杂的安装和设置可能会对Server的配置产生影响,导致一些其他的问题。

2

网口配置

自动化开发机的IP地址要和Octobox Server是 IP 可达的。因为所有的REST API 调用是通过HTTP 协议发给Octobox Server 进行处理的。而通常Octobox Server 上一定会配置的网段地址是172 和192两个网段。大多数的使用者还会为其配置第三个网口,接入公司内网或实验室网络例如:10.X.X.X 网段。 我们推荐自动化开发机避开192网段,因为它是用于打流测试的网段,所以172网段和10网段都是可以使用的。

3

Python IDE 开发环境

根据开发者个人喜好,通常选择一款习惯的集成开发环境。例如Pycharm,VSCode ,Sublime Text等。下一步安装requests, python-socketio 和一些开发者可能需要的python package。


REST API Swagger 文档

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 方法举例:

我们先来查看一个定义好的Autotest测试用例,通过学习它的配置,我们可以了解如何用API 去创建自己的测试用例 。首先通过Octobox的软件界面,配置一个仿真器如Pal6E或者Stapal6E,配置流量对,然后点“Save” 按钮,保存一个Autotest 用例,用例名称为“RvR-demo”。接下来,我们要通过Swagger 调用REST API ,读取这个测试用例的配置。在Swagger文档中找到“TestConfig”这个部分,点开它,会看到所支持的API 列表,点选第一个"GET" API ,然后点按钮:”Try it out”,在文本框“testName”中输入我们刚刚通过GUI 存好的“RvR-demo”,然后点执行按钮 “Execute”。如下图所示:


  • 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 来创建一个测试用例,并执行它。


基于Python的测试用例开发

上面我们介绍了如何利用Octobox提供的Swagger 工具使用REST API ,它可以作为开发脚本的手册使用。接下来我们通过python编写一个测试用例来了解一下Octobox自动化开发。


用例要求:创建64个WiFi 工作站,所有工作站同时联上被测物AP的WiFi,每个工作站和AP打一条下行10M UDP流量,一共64条 流。虽然这样的测试用例可以用图形化界面手工创建,但是过程会比较繁杂,这种情况正是体现自动化测试脚本的优势。

1

定义测试参数文件

我们可以将测试参数放在一个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"
},


2

定义测试组件配置

通常用到的测试组件有:仿真器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)
3

定义测试流量配置
# 创建单个流量配置
# "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):
...
4

定义测试用例配置

定义完测试组件,流量参数后,接下来就是定义一个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})
5

创建测试用例并运行测试

调用创建测试的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 自动化使用指南(一)

Octobox TR398 自动化使用指南(二):接收灵敏度测试


延伸阅读:

CyberFlood测试指南 - 如何调用自动化API







联系我们:

思博伦官方网站: www.spirent.cn

技术中心热线:400-810-9529

支持邮箱:support@spirent.com

售后网站:support.spirent.com


版权归思博伦通信科技(北京)有限公司所有,思博伦技术中心(SpirentServices)原创发布,转载请联系授权。


长按识别二维码,关注思博伦技术中心

思博伦技术中心
思博伦技术中心由思博伦全球服务部的技术团队管理和维护。我们致力于提供完善的技术支持,并定期更新。通过我们的微信平台您将获取最新的产品发布信息,全面的产品使用技巧,实用的常见问题解决方案,以及完善的售后服务流程。
 最新文章