用例驱动自动化测试在国产化环境下应用

2018-03-03 13:12冯亚玲徐莺
数字技术与应用 2018年11期
关键词:Python语言自动化测试

冯亚玲 徐莺

摘要:针对传统API接口测试用例数据量大、用例和脚本管理繁琐以及国产化环境下缺乏通用测试工具的问题,本文通过对API接口自动化测试技术特点和国产化应用技术特点的分析,设计了基于Excel用例模板的API接口通用自动化测试工具,采用Python语言开发代码,将测试用例、测试数据和测试执行的代码分层开发,实现了用例数据驱动API接口自动化测试在国产化环境下的应用。

关键词:API接口;用例数据驱动;自动化测试;国产化环境;Python语言

中图分类号:TP312 文献标识码:A 文章编号:1007-9416(2018)11-0097-05

0 引言

API接口测试是软件测试中非常普遍而重要的测试类型,能够覆盖业务规则,体现系统行为[1],测试可信度高、效果好。API接口测试要求测试工程师了解软件的设计及接口的定义,针对功能、性能和稳定性等方面要求,编写相应的测试代码、构造各种测试用例进行测试。

每一个API接口都有其自身特点,组成的业务逻辑复杂,在测试过程中,需要针对每个API接口设计一套测试脚本,模拟各种正常、异常的测试参数[2],比对实际结果与期望结果的一致性,测试工作量大,脚本和用例的维护工作繁琐,要求测试人员始终保持高度谨慎;同时,软件API接口使用环境种类繁多,包括X86平台,国产化平台,Windows系统,国产化操作系统等,要求API接口測试工具能满足国产化需求,兼容各种主流平台环境。如果能实现用例驱动API接口自动化测试在国产化环境下的应用,既可以减轻手工测试的强度,又可以满足国产化环境测试需求,提高接口测试的自动化水平和软件质量[3]。

1 Python与自动化和国产化

Python可定义为面向对象的脚本语言,开发和迭代的效率极高[4];它内置了众多支持一系列应用级编程任务的标准库,可通过自行开发的库或众多第三方的扩展库进行扩展。Python脚本可通过灵活的集成机制轻松地与应用程序的其他部分进行通信,Python可以使用C和C++的库,可以被C和C++的程序调用,可以与Java组件集成。Python所具有的质量和效率优点,以其付出更少的精力完成更多的任务而成为自动化测试开发的首选语言。

Python的标准实现是由可移植的ANSIC编写,除了语言解释器本身以外,Python自带的标准库和模块在实现上也尽可能地考虑了跨平台的可移植性[5]。Python程序自动编译成可移植的字节码,这些字节码在已安装兼容版本Python的平台上运行的结果都是相同的。这意味着Python程序的核心语言和标准库可以在Linux、Windows和其他带有Python解释器的平台上无差别运行,能很好的满足兼容各种平台环境的测试需求。

2 API自动化测试应用工具的特性分析

API自动化测试应用工具是为了实现适用于各种主流平台的软件接口自动化测试需求,它应该包括用例驱动性、API接口通用性、平台兼容性等需求特性。

2.1 用例驱动性

用例驱动性指的是用例数据驱动API接口自动化测试。API接口除了实现其本身的功能之外,还与其他接口存在上下文关系,多变的接口关系组成各种业务测试逻辑。本质上测试执行的每一步都只是一个接口,可以抽象出执行逻辑[6],使测试的执行逻辑与业务逻辑无关,达到测试执行脚本与接口业务逻辑关系解耦合的目的。因此,测试人员根据用例模板进行测试用例数据设计,体现接口调用顺序和参数关系,无需关心测试脚本的调用和执行,由测试工具根据用例数据进行接口函数识别、接口参数识别和封装,通用化透明化地进行测试业务流程执行。

2.2 API接口通用性

API接口通用性指的是API自动化测试应用工具适用于所有API接口类型的DLL库和.SO库的接口测试,满足功能、性能和稳定性测试需求。软件API接口虽然繁多,但接口的输入输出测试、接口的异常参数处理重复性较强[7],接口测试的结果易于形式化处理,测试用例间存在较大的共性,可对这些用例进行模板定制,形成模板化可通用的测试工具。

