一种私有通信协议的测试方法与流程

文档序号:19938335发布日期:2020-02-14 22:51阅读:381来源:国知局
一种私有通信协议的测试方法与流程
本发明属于计算机通信领域,具体涉及一种私有通信协议的测试方法。
背景技术
:在分布式软件开发中,各系统间的数据交换是必不可少的重要组成部分。数据交换主要依靠通信来完成,通信就必须依靠通信协议。通信协议通常有两大类,一类是公共通信协议,一般由rfc定义,例如http、ftp、dns等等;另一类是私有通信协议,私有通信协议具有格式保密,有特定的使用环境,种类繁多,格式多变等特点。对于公共通信协议,通信协议固定且公开,使用者多,市场上有很多专用的测试软件或测试仪表可以完成测试工作。但对于更为大量的私有通信协议,传统的测试工具或仪表就无法进行测试。私有通信协议的设计与开发是一项技术要求很高的工作,设计的水平和开发的质量直接影响整个系统的可用性、性能和安全性,因此需要完备的测试手段。在实际的私有通信协议的设计与开发过程中,通常有下面几类常见问题或错误:1.设计人员的设计不够完善,例如对于丢包、包乱序等问题考虑不周,导致通信过程不稳定,造成某些异常并导致不可预期的结果。2.设计人员与代码编写人员,或者不同软件模块的开发人员之间,对于协议的理解会出现偏差,包括协议报文的基本格式,协议报文的收发序列等方面,结果就是通信结果异常,不符合预期结果,导致不同部门间开发的软件无法互通。3.代码编写人员对于基本报文各个字段的理解有误或者疏忽,对于基本字段取值缺乏保护,导致通信中出现不可预期的问题,甚至导致整个软件模块崩溃,危及整个系统的安全。这也是大部分网络攻击使用的方法。4.代码编写人员对于通信报文序列的处理,包括对于丢包、重发包的处理,在理解上出现偏差或在编写代码时疏忽,导致通信结果异常。5.代码编写人员对于通信数据流的并发处理的算法不合理,结果就是处理少量的并发通信没有问题,但是一旦并发量增加,就会导致其中大量的通信结果异常或失败,导致系统整体性能不佳。6.通信中出现的错误难以跟踪定位,因为导致错误的数据报文或数据流隐藏在大量的通信报文中,当发现错误的时候,原始数据报文早已被丢弃,无法直接恢复错误现场,也就无法有效的定位、修改相应的软件模块,导致开发效率下降。7.代码编写人员对于网络通信原理理解不足,例如tcp协议的拆包、粘包问题,udp协议的丢包、乱序问题等等。在实际通信中出现不可预见的丢包问题,导致通信异常。8.对于专业测试人员来说,目前对于私有通信协议的测试没有统一、高效的标准化方法。测试人员通常采取两种方法对私有通信协议进行测试:一种是手工编写测试程序进行基本的一致性测试,这种方法需要为不同的私有协议编写专用的测试软件。通过软件编程的方法分析各个字段是否正确,或者通过网络抓包的方式抓取测试数据流,手工分析各个字段是否正确。想要构造不同的测试数据报文或数据流,都需要修改测试软件。这种方式要求测试人员编写测试程序,而不同的测试人员水平不同,对于通信测试的理解也不同,测试软件的测试功能具有不确定性。而且测试程序是专用的,没有复用性,也无法进行更加深入的测试。因此这种方法对于测试人员要求过高且效率非常低下,会消耗测试人员大量的时间,测试也不够健全。还有一种方法是通过一些收发包软件,手工构造各个数据报文进行简单的收发测试。通过网络抓包的方式抓取测试数据流,手工分析各个字段是否正确。想要构造不同的测试数据报文或数据流,都需要手工修改数据报文。这种方式只能进行一些最基本的测试,效率更加低下,无法进行较为复杂的测试,测试也不够健全。另外,通信过程是由一系列数据报文组成,每个数据报文由一系列字段组成,每个数据字段的取值范围又是巨大的,想要发现通信中隐藏的问题,需要设计海量的测试例。每个测试例的执行也很困难,需要测试人员自己编写测试代码。由此可见,使用传统的手工测试方法难以进行有效的测试。接口测试目前主要还是依靠测试人员手工构造测试数据,直接观察数据值是否正确,或者是人工编写测试脚本来实施,缺乏全面的自动化测试工具支持。由于软件系统的规模和复杂性越来越大,私有通信协议也越来越复杂,依靠人工构造测试数据从工作量和时间来说已经无法满足当前的测试需要。因此,需要一种新的针对私有通信协议的定义和测试方法,能够适应各种不同的私有通信协议,能够快速、智能地生成测试用例,帮助开发或测试人员对私有通信协议进行完整的测试。技术实现要素:本发明提出了一种私有通信协议的测试方法,通过这种方法,能够自动生成符合私有通信协议的数据报文并产生数据流,自动检查通信结果是否正确,对被测试通信设备或软件进行一致性、性能、健壮性的全面测试,从而解决上述技术问题。本发明的有益效果:本发明提出的私有通信协议的通用定义和测试方法,能够完整、准确地描述多变的私有通信协议,同时提出了完备的测试方案。本发明能够通过配置文件的方式保存、恢复私有通信协议的定义和测试方案,能够快速反复地进行测试,大幅度地提高通信软件的开发和测试效率,缩短通信软件开发、测试周期,解决了私有通信协议复杂、多变,没有一种统一的定义方法的问题,解决了私有通信协议没有统一、完善的测试方法的问题。附图说明图1是本发明提出的私有通信协议的测试方法的流程图;图2是本发明提出的私有通信协议的测试方法中数据报文生成和访问方法的示意图;图3是本发明提出的私有通信协议的测试方法中脚本运行流程示意图。具体实施方式为使本发明的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本发明进一步详细说明。但本领域技术人员都知晓,本发明并不局限于附图和以下实施例。本发明提出了一种私有通信协议的测试方法,用来根据设计的私有通信协议对被测试端的私有通信协议进行测试。所述测试方法如图1所示,包括以下步骤:步骤s101:生成测试用配置文件;测试用配置文件包括内嵌脚本以及由正确数据字段组成的数据报文,正确数据字段符合设计的私有通信协议对数据字段的定义,正确数据报文符合设计的私有通信协议对数据报文的定义。内嵌脚本基于数据字段运行,用于动态生成测试数据报文,以及检验数据字段的正确性。数据字段的定义包括:根据设计的私有通信协议定义数据字段的类型、通过内嵌脚本定义数据字段的初始正确值、通过内嵌脚本定义数据字段之间的逻辑关系、通过内嵌脚本定义数据字段值正确性检查规则。多个数据字段定义组成数据报文定义。数据报文包括将发送的数据报文和将接收的数据报文两大类。本发明中的数据字段定义同c/c++保持兼容,方便进行以c/c++头文件的方式导入成数据字段定义和数据报文定义,定义数据报文后,在数据报文中定义数据字段。下表1示出了数据字段的类型、bit或byte长度及其最大长度。数据字段类型c/c++类型bit长度byte长度最大长度charchar√8ucharunsigedchar√8shortshort√16ushortunsignedshort√16intint√32uintunsignedint√32stringchar*√2048binunsignedchar*√2048表1数据字段的定义本发明中数据字段访问方法是基于xpath的数据字段访问方法,如表2所示。表2xpath的数据字段访问方法针对上述c/c++兼容的数据字段类型,每个数据报文用一棵n叉树来表示。数据报文由根节点、一系列下层节点和最终数据字段组成,下层节点又可以包含一系列下层节点和最终数据字段。每个数据字段必须是一个叶子节点。每个叶子节点都可以由xpath来准确定位。xpath用来访问数据报文树内部的数据字段。数据报文树的根节点,以及每一个下层节点、叶子节点(数据字段)都有一个名字,要求同一层的节点名字唯一。通过一系列名字就可以方便地访问任意数据报文的任意数据字段。本发明的数据报文生成和访问方法如图2所示,在本发明的数据报文生成和访问方法中,数据字段间的逻辑关系可以被总结为三大类:(1)固定结构这类报文的每个字段的所有属性都是预先定义好的。(2)tlv(类型+长度+内容)结构这类报文由一系列子tlv结构组成,v的长度是动态的,由l的值来指定。(3)tv(类型+内容)结构这类报文由一系列子tv结构组成,v的长度是动态的,具体值和t相关。通过xpath可以精准地读、写或生成任意一个数据字段。将数据报文树的所有数据字段依次生成,拼接在一起就能够生成完整的数据报文。同理将收到的数据内容依次读入到各个数据字段就可以得到数据报文树。在本发明中,内嵌脚本语言支持基本的赋值、比较、判断和表达式,如下表3所示。=赋直==比较相等!=比较不相等?=调用c/c++扩展函数表3内嵌脚本支持的操作符一条完整的内嵌脚本格式如下:[domain::]+xpath+operator+express+[condition]其中操作符(operator)支持“=”、“==”、“!=”和“?=”。表达式(express)支持“+”、“-”、“*”、“/”、“()”和“@”。其中@表示正则表达式。例如:$http.response.result=@“200ok”,意思是判断http协议的响应结果是否包含“200ok”字符串。条件表达式[condition]支持“if”,当[condition]为真时才执行前面的语句。本发明的内嵌脚本可以采用cobra内嵌脚本,cobra内嵌脚本支持c/c++扩展函数,操作符为“?=”。格式如下:xpath?=exampleextfunc(index)exampleextfunc:扩展函数的名字。index:任意数字,用于exampleextfunc区分不同的调用点。本发明可以通过c/c++扩展函数提供附加功能,扩展方式提供了灵活的框架,可以方便的为添加各种复杂功能。扩展函数原型定义:返回值:true表示成功;false表示失败,错误信息由参数info_out_buf返回。步骤s102:生成测试数据流;运行内嵌脚本,根据设计的私有通信协议对数据字段的定义,依次生成每个数据字段值,这些数据字段值拼接成完整的数据报文,由此动态生成测试数据报文;运行运行脚本,根据测试数据报文动态生成测试数据流。运行脚本基于数据报文运行,用于动态生成测试数据流,以及控制数据流中的数据报文发送、接收、循环、延时等操作。在运行脚本中,定义数据报文的循环、接收、发送,以及不同数据报文的发送重传、接收超时等参数。通过运行脚本控制收发顺序,将多个数据报文组合在一起,形成基本数据流。本发明的运行脚本语言支持通过运行脚本语言来配置数据流,如表4所示。支持6条具体命令send、receive、sleep、exhaust、pipe、loop。不同的命令有不同的附加参数。后端测试核心读取命令并执行,完成实际的测试。表4运行脚本支持的命令本发明的脚本运行流程如图3所示,测试数据报文和数据流都是随着脚本运行动态生成,运行脚本包括所述运行脚本和所述内嵌脚本。运行脚本基于数据报文运行,内嵌脚本基于数据报文内部的数据字段运行。内嵌脚本按照调用时间点分有两类:(1)数据字段前点调用:在生成或接收一个数据字段之前调用。(2)数据字段后点调用:在生成或接收一个数据字段之后调用。测试软件将运行脚本和内嵌脚本以交差的方式组合在一起,形成完整的基本测试逻辑。图3中,以数据报文基本定义send_1为例,运行脚本通过send命令,将数据报文基本定义send_1内嵌脚本运行并生成测试数据报文,发送到被测试设备。被测试设备收到后发回rcv_1数据报文,运行receive命令接收数据报文,根据rcv_1的数据报文基本定义运行内嵌脚本生成数据字段并检查数据字段是否符合预期。数据流内的其它数据报文流程类似。步骤s103:测试被测试端的私有通信协议;生成的测试数据流发送给被测试端,根据被测试端的私有通信协议解析测试数据流后返回的数据报文,判断被测试端的私有通信协议是否通过测试。其中,内嵌脚本根据设计的私有通信协议对数据字段的定义,依次接收返回的数据报文中每个数据字段值,按照数据字段检查规则检查数据字段值是否正确。所述测试包括对被测试端的私有通信协议的一致性测试,用于测试被测试端的私有通信协议的定义是否与设计的私有通信协议一致。一致性测试是根据设计的私有通信协议对数据报文和数据流的基本定义、内嵌脚本定义的数据字段之间的逻辑关系,生成真实(正确)的数据报文和数据流,进行一致性测试;并且按照内嵌脚本定义的数据字段正确性检查规则来检查被测试端返回的数据报文是否有错误产生。其中,一致性测试中真实的数据报文和数据流为正确的数据报文和数据流。在进行一致性测试之前,需要配置正确的数据字段值、超时的可接受范围和预期的测试数量等一致性测试规则。在进行一致性测试时,在所述步骤s102中,所述测试数据报文为内嵌脚本根据所述正确数据字段生成正确的测试数据报文,所述运行脚本根据正确的测试数据报文生成测试数据流,并且一次仅生成一条测试数据流;在步骤s103中,将生成的测试数据流发送给被测试端,并且一次一致性测试仅向被测试端发起一次通信测试;如果被测试端返回的数据报文经内嵌脚本解析后符合一致性测试预期,则被测试端的私有通信协议通过本次一致性测试;接着,重新生成所述测试数据流,再次对被测试端的私有通信协议进行一致性测试,直到被测试端的私有通信协议未通过某次一致性测试或者一致性测试的次数已达到预期的测试数量,每次一致性测试所使用的正确数据报文不同,以及所生成的测试数据流不同。一致性测试的预期结果包括:测试数据报文收发成功,超时在定义的可接受范围内,所有返回的数据报文中数据字段按照内嵌脚本定义的数据字段正确性检查规则检查正确。所述测试还包括对被测试端的私有通信协议的性能测试,用于测试被测试端的私有通信协议是否能够处理多路并发测试数据流。性能测试是根据数据报文和数据流的基本定义和内嵌脚本定义的字段间逻辑关系,生成真实的数据报文和数据流,进行多路扩展后进行性能测试;并且按照数据字段正确性检查规则来检查被测试端返回的数据报文是否有错误产生。其中,性能测试中真实的数据报文和数据流为正确的数据报文和数据流。在进行性能测试之前,需要配置测试数据流随时间增加的并发数量以及并发数量极值等性能测试规则。所述性能测试在一致性测试通过后进行。在进行性能测试时,在所述步骤s102中,所述测试数据报文为内嵌脚本根据所述正确数据字段生成正确的测试数据报文,所述运行脚本根据正确的测试数据报文生成基本测试数据流,一次仅生成一条基本测试数据流,并且将生成的基本测试数据流扩展成多路并发数据流;在步骤s103中,发送该多路并发数据流,并且一次性能测试仅向被测试端发起一次通信测试,即同时将该多路并发数据流发送给被测试端;如果被测试端对每路并发数据流返回的数据报文经内嵌脚本解析后都符合性能测试预期,则被测试端的私有通信协议通过本次性能测试;接着,增加数据流的并发数量,再次对被测试端的私有通信协议进行性能测试,直到被测试端的私有通信协议未通过某次性能测试或者数据流的并发数量已达到并发数量极值。性能测试的预期结果包括:所有数据报文收发成功,超时在定义的可接受范围内,所有返回的数据报文中数据字段按照内嵌脚本定义的数据字段正确性检查规则检查正确。进一步地,可以对被测试端的私有通信协议进行多次性能测试,每次性能测试所使用的正确数据报文不同,以及所生成的测试数据流不同,测试数据流随时间增加的并发数量以及并发数量极值也可以不同。所述测试还包括对被测试端的私有通信协议的健壮性测试,用于测试被测试端的私有通信协议是否能够承受错误数据流的攻击。健壮性测试是根据数据报文和数据流的基本定义和内嵌脚本定义的字段间的逻辑关系,自动且依次在不同的字段中插入错误后,生成真实的数据报文和数据流,进行健壮性测试,其中,健壮性测试中真实的数据报文和数据流为错误的数据报文和数据流。健壮性测试时,内嵌脚本忽略数据字段正确性的检查规则。在进行健壮性测试之前,需要配置需自动插入错误的数据字段、插入的错误值范围和测试例生成数量等健壮性测试规则。所述健壮性测试在一致性测试通过后进行,或者在性能测试通过后进行。在进行健壮性测试时,在所述步骤s102中,所述测试数据报文包括正确的测试数据报文和含有错误的测试数据报文,所述正确的测试数据报文为内嵌脚本根据所述正确数据字段生成的测试数据报文;所述含有错误的测试数据报文为内嵌脚本按照测试规则自动在正确数据字段中插入错误而生成的测试数据报文,含有错误的测试数据报文的数量为所述测试例生成数量,每个含有错误的测试数据报文插入错误的数据字段不同,和/或,插入的错误值不同;所述运行脚本根据正确的测试数据报文生成一条正确的测试数据流,所述运行脚本根据一个含有错误的测试数据报文生成一条含有错误的测试数据流;在步骤s103中,按照一条含有错误的测试数据流和一条正确的测试数据流交替的方式,将生成的测试数据流发送给被测试端,如果被测试端对每个正确测试数据流返回的数据报文经内嵌脚本解析后,都符合健壮性测试预期,则被测试端的私有通信协议通过本次健壮性测试。一般来说,健壮性测试只进行一次,但为了提高测试的准确性,也可以对被测试端的私有通信协议进行多次健壮性测试,每次健壮性测试所使用的正确数据报文不同,错误数据字段值也可以不同,错误插入的位置也可以不同。健壮性测试的预期结果包括:被测试端能够忽略含有错误的测试数据流,并正确响应后续的正确的测试数据流;对于含有错误的测试数据流不进行数据字段的正确性检查,对于正确的测试数据流进行完整的检查,包括所有数据报文收发成功,超时在定义的可接受范围内,所有返回的数据报文中数据字段按照内嵌脚本定义的数据字段正确性检查规则检查正确。通过对正确的测试数据流的检查结果,判断被测试端的状态,完成健壮性测试。以上,对本发明的实施方式进行了说明。但是,本发明不限定于上述实施方式。凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1