基于Python的路由器产品自动化测试方案设计与实现
2022-12-21郭萌,宗静,许茳,谢露
郭 萌,宗 静,许 茳,谢 露
(1中国电子科技集团公司第三十研究所 四川 成都 610041)
(2中国人民解放军61623部队 北京 100089)
0 引言
路由器是通信网络中的关键设备,无论是骨干网、承载网、接入网,还是在各种各样的专用网络中,路由器必定是其中组网的主角。路由器的稳定运行对于网络的稳定性和可靠性是至关重要的,因此路由器产品的质量保证是重中之重。为提高测试效率、保证产品质量,设计与实现路由器的自动化测试已经成为实际工作中的主流。
1 路由器产品的特点及测试内容
路由器产品有着鲜明的特点。硬件上,路由器产品必须满足一定的特性,如电气特性、功耗、重量、散热、接口特性等。软件上,分为两部分:一部分是用来快速转发而实现的代码功能,部分路由器采用现场可编程逻辑门阵列(field programmable gate array,FPGA)实现;一部分是用来对路由器进行配置、协议组网的功能模块。路由器的功能与性能均与其硬件架构设计、采用的芯片、硬件接口息息相关。本文仅对软件上的功能、性能的自动化测试方案进行阐述,而硬件上的特性,由于测试方法和测试仪器仪均有不同且无法统一,部分内容需要一定的手工测试,因此这里不做讨论。除去硬件特性之外,路由器的测试内容主要分为功能、性能、稳定性与可靠性、管理控制、兼容性这5类[1]。
(1)功能方面,相关的测试项包含[2]:配置类功能(端口配置、接口配置、中继板卡配置、自身信息配置等)、状态信息类功能(端口状态、板卡状态、连接状态、CPU、内存、流量计数、时钟同步、告警信息等)、协议组网类功能(IPv4、IPv6、动态路由协议OSPF、ISIS、BGP、MPLS、ARP、组播协议、各个协议的一致性、路由选路策略等)、安全功能(如IPsec支持、访问控制、安全审计与事件管理、系统日志与操作日志、数据加密、抗重放、抗攻击、流量限速等)。
(2)性能方面,相关的测试项包括:RFC2544主要包括(端口、板卡与整机吞吐量、时延、丢包率、背靠背、时延抖动、错包统计、乱序包统计等)、路由表项容量(OSPF路由表容量、ISIS路由表容量、BGP路由表容量、静态路由表容量等)、路由收敛时间(不同拓扑不同组网协议下的路由收敛时间)、服务质量QOS与优先级(不同中继连接情况下)、第4~7层模拟实际业务流量测试(如在线视频直播业务、视频点播业务、视频监控业务、语音通话业务、文件传输业务)等。
(3)稳定性与可靠性方面,相关测试项包括:长期运行下的稳定性(如大规模组网下的路由稳定性、丢包率、时延、时延抖动等)、极限情况下的应对能力(如突发流量处理与告警、异常流量检测与告警、大量路由震荡、反复的建链断链、畸形报文处理等)、主备切换与冗余链路等。
(4)管理控制方面,相关的测试项包括:对网管的支持能力(增删改查、状态上报与管控)、远程登录、本地管理、在线升级、流量计费等。
(5)兼容性方面,相关测试项包括:产品与不同厂家互连的兼容性、互操作性等。
2 自动化测试的实施思路
目前在各个领域的测试行业中,纯手工测试已经不多见了,自动或半自动化方式的测试在企业中发挥着越来越重要的作用。相比较于手工测试,自动化测试的优势很明显:(1)可以减轻大量的重复性的手工劳动,在冒烟测试、回归测试等过程中,解放“重复劳动”的人力,提高测试效率;(2)实现无法用手工实现的测试(如一些循环操作、时间要求苛刻的操作、大量的重复操作等);(3)采用自动化测试可以更好地发挥测试工具、仪器仪表对测试的作用。
对于一个产品来说,实施自动化测试需要具备以下4个基本条件:(1)该产品已经实现某基线版本,经历了完整的系统测试;(2)该产品的需求未来不会发生巨大变化;(3)该产品是一个长期需要迭代更新的产品,有长期的测试需求;(4)该产品的测试组中具备架构设计、代码开发能力的自动化测试人员。
在设计与实现一个自动化测试方案时,主要考虑以下7个方面:可行性分析、测试需求分析、测试架构选择与组织、自动化测试用例代码编写、自动化测试用例执行、测试架构与代码优化,以及日常维护[3]。
可行性分析是从产品特点、人力情况、项目进度、陪测设备与仪器仪表方面分析,得出一个适合与当前产品的自动化测试组织与实施计划,分析出自动化测试方案设计与实现中可能遇到的困难和风险(风险管理表)并给出一定的解决方案。
测试需求分析是从产品实际入手,逐步分析,哪些测试用例需要自动化测试及用例优先级,给测试开发人员明确的开发目标、开发优先级与开发周期。
测试架构选择与组织,可与可行性分析同步进行,是在分析测试需求的过程中,结合预期的开发内容,选定使用什么样的测试框架,如何组织测试仪和被测设备之间的调用关系,要准备哪些库和类,以及如何根据模块功能的划分测试套件。
3 路由器产品功能与性能自动化测试方案及实现
依据笔者所在的项目经验,下面对路由器产品功能与性能的自动化测试设计方案及实现进行具体阐述。
3.1 开发语言与自动化测试框架的选择
开发语言方面,当前使用的网络性能测试仪(信而泰测试仪与IXIA测试仪)均提供了Python的API接口,本文使用Python语言对测试仪的Python-API进行调用,从而实现对测试仪的数据流量配置、协议仿真配置、测试套件配置、测试结果获取,因此选定采用Python作为自动化测试用例的主要开发语言。
自动化测试框架方面,选定使用pytest。在自动化测试中引入框架,可以减少开发工作量,使用框架提供的插件可较快地实现一些通用性的功能,以提高自动化测试用例的规范性。尤其像pytest这样开源的测试框架,成熟易用,可以提升自动化测试的稳定性、健壮性,并降低维护成本。同时,pytest也具有较好的扩展[4-5],测试人员可以在有需求的情况下自行编写插件或修改插件,以实现更多的功能。
3.2 自动化测试方案架构与流程设计
基于自动化测试的分层思想,本文论述的自动化测试在实现上分为4层(图1),分别为测试数据层、测试用例分层、公共处理层、接口调用与业务处理层。
图1 自动化测试分层方案
(1)测试数据层用来输入测试数据,如配置类数据、路由器的初始化数据、测试仪数据流参数等。
(2)测试用例分层是测试用例的集合,以自动化测试用例执行的主入口,依据路由器功能、性能,划分出不同的测试套件,在执行自动化测试时,可以对不同的测试套件进行组合。
(3)公共处理层是一些常用函数的集合,如测试结果输出的处理、计算、文件创建与保存,以及日志处理模块等。
(4)接口调用与业务处理层是对网络性能测试仪的调用接口和对路由器接口调用的集合,这一层的作用是为了简化测试用例中的调用,对接口做了相应的封装和优化,完成对路由器和网络性能测试仪的配置、操作与数据处理。以针对信而泰网络性能测试仪(BigTao6200/220)python-api的调用为例,接口层的调用涵盖:仪表上线、端口上线、接口配置、协议配置、数据流量配置与启动、数据流报文编辑、数据流报文抓取、数据流量停止与流量结果收集、协议状态数据收集等;涉及信而泰网络性能测试仪的接口有Sysentry(机框连接与初始化)、Port(端口上线与占用)、ResultView(订阅数据流结果)、Interface(接口配置)、Stream Block与StreamTemplate(数据流量模板创建与启动)、Capture(报文抓取与过滤配置)、Protocol(各种协议配置)。这些接口的使用几乎覆盖性能测试中所有的测试用例,为了简化调用和减少重复代码,对上述接口进行二次封装,形成固定的接口调用函数。
4个层次尽量做到解耦合及结构清晰,可以较为详细的分析代码结构和对代码进行维护。不同型号之间的路由器产品也可共用公共处理层和接口调用与业务处理层,仅区分测试数据与测试用例。
以路由器配置类的测试为例,产品配置有2种接口(由于第3种接口是通过统一的网管接口,网管一般存在于大组网环境中,这里不做扩展描述),因此有2种途径对路由器进行测试。一种是通过路由器的本地web接口,使用Python+requests实现对本地web的调用,实现配置项的增删改查;一种是通过登录路由器的后台执行命令行,使用Python+SSH实现对配置项的增删改查。以路由器协议仿真类和RFC2544性能测试套件的测试为例,由于网络性能测试仪的参与,在上述配置类测试的基础上,添加对网络性能测试仪Python-API接口的调用,从而获取网络性能测试仪上的协议仿真测试结果。
在pytest框架,规范编写自动化测试用例与测试套件,组织测试集合,使用pytest的fixture插件以实现参数化测试[5],可使用pytest-html插件实现测试报告的规范导出,使用pytest-repeat和pytest-xdist插件实现重复测试与并行测试。同时,规划了运行日志模块,可随时监控测试用例的执行情况及采集测试中的过程数据,为复杂的自动化测试用例提供结果分析的支撑数据,也可为自动化测试用例的维护和优化提供依据。
综上所述,整体的自动化测试架构方案实施框图,如图2所示。可以看出,在此架构下自动化测试的流程主要分为4个步骤:定义拓扑、测试数据输入与参数准备、自动化测试用例集合执行、测试结果收集。
图2 自动化测试架构方案实施框图
3.3 复杂组网下自动化测试的组织
常规情况下,自动化测试是在路由器单机或简单拓扑下之下运行的,测试目标是完成对功能性能指标的快速回归,这样的测试场景一般不需要复杂拓扑。在特定的针对性测试的情况下,可能会依据实际情况构建复杂的网络拓扑环境,甚至会采用测试仪器仪表构建虚拟网络与实际拓扑相连的场景。此时,自动化测试用例的目标是脚本自动执行并采集测试的结果。
一般适合复杂场景测试的测试项有:路由收敛时间、路由震荡、规模组网下协议稳定性组网等。在这样的情况下,自动化测试的组织,首先对于N个被测设备进行全连接连线,然后在自动化测试中的测试数据输入阶段,提前批量定义测试用例中的配置(如端口的开放与关闭、接口的增加与删除),最后在实现想要的拓扑及在测试用例中实现拓扑变换。
3.4 版本迭代中的自动化测试组织与并行测试
为了快速回归和迭代,结合路由器产品嵌入式软件的特点,在版本迭代中组织自动化测试,以实现在脚本控制下代码的自动打包,且通过路由器产品的在线升级功能,对路由器设备的软件(含FPGA)版本进行更新,最终进行自动化测试用例集合的执行。这个过程并非持续集成的,但与持续集成的相似之处在于,版本迭代过程与自动化测试的结合均是在脚本下自动完成的。而区别之处是持续集成下自动化测试的频率较高,甚至每提交一次代码就可以触发一次自动化测试。由于路由器设备的硬件属性,其实并不需要程序员每提交一次代码就进行一次架上的自动化测试。因此在里程碑版本、正式版本及其他测试版本在必要更新时,才进行自动化测试。版本迭代与自动化测试过程,如图3所示。
图3 版本迭代与自动化测试过程
另外,多个版本同时需要测试时,自动化测试可以并行开展。在pytest框架中可以在插件的控制下将某些测试用例并发执行,以此来减少等待时间,以提高测试效率。这样操作是在单台路由器或固定的组网拓扑,并在测试用例之间确认互不影响的情况下进行。当多个硬件设备(路由器与网络性能测试仪)同时使用,且在多个版本的自动化测试需求下,可以充分利用设备的优势,依据测试重点和关注点,划分测试子集,开展不同的自动化测试。由于网络性能测试仪占用的端口不同、各自被测设备的路由器也不冲突,因此这样的并行测试是完全可行的。
4 结论
本文提出的自动化测试,是在pytest框架下编写全代码形式的自动化测试用例。有着在代码结构、注释清晰的情况下灵活程度较高的优势,因此自动化测试在实际的运行中,由于不同的路由器产品基本的功能与性能有相似性,在不同型号的系列路由器产品中,能够通过修改实现推广使用。在后续的工作中,可必要研究关键字驱动(如Robot Framework测试框架)、更方便代码阅读形式的自动化测试方案。以解决以纯代码形式的测试用例对于初级测试人员来说可能较难的缺点。