2.3 平台兼容性

平台兼容性指的是API自动化测试应用工具可以在Linux、Windows和其他带有Python解释器的平台上无差别运行,且能方便地在测试环境中进行快捷部署。

3 API自动化测试应用工具的框架研究与设计

在实际系统中,针对API接口测试形成模板化可重用的测试架构,可以解决测试自动化问题,降低自动化测试脚本设计的复杂度,提高测试工具的通用性和可扩展性,真正带来提高效率的价值。

3.1 框架设计

API自动化测试应用工具的主要目标是接收测试用例,转换成测试数据进行测试执行,最终输出测试结果。

根据API自动化测试应用工具的特性分析,测试框架采用分层结构[8],由测试输入层、测试数据层、测试执行层、测试输出层组成,每一层通过各功能模块实现自己特定的任务,各层之间根据需要去进行调用。各功能模块之间的交互关系及其对应于框架的分层关系如图1所示。

3.2 测试输入层

包含数据读取模块,用于接收测试用例文件、头文件和测试参数等数据输入。

3.3 测试数据层

包含数据识别模块、数据处理模块、参数封装模块、测试场景构建模块,是整个测试程序的入口,它实现测试输入数据解析,完成测试数据转换和测试场景构建,调用测试执行脚本,输出日志记录。

3.4 测试执行层

包含功能测试模块、性能测试模块、稳定性测试模块,用于执行测试数据,对接口的调用进行封装,根据测试场景完成测试执行,并输出测试结果。

3.5 测试输出层

包含测试结果处理模块、测试日志记录模块,用于收集测试结果和测试日志记录,以文件的形式输出给测试人员。

4 API自动化测试应用工具的实现与应用

在具体的测试代码开发过程中,主要采用分层的思想编写代码,每一层完成的任务由其包含的功能模块实现,下面详细介绍每层代码的开发实现。

4.1 测试输入层

测试输入层主要完成数据读取模块的功能。用于读取测试用例文件、头文件和测试参数数据。

4.1.1 用例文件数据

测试人员根据Excel用例模板设计测试用例。用例模板如图2所示。

在用例模块中将调用接口的函数名、参数类型、参数值、参数输入输出关系和调用顺序按定义进行描述:

(1)函数说明列表。用例集中需要调用的接口函数列表;(2)测试用例。测试人员针对被测接口函数对象设计的用例,包括函数调用顺序、参数值、参数输入输出关系等;(3)标志区域。区分被测接口和关联接口,明确测试用例标号;(4)函数名。接口的函数名;(5)函数参数说明。接口函数的参数个数和参数类型,以及在该用例集中不变化的参数值。

4.1.2 头文件和测试参数数据

头文件数据包括接口库包含的基本数据类型和结构体嵌套数据类型等参数信息。

测试参数是构建测试场景需要的配置信息,包括用例文件路径、被测接口库路径等相对固定的参数,还包括测试分支选择、并发用户数、多进程/多线程启动、测试运行时间、测试退出條件等参数信息,其中,变化的参数可通过配置文件或命令行参数的方式输入。例如:

casename=c:\\example.xls#用例表路径

testcase=0#功能测试0,性能测试1,稳定性测试2

methodflag=0#线程(0)/进程(1)执行

usernum=20#并发用户数

4.2 测试数据层

测试数据层主要完成数据识别模块、数据处理模块、参数封装模块和测试场景构建模块的功能。将读取的用例文件数据和配置参数数据进行识别,处理为相应的测试数据。

4.2.1 数据识别模块和数据处理模块

数据识别模块的功能是将读取的数据按照事先制定的规则识别为有特定意义的用例数据,将输入数据和信息字段建立对应关系。数据处理模块将识别出来的用例数据处理为可执行的测试数据。

