CN113918473B - 一种基于Swagger文档的RESTful APIs组合测试方法 - Google Patents
一种基于Swagger文档的RESTful APIs组合测试方法 Download PDFInfo
- Publication number
- CN113918473B CN113918473B CN202111516040.8A CN202111516040A CN113918473B CN 113918473 B CN113918473 B CN 113918473B CN 202111516040 A CN202111516040 A CN 202111516040A CN 113918473 B CN113918473 B CN 113918473B
- Authority
- CN
- China
- Prior art keywords
- sequence
- parameter
- test
- test sequence
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/74—Reverse engineering; Extracting design information from source code
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于Swagger文档的RESTful APIs组合测试方法,涉及软件工程领域,包括文档预处理、X‑way操作序列覆盖表生成和U‑way参数覆盖表生成,其中X‑way操作序列覆盖表生成包括X‑way操作序列集合生成、定义操作依赖模型、X‑way操作序列集合修正和生成测试序列,U‑way操作参数覆盖表生成包括:测试序列选取、生成参数约束模型、生成参数覆盖表。本发明的优点在于:使用CURD语义和资源层级关系建立操作序列约束模型,系统性覆盖测试操作的相互影响;对API文档中的描述进行分析,提取其中的约束信息,并提供了一种算法给每个参数赋值,极大提高了测试有效性和效率。
Description
技术领域
本发明涉及软件工程领域,具体是涉及一种基于Swagger文档的RESTful APIs组合测试方法。
背景技术
Swagger规约以JSON格式准确地定义每个资源的操作方式、对应的操作入参以及该操作的期望返回,依据Swagger文档生成测试模型主要有RESTTESTGEN模型和RESTler模型,RESTTESTGEN认为如果操作A的返回信息中有操作B的输入参数,操作A应该在操作B执行前执行,根据此规则解析文档,在测试前生成操作依赖图决定执行操作的顺序。而RESTler在测试过程中分析API请求的consumer-producer关系,即前一个请求的返回信息中是否存在参数字段是后一个请求的输入参数,再用操作扩展现有操作序列的长度。
但是现有的依据Swagger文档生成测试模型还存在以下不足,操作资源的前置条件无法定义,无法充分测试操作之间的相互关系;输入参数赋值策略无法格式化定义,有限时间成本无法测试全部输入空间。
发明内容
为解决上述技术问题,提供一种基于Swagger文档的RESTful APIs组合测试方法,本技术方案解决了上述的现有的依据Swagger文档生成测试模型还存在以下不足,操作资源的前置条件无法定义,无法充分测试操作之间的相互关系;输入参数赋值策略无法格式化定义,有限时间成本无法测试全部输入空间。
为达到以上目的,本发明采用的技术方案为:
一种基于Swagger文档的RESTful APIs组合测试方法,其特征在于,包括如下步骤:
文档预处理:分析RESTful API的OpenAPI文档,提取该Web应用的所有API路径信息和各自的输入参数信息,其中根据参数描述生成参数间的依赖关系;
X-way操作序列覆盖生成:首先使用CURD语义约束和资源层级依赖关系对操作约束建模,之后在操作约束模型的帮助下生成满足约束的操作序列,覆盖所有可能的操作的顺序组合,生成测试序列集A;
U-way参数覆盖表生成:对于生成的所有操作序列,逐个操作建立参数约束模型并生成参数覆盖表;
优选的,所述X-way操作序列覆盖生成包括如下步骤:
X-way操作序列集合生成:读取Swagger中的所有操作作为元素px,将所有元素px组成操作集合P,将操作集合P中的元素中选取X个元素,并进行排列组合形成元素qx,将所有元素qx组成X-way操作序列集合Q;
定义操作依赖模型:根据同一资源的操作约束关系,进行操作的依赖模型的建立;
X-way操作序列集合修正:根据操作的依赖模型,删除操作序列集合Q中所有不符合操作依赖模型的X-way操作序列;
生成测试序列:使用贪婪算法不断扩展已有操作序列的长度生成新的操作序列,扩展时使用操作约束模型筛选出可供扩展的操作,每条测试序列中的操作只出现一次,当筛选不出新的可供扩展的操作时,该条测试序列生成过程结束,将生成的测试序列添加至测试序列集A,并返回生成操作序列进行重复生成测试序列,直到X-way操作序列集合Q中所有元素全部已覆盖。
优选的,所述生成测试序列具体包括如下步骤:
操作选择:记录X-way操作序列集合Q中的有元素首位操作的次数,随机选择次数最多的操作加入测试序列M,并将测试序列M的长度记为N;
序列初次拓展:统计以测试序列M作为前N位操作时,集合Q中的元素在第N+1位操作的次数,随机选择次数最多的操作加入测试序列M;
长度判断:判断测试序列M的操作长度N是否大于等于X-1,若为否,则返回序列初次拓展步骤,若为是,则进入下一步骤;
设定覆盖变量:设定覆盖过程变量K初始值等于X-1;
判断集合生成:从测试序列M中任意选择K个操作,并按照各操作在测试序列M中的顺序进行排列后,组成长度为K的序列作为元素cx,将所有元素cx组成集合C中;
覆盖能力评估:统计X-way操作序列覆盖集合Q中的元素以集合C中的元素作为前K位操作时的第K+1位操作的次数并相加,最大出现次数记为max;
max值为零判断:判断max是否大于零,若为是,进入序列二次拓展,若为否,进入K值为零判断;
序列二次拓展:随机选择次数为max的操作pc加入操作序列M,并修复pc的操作依赖约束,进入K值比较判断;
K值为零判断:判断K值是否大于零,若为是,则K值减一并清空集合C,进入判断集合生成,若为否,则进入序列归档;
K值比较判断:判断K值是否等于X-1,若为是,进入序列集合更新,若为否,进入设定覆盖变量;
序列集合更新:将X-way操作序列集合Q中以集合C中的元素作为前X-1位操作,pc作为X位操作的X-way操作序列删除,进入设定覆盖变量;
序列归档:将生成的测试序列M复制作为元素a添加至测试序列集A,并清空集合C中的元素,初始化测试序列M,进入循环终止判断;
循环终止判断:判断X-way操作序列集合Q中元素个数是否为零,若为是,则停止生成测试序列,若为否,则返回操作选择步骤进行测试序列M的生成。优选的,所述U-way参数覆盖表生成包括如下步骤:
测试序列选取:从测试序列集A中选择测试序列,并将选中的测试序列从测试序列集A中删除;
参数赋值:对测试序列中的操作依次进行赋值定义参数值;
覆盖判断:判断操作赋值是否覆盖测试序列集A中所有元素,若为是,则完成U-way操作参数覆盖表生成,若为否,返回测试序列选取步骤。
优选的,所述参数赋值具体包括如下步骤:
定义参数值模型:对测试序列中未进行赋值的首位操作,进行定义参数值;
生成参数约束模型:然后使用Spacy的模式匹配器将Swagger文档中的约束提取出来,转换成组合测试中可以处理的约束形式;
生成参数覆盖表:采用两阶段的参数覆盖表生成方法,首先将必选参数和涉及到约束的参数的可选值列举出来,之后进行生成其首要参数覆盖表,并进行请求测试,将其中请求成功的测试用例作为一个抽象参数,并将该抽象参数与剩余参数的可选值列举出来,之后进行生成其全参数覆盖表,并进行请求测试,返回信息将和全参数覆盖表作为实时生成的数据存储起来;
赋值判断,判断是否测试序列所有操作均进行参数赋值,若为是,则停止参数赋值,若为否,则返回定义参数值模型步骤。
优选的,所述定义参数值模型选用由Dynamic、Specification、Success和Random中任一种策略,其中选用的优先级依次为:Dynamic>Specification>Success>Random。
优选的,所述Dynamic策略为:使用前面执行操作产生的资源信息,在返回信息中匹配最相似的参数名的取值作为参数的取值;
所述Specification策略为:使用Swagger文档中定义的值,首先使用该参数定义的枚举值和默认值,如果没有则搜索整个文档判断是否有同名的参数存在example值,随机选择最多两个参数值作为参数的取值;
所述Success策略为:判断此操作是否被请求执行过,使用该请求执行历史中成功请求的值作为参数值,如果之前成功请求的值是Random策略得到的,该策略将会变异该参数值增加参数值的多样性,也可以避免创建同名的资源;
所述Random策略为:随机生成三个同参数类型的值作为值域。
与现有技术相比,本发明的优点在于:不同于RESTTESTGEN不测试操作序列间的交互作用,只生成一条操作序列,也不同于RESTler在设定时间预算内穷举所有序列组合,本方法使用组合测试系统性覆盖测试操作之间和输入参数之间的交互作用,在参数赋值上,本方法额外从文档对参数的自然描述中抽取参数间的约束关系,丰富赋值策略多样性,极大提高了测试的广度和效率。
附图说明
图1为本发明中的X-way操作序列覆盖生成流程图;
图2为本发明中的U-way参数覆盖表生成流程图;
图3为本发明中的U-way参数覆盖表生成步骤示意图;
图4为博客网站Swagger文档;
图5为博客网站的U-way参数覆盖表生成步骤示意图。
具体实施方式
以下描述用于揭露本发明以使本领域技术人员能够实现本发明。以下描述中的优选实施例只作为举例,本领域技术人员可以想到其他显而易见的变型。
首先对本方法涉及的相关名词进行解释:
RESTful API:目前Web应用通常由基于应用编程接口(API)通信的复杂Web服务构成。REST是目前流行的一种API架构风格,符合该架构风格的APIs被称为RESTful API。RESTful APIs可以通过HTTP协议灵活方便地创建、读取、修改和删除Web服务中的资源,因此逐渐成为了一种API的架构范式。
资源:根据REST的定义,每个URL定义了一个独特的资源。图4的Swagger文档例子中,/users是一个资源,用户可以使用POST创建一个用户资源;
HTTP方法:根据REST架构风格,使用HTTP方法主要是POST(创建资源)、PUT(更新资源)、GET(读取资源)和DELETE(删除资源);
操作: 一个资源和一个HTTP方法的组合,例如图4中的POST /users是创建用户操作;
请求:输入参数被赋值,可以被发送到服务器执行的操作;
CURD语义:一个资源不存在或者被删除的时候只能创建(POST),无法进行其它操作;
状态码:HTTP状态码200(请求成功)、201(POST请求成功)、400(请求失败)、401(未授权)和500(服务器内部错误,无法完成请求)等;
Bug: 返回状态码为50X,如500,表示该请求服务器处理不了,服务器可能存在潜在bug;
组合测试:组合测试(CT)是一种流行的测试方法,用于检查影响软件行为的参数交互作用。这种方法的合理性来源于观察到许多软件故障是由参数值的组合触发的。因此,CT系统地覆盖这些组合,希望在测试用例规模和故障检测有效性之间实现良好的平衡。X-way组合即任意t个参数的可取值的笛卡尔积都要被覆盖;
事件序列覆盖测试:是用于检查影响软件行为的事件的交互作用的组合测试。X-way组合即t个事件的先后次序全排列都要被覆盖。
本发明提出一种基于Swagger文档的RESTful APIs组合测试方法,包括如下步骤:
文档预处理:分析RESTful API的OpenAPI文档,提取该Web应用的所有API路径信息和各自的输入参数信息,其中根据参数描述生成参数间的依赖关系;
X-way操作序列覆盖生成:首先使用CURD语义约束和资源层级依赖关系对操作约束建模,之后在操作约束模型的帮助下生成满足约束的操作序列,覆盖所有可能的操作的顺序组合,生成测试序列集A;
U-way参数覆盖表生成:对于生成的所有操作序列,逐个操作建立参数约束模型并生成参数覆盖表。
其中X-way操作序列覆盖生成,具体包括如下步骤:
操作选择:记录X-way操作序列集合Q中的有元素首位操作的次数,随机选择次数最多的操作加入测试序列M,并将测试序列M的长度记为N;
序列初次拓展:统计以测试序列M作为前N位操作时,集合Q中的元素在第N+1位操作的次数,随机选择次数最多的操作加入测试序列M;
长度判断:判断测试序列M的操作长度N是否大于等于X-1,若为否,则返回序列初次拓展步骤,若为是,则进入下一步骤;
设定覆盖变量:设定覆盖过程变量K初始值等于X-1;
判断集合生成:从测试序列M中任意选择K个操作,并按照各操作在测试序列M中的顺序进行排列后,组成长度为K的序列作为元素cx,将所有元素cx组成集合C中;
覆盖能力评估:统计X-way操作序列覆盖集合Q中的元素以集合C中的元素作为前K位操作时的第K+1位操作的次数并相加,最大出现次数记为max;
max值为零判断:判断max是否大于零,若为是,进入序列二次拓展,若为否,进入K值为零判断;
序列二次拓展:随机选择次数为max的操作pc加入操作序列M,并修复pc的操作依赖约束,进入K值比较判断;
K值为零判断:判断K值是否大于零,若为是,则K值减一并清空集合C,进入判断集合生成,若为否,则进入序列归档;
K值比较判断:判断K值是否等于X-1,若为是,进入序列集合更新,若为否,进入设定覆盖变量;
序列集合更新:将X-way操作序列集合Q中以集合C中的元素作为前X-1位操作,pc作为X位操作的X-way操作序列删除,进入设定覆盖变量;
序列归档:将生成的测试序列M复制作为元素a添加至测试序列集A,并清空集合C中的元素,初始化测试序列M,进入循环终止判断;
循环终止判断:判断X-way操作序列集合Q中元素个数是否为零,若为是,则停止生成测试序列,若为否,则返回操作选择步骤进行测试序列M的生成。
U-way参数覆盖表生成具体包括如下步骤:
测试序列选取:从测试序列集A中选择测试序列,并将选中的测试序列从测试序列集A中删除;
定义参数值模型:对测试序列中未进行赋值的首位操作,进行定义参数值,选用由Dynamic、Specification、Success和Random中任一种策略,其中选用的优先级依次为:Dynamic>Specification>Success>Random;
其中,Dynamic策略为:使用前面执行操作产生的资源信息,在返回信息中匹配最相似的参数名的取值作为参数的取值;
Specification策略为:使用Swagger文档中定义的值,首先是该参数所有的枚举值和默认值,如果没有则搜索整个文档判断是否有同名的参数存在example值,随机选择最多两个参数值作为参数的取值;
Success策略为:判断此操作是否被请求执行过,使用该请求执行历史中成功请求的值作为参数值。如果之前成功请求的值是Random策略得到的,该策略将会变异该参数值增加参数值的多样性,也可以避免创建同名的资源;
Random策略为:随机生成三个同参数类型的值作为值域;
生成参数约束模型:Swagger文档鼓励开发者使用自然语言描述参数间的约束,以供用户使用API时参考。为了自动化推断出参数间的约束,本方法利用自然语言开源库Spacy实现了基于句子结构的模式匹配方法处理自然语言。首先本方法中总结了一些常见的参数间约束的自然语言描述句子结构,例如“if PARAM_A is VALUE_B, PARAM_B isrequired”。然后使用Spacy的模式匹配器将约束提取出来,转换成组合测试中可以处理的约束形式;
生成参数覆盖表:采用两阶段的参数覆盖表生成方法,首先将必选参数和涉及到约束的参数的可选值列举出来,之后进行生成其首要参数覆盖表,并进行请求测试,将其中请求成功的测试用例作为一个抽象参数,并将该抽象参数与剩余参数的可选值列举出来,之后进行生成其全参数覆盖表,并进行请求测试,返回信息将和全参数覆盖表作为实时生成的数据存储起来,参数覆盖表生成除了该操作的输入参数值模型和约束模型,还需要所在序列的已执行的操作的执行信息,这是因为参数的Dynamic和Success赋值策略需要实时生成的数据。又因为必选参数在测试中重要性特别高,采用两阶段的参数覆盖表生成方法。如图3所示,Me列出来必选参数和涉及到约束的参数p1,p2,p3的可选值,CAe生成其参数覆盖表,尽可能多测试成功。其中t2,t3和t5测试用例组装的请求成功(返回20X状态码),这三种情况在生成全部参数覆盖表CAa时作为一个抽象参数Pa可选值参与计算,从而尽可能多的测试API行为。当CAa执行全部结束,其返回信息将和作为实时生成的数据存储起来,每对一个操作进行参数覆盖时,选择实时数据最多的返回信息链作为条件。例如图2中的R=r1,2-r2,1表示操作序列中第2个操作r2使用的是第1个操作的参数覆盖表CAe第2次执行的返回信息,而r2的参数覆盖表中的第1次请求r2,1执行也成功,图2中正在参数覆盖的操作使用的实时运行信息是r2,1和r1,2组成的信息链;
赋值判断,判断是否测试序列所有操作均进行参数赋值,若为是,则停止参数赋值,若为否,则返回定义参数值模型步骤;
覆盖判断:判断操作赋值是否覆盖测试序列集A中所有元素,若为是,则完成U-way操作参数覆盖表生成,若为否,返回测试序列选取步骤。
本发明在执行每一条HTTP请求:
A)记录成功请求的参数值信息,用于DYNAMIC赋值策略。
B)记录成功请求的返回信息,用于查询实时的参数值信息。
性能测试:
使用了11个真实世界的RESTful API作为实验对象,每组API我们设定最长测试时间为1个小时,分别使用本方法和RESTler执行5次,实验效果如下表所示:
表中各参数的含义为:Seq:生成操作序列的个数;Len:操作序列平均长度;C1-way:操作执行成功的操作序列1-way覆盖率;C2-way:操作执行成功的操作序列2-way覆盖率;Bug:状态码50X的数量;Total:执行的请求数量总数;Cost:测试时间/分钟。
由上表数据可知:RESTler只能测试文档中描述的3%的操作,而本方法平均可以测试56%的操作。同时本方法执行时间短,发现bug更多。
以下结合博客网站,对本发明进行详细解释,博客网站有两个API分别负责用户资源和博客资源,要生成2维操作序列覆盖和2维参数覆盖,其文档如图4所示。
生成操作序列覆盖表
定义操作依赖模型:/users是/users/{uid}的父节点,/users代表的资源没有创建时不可以调用/users/{uid}相关操作,即操作序列中Post /users要始终在Get /users/{uid}之前。Post /blogs没有依赖关系。
生成2-way操作序列:2维操作组合为{(Post /users, Get /users/{uid}),(Post /users, Post /blogs), (Get /users/{uid}, Post /users), (Get /users/{uid}, Post /blogs), (Post /blogs, Post /users), (Post /blogs, Get /users/{uid})},划去其中不满足操作依赖模型的。使用贪婪算法生成操作序列。
初始化空序列
统计操作在未覆盖操作组合首位的次数:Post /users 2次,Get /users/{uid} 1次,Post /blogs 2次。随机选择次数最多的操作加入序列,更新序列[Post /users]
统计操作A在未覆盖操作组合中(Post /users, A)的次数:Get /users/{uid} 1次,Post /blogs 1次。随机选择次数最多的操作加入序列,更新序列[Post /users, Post/blogs]。更新未覆盖操作组合{(Post /users, Get /users/{uid}), (Post /users,Post /blogs), (Get /users/{uid}, Post /users), (Get /users/{uid}, Post /blogs), (Post /blogs, Post /users), (Post /blogs, Get /users/{uid})}。
统计操作A在未覆盖操作组合中(Post /users, A)和(Post /blogs, A)的次数之和,Get /users/{uid} 2次。更新序列[Post /users, Post /blogs, Get /users/{uid}]。更新未覆盖操作组合{(Post /users, Get /users/{uid}), (Post /users, Post /blogs), (Get /users/{uid}, Post /users), (Get /users/{uid}, Post /blogs),(Post /blogs, Post /users), (Post /blogs, Get /users/{uid})}。
统计操作A在未覆盖操作组合中(Post /users, A),(Post /blogs, A)和(Get /users/{uid}, A)的次数之和, 没有候选操作,存储该序列,初始化新的空序列。
统计操作在未覆盖操作组合首位的次数:Post /users 0次,Get /users/{uid} 1次,Post /blogs 1次。随机选择次数最多的操作Get /users/{uid}加入序列,更新序列[Post /users, Get /users/{uid}],因为不能违反操作依赖约束。更新未覆盖操作组合{(Post /users, Get /users/{uid}), (Post /users, Post /blogs), (Get /users/{uid}, Post /users), (Get /users/{uid}, Post /blogs), (Post /blogs, Post /users), (Post /blogs, Get /users/{uid})},没有变化。
统计操作A在未覆盖操作组合中(Post /users, A)和(Get /users/{uid}, A)的次数之和,Post /blogs 1次。随机选择次数最多的操作Post /blogs加入序列,更新序列[Post /users, Get /users/{uid}, Post /blogs]。更新未覆盖操作组合{(Post /users,Get /users/{uid}), (Post /users, Post /blogs), (Get /users/{uid}, Post /users), (Get /users/{uid}, Post /blogs), (Post /blogs, Post /users), (Post /blogs, Get /users/{uid})}。
统计操作A在未覆盖操作组合中(Post /users, A),(Post /blogs, A)和(Get /users/{uid}, A)的次数之和, 没有候选操作,存储该序列,初始化新的空序列。
统计操作在未覆盖操作组合首位的次数:Post /users 0次,Get /users/{uid} 0次,Post /blogs 1次。随机选择次数最多的操作Post /blogs加入序列,更新序列[Post /blogs]。更新未覆盖操作组合{(Post /users, Get /users/{uid}), (Post /users, Post/blogs), (Get /users/{uid}, Post /users), (Get /users/{uid}, Post /blogs),(Post /blogs, Post /users), (Post /blogs, Get /users/{uid})},没有变化。
统计操作A在未覆盖操作组合中(Post /blogs, A)次数,Post /users 1次,Get /users/{uid} 0次。随机选择次数最多的操作Post /users加入序列,更新序列[Post /blogs, Post /users]。更新未覆盖操作组合{(Post /users, Get /users/{uid}), (Post/users, Post /blogs), (Get /users/{uid}, Post /users), (Get /users/{uid},Post /blogs), (Post /blogs, Post /users), (Post /blogs, Get /users/{uid})},2维组合全部已覆盖,生成结束,得到序列覆盖表{[Post /users, Post /blogs, Get /users/{uid}], [Post /users, Get /users/{uid}, Post /blogs], [Post /blogs,Post /users]}。
其中划线表示该2-way序列已被覆盖。
请参阅图5所示,以序列[Post /users, Post /blogs, Get /users/{uid}]的参数覆盖表生成为例进行讲解:
对Post /users进行赋值,首先对其中的必选参数name进行列举出来,之后进行生成其首要参数覆盖表,并进行请求测试,其中请求成功的为random3,之后将random3作为一个抽象参数,并将该抽象参数与剩余参数gender的可选值列举出来,并进行请求测试,其中请求成功的为random3-female,之后对Post /blogs和Get /users/{uid}中的参数重复上述赋值步骤完成序列赋值。
综上所述,本发明的优点在于:使用CURD语义和资源层级关系建立操作序列约束模型,在此基础上使用事件序列覆盖方法系统性覆盖测试操作的相互影响;输入参数组合测试建模;对API文档中的描述进行分析,提取其中关于操作参数的约束信息,并提供了一种启发式算法给每个参数赋值,丰富赋值策略多样性,极大提高了测试有效性和效率。
以上显示和描述了本发明的基本原理、主要特征和本发明的优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是本发明的原理,在不脱离本发明精神和范围的前提下本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明的范围内。本发明要求的保护范围由所附的权利要求书及其等同物界定。
Claims (5)
1.一种基于Swagger文档的RESTful APIs组合测试方法,其特征在于,包括如下步骤:
文档预处理:分析RESTful API的OpenAPI文档,提取该OpenAPI文档对应的Web应用的所有API路径信息和各自的输入参数信息,其中根据参数描述生成参数间的依赖关系;
X-way操作序列覆盖表生成:首先使用CURD语义约束和资源层级依赖关系对操作约束建模,之后在操作约束模型的帮助下生成满足约束的操作序列,覆盖所有可能的操作的顺序组合,生成测试序列集A;
U-way参数覆盖表生成:对于生成的所有操作序列,逐个操作建立参数约束模型并生成参数覆盖表;
其中,所述X-way操作序列覆盖表生成包括如下步骤:
X-way操作序列集合生成:读取Swagger中的所有操作作为元素px,将所有元素px组成操作集合P,将操作集合P中的元素中选取X个元素,并进行排列组合形成元素qx,将所有元素qx组成X-way操作序列集合Q;
定义操作依赖模型:根据同一资源的操作约束关系,建立操作依赖模型;
X-way操作序列集合修正:根据操作的依赖模型,删除操作序列集合Q中所有不符合操作依赖模型的X-way操作序列;
生成测试序列:使用贪婪算法不断扩展已有操作序列的长度生成新的操作序列,扩展时使用操作约束模型筛选出可供扩展的操作,每条测试序列中的操作只出现一次,当筛选不出新的可供扩展的操作时,测试序列生成过程结束,将生成的测试序列添加至测试序列集A,并返回生成操作序列进行重复生成测试序列,直到X-way操作序列集合Q中所有元素全部已覆盖,所述生成测试序列具体包括如下步骤:
操作选择:记录X-way操作序列集合Q中的有元素首位操作的次数,随机选择次数最多的操作加入测试序列M,并将测试序列M的长度记为N;
序列初次拓展:统计以测试序列M作为前N位操作时,集合Q中的元素在第N+1位操作的次数,随机选择次数最多的操作加入测试序列M;
长度判断:判断测试序列M的操作长度N是否大于等于X-1,若为否,则返回序列初次拓展步骤,若为是,则进入下一步骤;
设定覆盖变量:设定覆盖过程变量K初始值等于X-1;
判断集合生成:从测试序列M中任意选择K个操作,并按照各操作在测试序列M中的顺序进行排列后,组成长度为K的序列作为元素cx,将所有元素cx组成集合C;
覆盖能力评估:统计X-way操作序列覆盖集合Q中的元素以集合C中的元素作为前K位操作时的第K+1位操作的次数并相加,最大出现次数记为max;
max值为零判断:判断max是否大于零,若为是,进入序列二次拓展,若为否,进入K值为零判断;
序列二次拓展:随机选择次数为max的操作pc加入操作序列M,并修复pc的操作依赖约束,进入K值比较判断;
K值为零判断:判断K值是否大于零,若为是,则K值减一并清空集合C,进入判断集合生成,若为否,则进入序列归档;
K值比较判断:判断K值是否等于X-1,若为是,进入序列集合更新,若为否,进入设定覆盖变量;
序列集合更新:将X-way操作序列集合Q中以集合C中的元素作为前X-1位操作,pc作为X位操作的X-way操作序列删除,进入设定覆盖变量;
序列归档:将生成的测试序列M复制作为元素a添加至测试序列集A,并清空集合C中的元素,初始化测试序列M,进入循环终止判断;
循环终止判断:判断X-way操作序列集合Q中元素个数是否为零,若为是,则停止生成测试序列,若为否,则返回操作选择步骤进行测试序列M的生成。
2.根据权利要求1所述的一种基于Swagger文档的RESTful APIs组合测试方法,其特征在于,所述U-way参数覆盖表生成包括如下步骤:
测试序列选取:从测试序列集A中选择测试序列,并将选中的测试序列从测试序列集A中删除;
参数赋值:对测试序列中的操作依次进行赋值定义参数值;
覆盖判断:判断操作赋值是否覆盖测试序列集A中所有元素,若为是,则完成U-way操作参数覆盖表生成,若为否,返回测试序列选取步骤。
3.根据权利要求2所述的一种基于Swagger文档的RESTful APIs组合测试方法,其特征在于,所述参数赋值具体包括如下步骤:
定义参数值模型:对测试序列中未进行赋值的首位操作,进行定义参数;
生成参数约束模型:然后使用Spacy的模式匹配器将Swagger文档中的约束提取出来,转换成组合测试中可以处理的约束形式;
生成参数覆盖表:采用两阶段的参数覆盖表生成方法,首先将必选参数和涉及到约束的参数的可选值列举出来,之后进行生成其首要参数覆盖表,并进行请求测试,将其中请求成功的测试用例作为一个抽象参数,并将该抽象参数与剩余参数的可选值列举出来,之后进行生成其全参数覆盖表,并进行请求测试,返回信息将和全参数覆盖表作为实时生成的数据存储起来;
赋值判断,判断是否测试序列所有操作均进行参数赋值,若为是,则停止参数操作赋值,若为否,则返回定义参数值模型步骤。
4.根据权利要求3所述的一种基于Swagger文档的RESTful APIs组合测试方法,其特征在于,所述定义参数值模型选用Dynamic策略、Specification策略、Success策略和Random策略中任一种策略,其中选用的优先级依次为:Dynamic策略>Specification策略>Success策略>Random策略。
5.根据权利要求4所述的一种基于Swagger文档的RESTful APIs组合测试方法,其特征在于,所述Dynamic策略为:使用前面执行操作产生的资源信息,在返回信息中匹配最相似的参数名的取值作为参数的取值;
所述Specification策略为:使用Swagger文档中定义的值,首先是该参数所有的枚举值和默认值,如果没有则搜索整个文档判断是否有同名的参数存在example值,随机选择最多两个参数值作为参数的取值;
所述Success策略为:判断此操作是否被请求执行过,使用该请求执行历史中成功请求的值作为参数值,如果之前成功请求的值是Random策略得到的,该策略将会变异该参数值增加参数值的多样性,也可以避免创建同名的资源;
所述Random策略为:随机生成三个同参数类型的值作为值域。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111516040.8A CN113918473B (zh) | 2021-12-13 | 2021-12-13 | 一种基于Swagger文档的RESTful APIs组合测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111516040.8A CN113918473B (zh) | 2021-12-13 | 2021-12-13 | 一种基于Swagger文档的RESTful APIs组合测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113918473A CN113918473A (zh) | 2022-01-11 |
CN113918473B true CN113918473B (zh) | 2022-05-17 |
Family
ID=79248852
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111516040.8A Active CN113918473B (zh) | 2021-12-13 | 2021-12-13 | 一种基于Swagger文档的RESTful APIs组合测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113918473B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114116522A (zh) * | 2022-01-27 | 2022-03-01 | 四川野马科技有限公司 | 一种基于swagger进行接口自动测试的方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10097624B1 (en) * | 2017-07-28 | 2018-10-09 | Kong Inc. | Systems and methods for distributed installation of API and plugins |
CN113590178A (zh) * | 2021-07-30 | 2021-11-02 | 远光软件股份有限公司 | Api实例的管理方法、装置、存储介质及电子设备 |
-
2021
- 2021-12-13 CN CN202111516040.8A patent/CN113918473B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10097624B1 (en) * | 2017-07-28 | 2018-10-09 | Kong Inc. | Systems and methods for distributed installation of API and plugins |
CN113590178A (zh) * | 2021-07-30 | 2021-11-02 | 远光软件股份有限公司 | Api实例的管理方法、装置、存储介质及电子设备 |
Non-Patent Citations (2)
Title |
---|
RESTful API接口Fuzz测试关键技术研究;于海峰;《中国优秀硕士学位论文全文数据库》;20210115(第01期);正文第19-36页 * |
RESTTESTGEN: Automated Black-Box Testing of RESTful APIs;Emanuele Viglianisi等;《2020 IEEE 13th International Conference on Software Testing, Validation and Verification (ICST)》;IEEE;20200805;第1-11页 * |
Also Published As
Publication number | Publication date |
---|---|
CN113918473A (zh) | 2022-01-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11983098B1 (en) | Systems and methods for modeling and generating test requirements for software applications | |
Ed-Douibi et al. | Automatic generation of test cases for REST APIs: A specification-based approach | |
France et al. | Aspect-oriented approach to early design modelling | |
US6928393B2 (en) | Method and system for supporting negative testing in combinatorial test case generators | |
Ryu et al. | Supporting the dynamic evolution of web service protocols in service-oriented architectures | |
US5913023A (en) | Method for automated generation of tests for software | |
US20150332055A1 (en) | Locating security vulnerabilities in source code | |
US7177852B2 (en) | Method and apparatus for extracting knowledge from software code or other structured data | |
CN109117164B (zh) | 基于关键元素差异性分析的微服务更新方法及系统 | |
Le Hanh et al. | Selecting an efficient OO integration testing strategy: an experimental comparison of actual strategies | |
Wu et al. | Combinatorial testing of restful apis | |
CN109240666B (zh) | 基于调用栈和依赖路径的函数调用代码生成方法及系统 | |
CN113918473B (zh) | 一种基于Swagger文档的RESTful APIs组合测试方法 | |
Morales et al. | Efficient refactoring scheduling based on partial order reduction | |
Stoermer et al. | Practice patterns for architecture reconstruction | |
Legeard et al. | A comparison of the BTT and TTF test-generation methods | |
Lillibridge | Unchecked exceptions can be strictly more powerful than call/cc | |
Boucher et al. | Transforming workflow models into automated end-to-end acceptance test cases | |
Mateos et al. | Keeping web service interface complexity low using an oo metric-based early approach | |
US7904431B1 (en) | Method and system for automated request modelling | |
CN114791865A (zh) | 一种基于关系图的配置项自洽性检测方法、系统和介质 | |
Tatale et al. | A Survey on Test Case Generation using UML Diagrams and Feasibility Study to Generate Combinatorial Logic Oriented Test Cases. | |
US20080195453A1 (en) | Organisational Representational System | |
CN109299004B (zh) | 关键元素差异性分析方法及系统 | |
Dan et al. | Combining algebraic and model-based test case generation |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |