基于PICT的API测试用例设计应用
2019-10-08杨丽丽
杨丽丽
摘 要: API是软件工程中的一个重要组成部分,需要设计大量的测试用例来进行充分测试。借助PICT工具利用组合测试原理可产生比手动生成更高效的测试用例。本文介绍了PICT的工作原理及使用方法,分析了API测试用例的设计思路,并通过一个API测试用例设计实例详细说明了如何通过PICT工具对API进行测试用例进行设计。
关键词: PICT;组合测试;API
【Abstract】: Application Programming Interface (API) is an import part of soft engineer, which needed be tested by a large number of test cases. The Pairwise Independent Combinatorial Testing tool (PICT) can help you generate tests that are more effective than manually generated tests. This paper describes the principle of PICT and how it works, analyses the design thinking about the API test case and shows how to design API test case with PICT by giving a detailed example.
【Key words】: PICT; Combinatorial testing; API testing
0 引言
隨着软件工程理论和实践的发展,从业人员对软件测试的重要性有了一定的认知,希望正式版本发布前对软件进行充分测试,及早发现问题[1-2]。然而现代软件项目需要适应快速变化的市场需求,具有周期短、体量大、稳定性要求高的特点,软件测试人员在有限的项目周期和人力资源下,无法做到完全的测试。而不完全的测试又会导致软件缺陷的遗漏,造成无法估量的损失。
因此,针对被测对象的特点选择合适的测试方法,保证测试覆盖率的同时兼顾测试成本,把数量巨大的测试减少到可实现范围,减少软件缺陷造成的风险,成为测试用例设计关注的重点。本文针对API(Application Programming Interface,应用程序编程接口)的特点,结合PICT工具,对使用组合测试原理对API测试用例进行设计的方法进行 探讨。
1 API测试介绍
1.1 API概念
API是一些预定义的封装好的函数,即预先把复杂的操作写在一个函数里面,并配上说明文档,开发人员只需调用API而不需了解内部工作机制的细节,即可实现复杂的工作。其提供了应用程序与开发人员基于某软件得以访问一组例程的能力[3]。
作为模块与模块、系统与系统、软件与开发人员之间连接的桥梁,API是软件工程中的重要组成部分,在软件项目中应用广泛[4]。API的重要性也决定了针对API的测试在软件研发过程中也是重点关注的内容。
1.2 API测试方法
API接口的测试一般在集成测试阶段进行,重点检查部件之间的调用和交互是否起作用,对其的测试方法分为白盒测试和黑盒测试。
白盒测试时,软件测试人员可访问程序中的代码,并通过检查代码的线索来协助测试;黑盒测试时,代码对测试人员不可见,测试人员需要进行一些输入,得到某种输出结果,不需了解代码如何运行[5]。
出于代码安全和商业机密的考虑,在实际软件工程项目中,代码的查看权限一般不向测试人员开放。因此,黑盒测试在API测试中应用较多,本文着重探讨黑盒测试的情况。
使用黑盒测试方法时,测试人员根据接口文档中API的功能描述,编写测试程序或使用辅助测试工具模拟其它模块调用API。通过对输入参数不同的取值覆盖,验证输出的对应关系是否符合功能描述,同时验证API对边界值、异常值的处理,确保接口的可靠性。
综上所述,API测试用例设计的核心与难点在于设计输入参数的取值覆盖方案。仅考虑测试覆盖率的情况下,可使用穷举测试法列出所有可能的输入参数。此方法的测试效果虽然最为理想,但由于工作量太大,不符合实际工程情况;兼顾测试效率的情况下,常用组合测试法或正交测试法,利用参数之间的正交关系尽可能的覆盖较多测试场景[6-7]。两者相比较,组合测试设计的用例数量更为精简,更能提高测试效率。
2 PICT介绍
2.1 概念
PICT(The Pairwise Independent Combinatorial Testing tool)为一款微软公司出品的命令行用例生成工具,生成的测试集可以覆盖任意N个变量的取值组合。基于组合测试的理论,该测试用例集可以发现N个因素共同作用引发的缺陷。
PICT接受纯文本模式的文件作为输入,输入文件中包括参数类别、取值集与约束关系,输出是一个用来组成组合覆盖测试用例的矩阵,每一行表示一个测试用例,每一列代表系统的一个参数,每一项代表测试用例对应的参数取值。PICT可帮助测试人员产生比手动生成更高效的测试用例。
2.2 实现原理
组合测试(combinatorial testing)是一种测试用例生成方法,其对传统测试用例方法进行了综合。组合测试理论可由一个数学模型和一个假设表示:
数学模型:被测对象被抽象为函数f,影响被测对象变量作为函数f的输入,其取值构成有限的变量集合X={x1,x2,…,xn},产品的输出为函数的返回值,构成变量集合Y={y1,y2,y3,…,ym}。
假设:如果测试覆盖了任意i个(2≤i≤n)输入变量的取值组合,那么该测试用例集理论上可以发现所有i个变量共同作用引发的函数f的缺陷。
组合测试方法包括多变量组合方法和两变量组合方法[8]。多变量组合方法的覆盖率更好,但占用的测试资源多。两变量组合方法理论上可以暴露所有由两个变量共同作用而引发的缺陷,占用的测试资源少。Kuhn和Reilly在2002年通过对Mozilla浏览器的错误分析报告开展了组合测试的可用性结果研究。研究结论表明,大约70%的故障是由两个以下参数的相互作用引起的[9]。因此,两变量组合方法在测试覆盖性上也基本满足工程需求。
PICT默认使用两变量组合方法,生成的测试集可以覆盖任意两个变量的取值组合。并且由于组合测试的数学模型没有描述变量之间的约束关系,生成的用例集存在一定的冗余,利用PICT可通过添加输入的约束条件来进行改进[10]。
2.3 使用方法
使用PICT进行用例设计的步骤包括:
(1)参数建模。通过分析被测对象,抽象出待生成变量的类型和取值,使用等价类方法将有限的取值代替无限的取值域。然后使用文本编辑器创建一个模型文件,在该文件中分行详细列出变量类型、取值、变量间的约束条件。
(2)将模型文件放入PICT安装程序路径,在命令行程序中运行PICT,并设定输出结果格式,将输出矩阵导出至指定文件中。
(3)打开输出文件,查看用例设计结果。PICT生成一組简洁的参数值选项,用来组合覆盖测试用例。
3 API测试用例设计
3.1 设计思路
根据1.2节的介绍,API用例设计思路主要考虑以下三个方面:
(1)根据接口文档中对输入参数的使用规则,设计样本验证输入参数个数、长度、类型、有效性等。
(2)根据等价类划分方法,精简输入参数的取值集,减少冗余用例。
(3)分析接口文档中对输出参数的业务规则描述,梳理业务逻辑,明确输入和输出的对应关系以及输入条件之间的约束条件。
3.2 设计步骤
3.2.1 分析接口文档
本文以一个API接口为例,介绍使用PICT进行API测试用例设计的过程。接口文档描述如下所示:
(1)API名称:自动请求双工热备切换
(2)调用格式:int reqDupSwitch(DUPSTS *pD up Status);
(3)描述:应用程序可调用此API请求改变双工状态。只有在自动方式下才可以在主机上请求切换。如果本机为副机,不允许切换;如果本机为主机,它机为副机,并且它机网络或软件异常,不允许切换。
(4)参数:pDupStatus:指向DUPSTS类型的指针,用于存放当前的双工状态。DUPSTS结构中包括的参数内容如下:
3.2.2 使用PICT生成测试用例
(1)确定变量xi
xi应包括测试的输入和预期输出。被测API的输入为一个结构体,结构体中共包含7类数值;API的输出为一个整数型数值。因此,测试用例的输入变量xi共包括8类数值。
(2)确定每个变量xi的取值组合
为了更充分的发现缺陷,每个变量的取值要进行充分设计,尤其是“典型取值”,可以通过等价划分、边界值等方法进行取值。根据本接口文件,7个输入变量的有效取值均为离散的有限值,需要逐一列出;无效值采用等价类划分法和边界取值法,取–1。输出值包括两个固定值:0和–1。
4 结束语
通过PICT工具生成测试用例集合,缩短了测试人员针对API的测试用例设计的时间,对实际工作具有指导意义。但PICT为追求测试效率而牺牲了部分覆盖率的要求,可能会错过特定的取值组合,如上文中最终生成的用例未包含本机数据网状态和关键软件状态均为故障时的切换成功场景测试。因此测试人员可根据实际情况,对测试集进行优化,如减少测试用例数量或补充个别测试用例,达到更佳测试覆盖效果[11]。
参考文献
[1]颜乐鸣. 基于工作流的软件测试过程模型研究[J]. 软件, 2018, 39(5): 160-165.
[2]张琪. 大数据背景下软件测试的挑战与展望[J]. 软件, 2018, 39(6): 181-183.
[3]沈默, 刘强, 童自力. API测试的二元组合测试算法研究与
实现[J]. 计算机工程与应用, 2005, 26: 48-57.
[4]黄沛. 基于RESTful架构的科技信息共享接口系统的设计[J]. 软件, 2018, 39(7): 170-172.
[5]Patton, R著: 张小松, 王钰, 曹跃等译. 软件测试(原书第2版)[M]. 北京: 机械工业出版社, 2006.
[6]叶常春, 尹良泽. 面向小规模程序的轻型测试方法[J]. 软件, 2015, 36(10): 90-93.
[7]陈星, 赵佳萌, 宣军法. 移动应用自动化兼容性测试方法综述[J]. 软件, 2018, 39(7): 89-94.
[8]Trehan A. Algorithms for self-healing networks [D]. USA: The University of New Mexico, 2010.
[9]Kuhn DR, Reilly MJ. An investigation of the applicability of design of experiments to software testing. [R] In: Caulfield M, ed. Proc. of the Annual NASA/IEEE Software Enginee ring Workshop(SEW). Los Alamitos: IEEE Press, 2002. 91- 95.
[10]王子元, 徐宝文, 聂长海. 组合测试用例生成技术[J], 计算机科学与探索, 2008, 2(6).
[11]陈皓, 王曙燕, 潘晓英. 成对组合测试数据的整体优化和生成方法[J]. 计算机工程与应用, 2012, 48(11): 32-36.