(1)识别用例文件中接口函数描述说明,建立接口函数与参数个数、参数类型、参数值之间的关联关系;如表1所示。

ConnectDev函数是pre准备阶段执行的函数,有三个参数,参数类型依次是UINT32、pHDEV、UINT8,参数值在该测试集中不变化,分别是0、out1、0;其中,out1表示该参数是输出参数,输出值需保存供其它函数调用。OpenApp函数类似。

GenerateKey函数是act被测阶段函数,有三个参数,参数类型依次是pHPIPE、WORKKEYATTR、pHANDLE,参数值在该测试集中变化,变化在测试用例中体现;

(2)识别接口函数执行次数、预期结果,不同接口函数之间的参数输入输出关系、调用顺序等。如表2所示。

测试用例1,GenerateKey函数执行完后执行DestroyKey函数,GenerateKey函数的参数值依次为ref_out2、(2,1,0,16)、out3,执行次数为1次,预期结果默认为0;DestroyKey函数的参数值依次为ref_out2、ref_out3,执行次数为1次,预期结果默认为0。GenerateKey函数的ref_out2参数表示该参数的输入值需调用out2参数的输出值,out3输出值供DestroyKey函数的ref_out3参数调用。

(3)识别基本数据类型和结构体嵌套数据类型等,使接口函数的参数类型和参数值建立关联关系。如:

GenerateKey函数三个参数类型依次是pHPIPE、WORKKEYATTR、pHANDLE,对应的数据类型为指针c_void_p、结构体class WORKKEYATTR、指针c_void_p,对应的参数值是ref_out2、(2,1,0,16)、out3。在处理过程中,参数1按指针类型引用out2的输出值,参数2按结构体WORKKEYATTR的各字段类型对(2,1,0,16)的每个值进行赋值,参数3按指针类型将输出值保存在out3中。

(4)识别测试参数信息,明确测试场景构建数据。将读入的配置参数数据与测试分支选择testcase、并发用户数usernum、多进程/多线程启动methodflag、测试运行时间runtime、测试退出条件exitflag等测试场景构建信息字段建立对应关系。

API自动化测试应用工具提供了通用化的用例数据识别和处理模型,对接口函数的每个参数都根据参数类型和参数值进行赋值,对接口函数之间的调用顺序和参数引用建立逻辑关系。

4.2.2 参数封装模块

将经处理后的测试数据封装为接口函数调用可执行的参数。

传统的API接口测试工具中,每一个API接口对应一套测试脚本,原因在于接口之间存在调用关系、参数之间存在引用关系,接口函数的形参和实参需一一对应,不同的接口含有不同个数和类型的形参,这就导致了针对每个接口函数都需要测试脚本去做形参和实参的匹配,不同接口之间测试脚本不能复用。

本文实现的API自动化测试应用工具提供了可复用的参数封装模块,经过用例数据识别和处理后,接口函数的每个形参都处理为对应的实参,对接口函数实参的封装采用Python提供的*args可变位置参数实现。即多个实参按照位置传值,放到一个元组里面,以*开头,可以传递多个参数。如:

libc=windll.LoadLibrary(dllpath)#加载被测dll库

def dealparam:#处理函数参数并封装

#识别函数funcname

#识别函数参数个数和参数类型

for i in range(paramlen):#根据参数类型和参数值赋值

param[i] = value[i]

execparam.append(param[i]) #封装参数

ret=getattr(libc,funcname)(*execparam)#接口封装调用

通用化的接口参数封装模块使不同的接口函数可以使用同一模板实现参数封装,不再需要定制化的测试脚本。

4.2.3 测试场景构建模块

测试场景构建模块根据测试参数构建测试场景。选择功能、性能或稳定性测试分支,采用多进程/多线程的方式启动并发测试,线程/进程数由并发用户数决定,到达运行时间后或者测试人员选择退出测试。

testcase=1#功能测试0,性能测试1,稳定性测试2

import MyProcess,MyThread#导入多进程/多线程库

methodflag=0#选择执行方式,多进程方式=0,多线程方式=1

