背景技术
ASN.1(抽象语法规则1)是一种用于描述结构化客体的结构和内容的语言,是一种用于定义语法的描述语言,用于描述在网络上传递的消息。ITUT(国际电信联盟标准化部门)建议对ASN.1进行了详细描述,ASN.1允许设计者定义数据结构中的各个参数而不必去关心这些参数在网络中传送时是怎样编解码的。ASN.1特别适合表示现代通信应用中那些复杂的、变化的及可扩展的数据结构。
ASN.1可分为语法规则、编码规则两个部分。其中:
语法规则:说明如何从数据类型、内容顺序或结构等方面来描述消息的内容;
编码规则:说明如何编码实际消息中的数据。
由于ASN.1具有完全标准化的特点,因而众多厂商为其在各种不同的平台和编程语言环境下提供了应用系统。ASN.1接口是使用ASN.1语法描述的系统接口。ASN.1接口为跨编程语言、跨平台、跨机器的应用提供了可靠方便的手段。采用ASN.1接口的系统的基本结构如图1所示,接口两端的模块可以分别运行在不同的计算机上,并且可以通过不同的编程语言来实现。
在一般情况下,图1所示的系统中的模块A和模块B功能上相对独立,并且在系统开发过程中很难做到同步开发,因而需要通过模拟工具分别对模块A和模块B进行模拟,然后通过ASN.1接口在模拟模块和被测试模块之间传递命令,以便在系统开发过程中实现对单独模块内部的调试或测试。通过模拟工具模拟模块A来实现对模块B的调试或测试模型如图2所示,其主要原理为:在模块B的开发过程中,使用模拟工具模拟模块A,然后通过ASN.1接口向模块B下发命令,并对模块B返回的结果进行判断,实现对模块B的调试或测试。
目前在电信网管等大型软件系统中ASN.1已经得到了广泛应用。
现有技术中利用ASN.1接口对软件模块进行调试或测试的一种方法为:直接使用电信网管等大型软件系统中提供的编译过的库文件或头文件,并使用所述大型软件系统对应的编程语言进行模块A的模拟,然后通过ASN.1接口向模块B下发命令,并对模块B返回的结果进行判断,实现对模块B的调试或测试。
该软件模块测试方法的缺点为:
1、由于电信网管等大型软件系统都是采用比较复杂的编译型语言(如C/C++、Java等),因此,该方法对软件模块的模拟和整个测试系统的建立实现起来复杂度较高;
2、电信网管等大型软件系统的编程语言的编译需要花费很长时间,而在对软件模块的测试过程中,测试用例的增加和维护是比较频繁的,并且每次修改或增加测试用例,都需要经过编译和连接程序的处理,因此,该方法对测试用例和模拟系统的维护比较困难,需要花费大量时间。
现有技术中利用ASN.1接口对软件模块进行调试或测试的另一种方法为:利用一些工具把ASN.1结构转化成具有数据编辑功能的图形树,并利用该图形树实现图2所示模型中的对模块A的模拟和对模块B的即时调试和测试。
该软件模块测试方法的缺点为:
1、缺乏动态构造ASN.1接口命令的能力;
2、只提供即时调试和测试功能,花费了大量时间构造的测试用例数据无法保存重用,无法实现自动测试。
发明内容
鉴于上述现有技术所存在的问题,本发明的目的是提供一种软件模块的测试方法,从而有效地降低对软件模块进行测试所需要的模拟系统和测试用例的复杂程度,加快了系统开发和测试进度。
本发明的目的是通过以下技术方案实现的:
一种软件模块的测试方法,包括:
A、通过脚本语言建立抽象语法规则ASN.1接口命令;
B、将所述ASN.1接口命令下发到待测试软件模块;
C、根据所述待测试软件模块返回的对所述ASN.1接口命令的处理结果,获得对待测试软件模块进行测试的测试结果。
所述的待测试软件模块可以为电信网管中的软件模块。
所述的步骤A进一步包括:
A1、通过工具建立对待测试软件模块进行测试所需要的模拟模块;
A2、根据所述模拟模块,通过脚本语言建立对待测试软件模块进行测试所需要的ASN.1接口命令脚本;
A3、通过工具将所述ASN.1接口命令脚本编码为ASN.1接口命令。
所述的步骤A1还包括:
所述模拟模块建立和待测试软件模块之间的连接。
所述的步骤A2进一步包括:
A21、根据所述模拟模块,建立对待测试软件模块进行测试所希望获得的期望结果;
A22、根据所建立的期望结果,通过所选择的脚本语言建立对待测试软件模块进行测试所需要的ASN.1接口命令脚本。
所述的步骤B进一步包括:
所述模拟模块将所述ASN.1接口命令下发到待测试软件模块。
所述的步骤C进一步包括:
C1、所述待测试软件模块对接收到的ASN.1接口命令进行相应的处理,并将处理结果返回给所述模拟模块;
C2、所述模拟模块根据所述待测试软件模块返回的处理结果,获得对待测试软件模块进行测试的测试结果。
所述的步骤C2进一步包括:
C21、所述模拟模块将接收到的所述待测试软件模块返回的处理结果进行解码,获得解码结果;
C22、所述模拟模块将所述解码结果和所述期望结果进行比较,获得对待测试软件模块进行测试的测试结果。
所述的步骤C22进一步包括:
如果所述解码结果和所述期望结果相一致,则对待测试软件模块进行测试的测试结果为正确;
如果所述解码结果和所述期望结果不一致,则对待测试软件模块进行测试的测试结果为不正确。
所述的步骤C还包括:
所述模拟模块获得对待测试软件模块进行测试的测试结果后,关闭其和所述待测试软件模块之间的连接。
由上述本发明提供的技术方案可以看出,本发明和现有技术相比,本发明使用相对简单的脚本方式处理ASN.1接口命令,具有下面优点:脚本语言简单易用,因此,本发明有效地降低了对软件模块进行测试所需要的模拟系统和测试用例的复杂程度,加快了系统开发和测试进度;本发明能够提供动态构造ASN.1接口命令的功能;脚本化的测试用例便于实现模拟系统和测试用例的重用,本发明为实现利用ASN.1接口自动对软件模块进行测试提供了基础;本发明能够把调试和测试过程中相对一致的部分独立出来,便于提供稳定可靠的支撑模块,让开发和测试人员只完成关键性的测试用例构造过程。
具体实施方式
本发明提供了一种软件模块的测试方法。本发明的核心为:使用相对简单的脚本方式处理ASN.1接口命令,有效地降低了对软件模块进行测试所需要的模拟系统和测试用例的复杂程度。
下面结合附图来详细描述本发明所述方法,本发明所述方法的原理如图3所示,其基本原理为:
通过一些工具模拟模块A形成模拟模块A,模拟模块A通过脚本语言构造ASN.1接口命令,并把该ASN.1接口命令下发到模块B。模块B在接收到该命令后,对其进行相应的处理,并把处理结果返回给模拟模块A。模拟模块A接收到模块B返回的处理结果后,把该处理结果与期望结果进行比较,如果处理结果和期望结果相一致,则对模块B的调试或测试结果为正确;如果处理结果和期望结果不一致,则对模块B的调试或测试结果为不正确,需要对模块B进行修改,然后重复上述测试过程。
本发明所述方法的具体处理流程图如图4所示,包括如下步骤:
步骤4-1、使用工具建立模拟模块A。
首先,使用工具模拟模块A建立模拟模块A,本次测试将利用该模拟模块A来实现对模块B的调试或测试。
步骤4-2、建立模拟模块A和模块B的连接。
使用一些工具建立通过步骤4-1所建立的模拟模块A和模块B之间的连接。
步骤4-3、构造下发到模块B的ASN.1接口命令脚本。
构造本次对模块B的调试或测试所希望获得的期望结果,选择一种常用的测试脚本语言如TCL语言作为本次测试要用的脚本语言,根据所构造的期望结果,按照所选择的脚本语言的语法,构造本次测试所需要的、下发到模块B的ASN.1接口命令脚本。所构造的ASN.1接口命令脚本中可以包含一些自定义的ASN.1脚本的语法。
步骤4-4、根据构造的ASN.1接口命令脚本,编码下发到模块B的ASN.1接口命令。
通过一些工具将所构造的ASN.1接口命令脚本进行编码,即将所构造的ASN.1接口命令脚本转换成二进制的ASN.1接口命令。并且将编码结果打印出来,便于对ASN.1接口命令脚本本身进行调试和维护。
步骤4-5、模拟模块A把编码的结果下发到模块B。
模拟模块A通过建立的模拟模块A和模块B之间的连接,把通过步骤4-4所获得的编码结果,即所编写的ASN.1接口命令下发到模块B。
步骤4-6、模拟模块A接收模块B返回的对下发的ASN.1接口命令的处理结果。
模块B接收到模拟模块A下发的ASN.1接口命令后,对所接收到的ASN.1接口命令进行相应的处理,并将处理结果返回给模拟模块A。
模拟模块A将所编写的ASN.1接口命令下发到模块B后,便等待模块B对下发的ASN.1接口命令的处理结果,直到接收到模块B返回的处理结果。
步骤4-7、模拟模块A对接收到的返回结果进行解码。
模拟模块A通过一些工具对接收到的模块B的返回结果进行解码,得到和所述期望结果相对应的解码结果。
步骤4-8、模拟模块A把解码后的结果与期望结果进行比较。
模拟模块A把通过步骤4-7所获得的解码结果与所述期望结果进行比较,以获得本次对模块B的调试或测试的结果。
步骤4-9、模拟模块A记录解码结果与期望结果的比较结果。
如果所述解码结果与所述期望结果相一致,则本次对模块B的调试或测试的结果为正确;如果所述解码结果与所述期望结果不一致,则本次对模块B的调试或测试的结果为不正确,需要对模块B进行修改。
步骤4-10、关闭模拟模块A与模块B之间的连接。
在本次对模块B的调试或测试完毕后,关闭模拟模块A与模块B之间的连接。
通过重复步骤4-3~4-9,可在一个模拟模块A和模块B之间的连接上实现多条ASN.1接口命令的调试和测试过程,也可以通过直接重复步骤4-1~4-10(即每次收发一条ASN.1接口命令都单独建立一条连接),实现在模拟模块A和模块B之间多条ASN.1接口命令的调试和测试。
下面以软件测试过程中常用的测试脚本语言TCL为例,给出一个本发明所述方法的简单实现范例:
#首先载入相关的TCL扩展包,这一步骤是TCL脚本语言的特征,要在
#脚本中使用某功能,则必须在该脚本被执行之前加载该功能所在的
#TCL扩展包。
package require ASN1
package require MOD_B
#构造期望结果,本范例中的期望结果是一个字符串
set strExpect“:asn1getcfgstaticdatarsp-gseq{result-gseq{{isSuccess-gb 1}{retCode-oi 0}{reason-os\″xxx\″}}}”
#步骤1:连接本机模块B,如果模块B运行其它机器上,
#把本机IP地址(127.0.0.1)换成对应IP地址即可
mod_b_Connect 127.0.0.1
#步骤2:构造下发到模块B的ASN.1接口命令脚本
#假设下发的命令名称为:asn1getcfgstaticdatareq,
#与其对应的返回命令名为,asn1getcfgstaticdatarsp,
#下发的命令有一个唯一的整型字段“userID”,值被指定为10,其中
#的“:”、“-gseq”、“{”和“}”都是自定义的ASN.1脚本的语法
#并非ITUT建议中定义的标准ASN.1的语法,可以有不同的实现形式。
set ASN1Cmd″:asn1getcfgstaticdatareq-gseq{userID-gi 10}″
#步骤3:编码
set strEnc[asn1_Encode $ASN1Cmd]
puts$strEnc #打印编码结果,便于脚本本身的调试和维护
#步骤4:向模块B下发编码结果
#步骤5:接收模块B返回的结果并保存在变量strRsp中
set strRsp[mod_b_Exec $strEnc]
#步骤6:对返回结果解码
set strDec[asn1_Decode-t $strRsp]
puts $strDec #打印解码结果,便于脚本本身的调试和维护
#步骤7:把解码结果与期望结果进行比较
#步骤8:记录实际结果与期望结果比较结果
verify_str strDec strExpect
#步骤9:关闭与模块B的连接
mod_b_Close
本发明所述方法的所有实现范例中,除了构造的期望结果和下发的ASN.1接口命令的脚本不同外,其它过程都是一致的,因而可以把这一部分脚本和支撑过程独立出来,构成独立稳定的模块。所以对模块A和模块B之间ASN.1接口命令集的测试就变成了为命令集中每条命令构造期望结果和下发命令脚本两个过程,避免了开发和测试人员接触复杂的编程语言和大量复杂并且耦合在一起的模拟和测试用例程序。
综上所述,利用本发明会减少系统复杂度,可以大幅加速软件模块的测试过程,也有利于缩短软件开发周期。同时本发明通过将ASN.1接口命令进行脚本化,可以提高模拟模块和测试用例的重用性,为实现软件模块的自动化测试提供了基础。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。