for i in range(usernum):#根据并发用户数启动线程/进程数

#将运行时间和测试退出方式通过参数传递给执行函数

p = MyProcess(test1,(execlist,exit_flag,run_time,row,timeflag,j,tmpparam,))

processes.append(p)

4.3 测试执行层

测试执行层主要完成功能测试模块、性能测试模块和稳定性测试模块的功能。功能、性能和稳定性测试的用例文件可复用,根据不同的测试场景进行不同测试分支的执行。

4.3.1 功能测试模块

功能测试模块通过调用接口库验证函数的功能是否与描述一致,测试执行的实际返回值与期望返回值是否一致,并返回测试结果。测试用例如表3所示。

该用例集的测试对象为对称加密函数Encrypt,不仅需要验证加密函数Encrypt的执行结果,也需要验证加密结果的正确性。用例1设计的测试内容为產生密钥GenerateKey->加密Encrypt->解密Decrypt->销毁密钥DestroyKey->验证加解密正确性,即GenerateKey输出结果为密钥句柄out3,Encrypt利用密钥out3对96字节的数据(96,1)进行加密,输出密文out4,Decrypt利用密钥out3对密文out4进行解密,输出明文out5,加解密完成后销毁密钥out3,为了验证加解密过程的正确性,将解密输出的明文out5与原始数据(96,1)进行比较。

libc=windll.LoadLibrary(dllpath)#加载被测dll库

#识别函数列表funclist

for i in range(funclist):

dealparam(func[i])#处理列表中每个函数的参数并封装

ret=getattr(libc,func[i])(*execparam)#接口封装调用

if ret != respectexec:

break#如果函数执行结果不符合预期,退出测试

#函数执行结果符合预期,进行输出结果有效性检查

#如:判断ref_out5 是否等于96字节的原始数据(96,1)

#返回测试结果

4.3.2 性能测试模块

性能测试模块验证接口在各测试场景下的性能指标以及性能指标是否与要求一致。测试用例如表4所示。

该用例集的测试对象为对称加密函数Encrypt在不同测试场景下的性能指标,性能测试过程中Encrypt是被测接口对象,GenerateKey、Decrypt、DestroyKey是关联接口,测试执行时关联接口执行一次,输出和Encrypt有引用关系的参数值,重点关心被测接口在测试场景下的成功执行次数(执行失败时整个测试指标无参考意义)。如:

测试配置参数为testcase=1、usernum=20、methodflag=1、runtime=5、exitflag=0,即Encrypt函数在多进程启动条件下,20个并发用户数运行5min的性能指标,达到运行时间后退出测试。测试配置参数支持自定义。

libc=windll.LoadLibrary(dllpath)#加载被测dll库

for i in range(funclist):

dealparam(func[i])#处理列表中每个函数的参数并封装

#构建性能测试场景

#执行关联接口,保存输出参数

if time<runtime:#执行被测接口

ret=getattr(libc,tarfunc)(*execparam)#被测接口封装调用

if ret != respectexec:

writelog(‘loginfo.txt,loginfo)#记录错误日志

break#如果函数执行结果不符合预期,记录日志后退出测试

totalnum+=1#统计执行成功次数

#返回性能测试结果

4.3.3 稳定性测试模块

稳定性测试模块验证在各测试场景下接口本身的稳定性以及在业务逻辑下接口组合关系的稳定性。测试用例如表5所示。

(1)接口本身的稳定性。当该用例集的测式对象为对称加密函数Encrypt在不同测试场景下的稳定性时,代码实现与性能测试模块相似,关心Encrypt接口在测试场景下的稳定性,与性能测试的区别在于稳定性测试执行过程中记录执行失败的错误信息,不强制退出测试。(2)業务逻辑的稳定性。当该用例集的测式对象为加解密业务在不同测试场景下的稳定性时,代码流程相似,在测试运行时间内反复执行整个加解密业务流程,不再只针对某一个测试接口对象。

4.4 测试输出层

测试输出层主要完成测试结果处理模块和测试日志记录模块的功能。

4.4.1 测试结果处理模块

测试结果处理模块负责测试结果的收集、处理和展示。

(1)功能测试结果。功能测试结果包括接口执行结果、接口功能有效性结果以及综合前两项指标所得的用例通过结果,三项结果回写至Excel用例文件。如表6所示。(2)性能测试结果。性能测试结果返回被测接口对象在测试场景下的执行总次数,结果回写至Excel用例文件。如表7所示。(3)稳定性测试结果。稳定性测试结果包括被测接口对象或业务对象在测试场景下的执行总次数、失败次数,测试结果以txt文件展示。如表8所示。

tarfunc2(业务1)的总次数为447796,错误次数为0,执行时间3600min

业务2的总次数为125202,错误次数为0,执行时间3600min

业务3的总次数为572596,错误次数为0,执行时间3600min

(其中,一行用例代表一个业务逻辑。)

4.4.2 测试日志记录模块

测试日志记录模块负责测试日志记录和工具运行日志记录。记录内容包括用例执行详细信息、测试执行失败的错误信息等。

用例执行详细信息包括执行的用例文件信息、测试集(用例表)信息、测试函数信息(用例行)等;错误信息包括出错函数名信息、错误码信息、执行失败时间信息等。

5 结语

本文研究了API接口自动化测试方法,分析了用例数据通用化解析、用例驱动自动化测试和国产化环境应用等技术,提出了一种API接口自动化测试框架,解决了用例数据转换、接口参数封装和接口映射调用的难题,最后采用Python语言实现了用例驱动API接口自动化测试在国产化环境下的应用工具。该工具在实际项目中进行了应用,可满足X86平台和飞腾、龙芯、兆芯等国产化平台下的API接口功能测试、性能测试和稳定性测试需求,在测试效率的提高和测试成本的降低方面取得了良好的效果[9]。

参考文献

[1]林萍.数据分层的接口自动化测试框架设计与应用[J].信息技术,2016(5):37-40.

[2]吴振宇,顾晓明,李翔.协议可扩展的软件接口测试工具的研究与实现[J].数字技术与应用,2017(12):58-60.

[3]苏春梅,何剑伟,奚宏明,et al. 基于XML的通用数据接口测试工具[J].兵工自动化,2012,31(8):72-77.

[4]Wesley Chun.Python核心编程[M].人民邮电出版社,2016.

[5]杨清玉,李金丽,陈吉兰,et al.HTTP接口自动化测试方法研究[J].微型机与应用,2016,35(18):22-25.

[6]余永忠,张哲军,陈华军.IEC61970与IEC61968标准接口自动化测试系统研发[J].南方电网技术,2013,7(5):61-64.

[7]范典华,潘芳蕊.自动化测试在业务支撑系统接口测试中的应用设计[J].电信工程技术与标准化,2012,25(4):63-67.

[8]郝晓晓,张卫丰.基于XML的SDK自动化测试框架的设计与实现[J].计算机技术与发展, 2010,20(4):101-104.

[9]蔡春梅.基于pyUnit的OTS REST接口自动化测试设计与实现[J].信息技术与标准化,2017(4).

Application of Case-Driven Automated Testing in Localized Environment

FENG Ya-ling, XU Ying

(No.30 Institute of CETC, Chengdu Sichuan  610041)

Abstract:Traditional API interface testing has the following disadvantages: a large number of test cases, management of test cases and scripts is cumbersome, and lack of common test tools in the localized environment. In view of the above shortcomings, this paper analyzes the characteristics of the API interface automation test technology and the characteristics of the localized application technology. The paper designed an API automation universal test tool based on Excel test case template,  layered the development of test cases, test data, and test execution and code by using Python language. This paper realized the technology that the test case data driven API interface automatic test, successfully applied to the domestic environment.

Key words:API; case data-driven; automated testing; localized environment; Python

猜你喜欢
Python语言自动化测试
Python语言程序设计教学体系建设
面向计算生态的Python语言入门课程教学方案
浅谈空调控制器自动化测试