2. 西北工业大学 软件与微电子学院, 陕西 西安 710072
Web服务(web services)[1]是面向服务的软件体系架构SOA(service objected architecture)中,服务概念的一种具体表现形式和功能载体,是为因特网上的分布式计算提出的一种基于XML等开发标准的、松散耦合的、跨平台的新型软件构件。Web服务已广泛应用于通信、地理信息系统、电子商务系统、电子政务系统,以及手持设备上的应用等各个领域,是目前网络应用软件系统开发的主流技术。
伴随Web服务的发展,Web服务测试用例的自动生成技术已成为研究的焦点。鉴于XML Schema数据类型的复杂性,为WSDL服务的输入消息编写测试用例极为繁琐,目前,针对Web服务自动化测试技术国内外科技人员已做了大量研究,且取得了一定进展。
在理论方面,Ji和Singal等人[2-3]提出了基于WSDL语言的生成测试用例技术。这些方法的不足在于:没有基于单个操作输入消息的数据类型生成测试用例,也没有给出测试用例的自动生成算法。李吟和庄梅玲等人[4-6]提出了基于接口契约的测试方法,但也没有给出测试用例生成的算法。张卉[7]针对Web系统提出的自动化测试方法,实际上是传统结构化软件单个操作测试,或面向对象软件类操作测试的一个简单延伸,并没有针对Web服务操作输入消息的数据类型展开测试工作。韩璐和周立波[8-9]运用文档解析技术为Web服务生成测试用例,所提出的XML Schema数据模型,并没有依据操作输入消息的数据类型而定,该测试方案没有提出从WSDL规格说明构建XML Schema数据模型的算法及测试用例自动生成的方法,模型的构建和测试用例的生成也需全部用手工完成。
在实践方面,目前,多家公司和研究机构都对Web服务测试工具进行了探索和研发,如WebInject、SoapUI等。现有的Web服务测试工具都要求用户手工设计、产生和撰写测试用例,而测试用例的自动生成则是Web服务测试自动化的关键所在,本文在研究Web服务测试相关理论和技术的基础上,提出了一种Web服务测试用例自动生成方法,并开发了相应的测试用例生成支持工具。
由于Web服务操作输入消息的数据类型定义可能比较复杂(例如,长达数百行以上),其相关子类型的定义可能分散在多个文件中,针对Web服务单个操作输入消息数据类型的特点,本文提出了基于WSDL文档和形式化模型树自动生成Web服务操作测试用例的方法,可大幅节省人工手动分析WSDL文件中复杂数据类型的时间,以及根据各内建数据类型的测试用例手工生成输入消息测试用例的时间,简化测试用例的生成过程,大量替代目前手写完成的测试用例编写工作。并在Java/Eclipse平台上,实现了基于该方法的Web服务测试用例生成工具OTCG。
1 测试用例自动生成方法 1.1 输入消息模型树的形式定义本文将输入消息模型树定义为一个7元式:
式中,N表示输入消息数据类型定义中用以表示复杂类型节点的有限集合,若节点为元素定义,则以元素的名字命名;C=Co∪Ca∪Cs∪Cc:Co为控制其子节点出现次数的控制节点的有限集合;Ca为限定其子节点以无序方式出现的控制节点的有限集合;Cs为限定其子节点以有序方式出现的控制节点的有限集合;Cc为限定其子节点以选择方式出现的控制节点的有限集合;D表示输入消息数据类型定义中,简单数据类型节点的有限集合,其中包含XML Schema内建数据类型定义的简单数据类型,节点以简单数据类型的名字命名;nr∈N表示根节点,此处将输入消息以根节点的形式建模,以输入消息的名字命名;RC表示集合D与D中元素之间的约束表达式的集合,它展现了简单数据类型与简单数据类型之间的约束;ED表示D中各元素之间有限边的集合,将一条边e记为e(p, x, c),其中p∈N∪D, c∈D, x∈RC∪{⊥}。EE表示N∪C中的元素与N∪C∪D中元素之间有限边的集合,其中一条边e记为e(p, c),其中p∈N∪C,c∈N∪C∪D。
C中的Ca, Cs, Cc分别对应XML Schema中,架构元素all、sequence和choice。Ca限定其子元素必须全部出现,但出现的次序可按任意次序;Cs限定其子元素必须按照次序全部出现;Cc限定其子元素只能选择性出现一个。
RC中约束表达式可以是表 1中10种约束条件之一。
约束名称 | 约束值类型 | 约束含义 |
enumeration | 枚举 | 限定取值为枚举型 |
minExclusive | 数值 | 限定取值大于约束值 |
maxExclusive | 数值 | 限定取值小于约束值 |
minInclusive | 数值 | 限定取值不小于约束值 |
maxInclusive | 数值 | 限定取值不大于约束值 |
maxLenght | 非负整型 | 限定取值长度不大于约束值 |
minLenght | 非负整型 | 限定取值长度不小于约束值 |
totalDigits | 非负整型 | 限定数值型取值位数为约束值 |
fractionDigits | 非负整型 | 限定数值型取值小数位数为约束值 |
length | 非负整型 | 限定取值长度不等于约束值 |
解析预处理过的WSDL规格说明中types元素的定义,在生成的模型树中,输入消息被建模为模型树的根节点,复杂元素的定义被解析为复杂类型节点,并加入集合N;对子元素或子属性出现次数的限定以及架构元素all、sequence、choice被解析为控制节点,并分别加入集合Co、Ca、Cs、Cc;属性的定义被解析为简单类型节点,被加入集合D。其中集合N、C中的节点为中间节点,集合D中的节点为叶节点。输入消息模型树的构造算法的执行流程如图 1所示:
对于图 2中所示XML Schema数据类型定义文档,经上述算法构建的输入消息模型树如下所示。图 3为该模型树的图形表示。
N={schema, element_物业, element_单元, element_物业_complexType, complexType_物业单元, complexType_物业单元_annotation, complexType_物业单元_documentation };
C=Co∪Ca∪Cs∪Cc:Co={element_单元_occur}, Ca=Ø, Cs={element_物业_sequence}, Cc={element_物业单元_choice};
D={string_名称,int_编号};
RC={x1, x2 },其中x1=Ø, x2={(maxInclusive, 58 000), (minInclusive, 10 000)}
nr=schema。
1.3 测试用例生成算法为了获取输入消息的测试用例集,首先为集合B中内建数据类型节点产生测试用例集,即为输入消息类型模型树的叶子节点产生,测试用例集;然后自下而上遍历模型树,依据节点之间的关系,为集合N∪C中的中间节点和根节点产生测试用例集;最后获取根节点的测试用例集,即获取输入消息的测试用例集。下面阐述为输入消息产生测试用例生成的方法。
1.3.1 生成集合D中简单数据类型节点的测试用例对于集合D中的简单数据类型节点,集合RC提供了其对于基类的约束条件,因此,集合D中节点的测试用例集,是在其基类测试用例集的基础上,施加RC中的约束来产生。求解测试用例集的过程中,需要依据一定的黑盒测试策略(即边界值测试,等价类测试,或随机测试)。本节将综合边界值测试、等价类测试和随机测试等策略,给出简单数据类型节点的测试用例生成算法。
根据XML Schema中数据类型的派生结构,可将简单数据类型按其基类划分为六大类, 分别为:字符串类型、数值类型、逻辑类型、URI类型、二进制数类型和时间值类型。定义基类型集合为DB={字符串类型,数值类型,逻辑类型,URI类型,二进制数类型,时间值类型},则XML Schema中其他数据类型c,都可通过边e(p, r, c)进行定义,其中p∈DB, r∈RC。
定义约束类型集合
R={enumeration, minExclusive, maxExclusive, minInclusive, maxInclusive, maxLenght, minLenght, totalDigits, fractionDigits, length}
则任何简单数据类型均可由约束集{b}×R限定,其中b∈DB,×表示集合的笛卡尔积。
若为所有r∈({b}×R)选择对应的黑盒测试策略,设针对约束ri使用对应黑盒测试策略生成的测试数据集为DRi,则对于任意简单数据类型,其测试用例集可表示为:
(1) |
表 2给出了针对数值类型约束的测试策略集,即({数值类型}×R),以及应用对应的测试策略生成的测试数据:
约束类型 | 约束值 | 黑盒测试策略 | 有效测试用例 | 无效测试用例 |
enumeration | 集合A | 等价类测试 | {d|d∈A} | 任意其它数据 |
minExclusive | 实数n | 边界值测试 随机测试 |
— 随机数d满足d>n |
n — |
maxExclusive | 实数n | 边界值测试 随机测试 |
— 随机数d满足d < n |
n — |
minInclusive | 实数n | 边界值测试 随机测试 |
n |
随机数d满足d < n |
maxInclusive | 实数n | 边界值测试 随机测试 |
n |
随机数d满足d>n |
maxLenght | 非负整数n | — | — | — |
minLenght | 非负整数n | — | — | — |
lenght | 非负整数n | — | — | — |
totalDigits | 非负整数n | 等价类测试 | 任意n位数字以下的实数 | 任意n位数字以上的实数 |
fractionDigits | 非负整数n | 等价类测试 | 任意实数d满足: d×I=[d×I] |
任意实数d满足: d×I≠[d×I] |
对于任意复杂数据类型,其测试用例可表示为节点测试用例集的复合。为尽量提高测试效率,且便于对测试错误的准确捕捉,在复合子节点测试用例时,须保证每个无效测试用例只能包含单一类型的无效数据;而对于有效测试用例则尽量包含多种类型的有效数据。
对于任意复杂数据类型节点n∈N,设其子节点集合为CH,集合元素数量为chcount,对于任意chi∈CH(1≤i≤chcount),其有效测试用例集表示为DCi,集合元素数量为ci,无效测试用例集表示为DEi,集合元素数量为ei。用DC表示节点n的有效测试用例集合,集合元素数量为dccount,用DE表示节点n的无效测试用例集合,集合元素数量为decount,则:
(2) |
对于任意集合A,用A[i]表示其第i个元素,则节点n的有效测试用例DC[k]的生成算法可描述为:
(3) |
节点n无效测试用例DE[k]的生成算法可描述为:
步骤1 令t=false,i=1;
步骤2 若对于子节点CH[i],存在未被引用过的无效测试用例DEi[j],则:
否则:
步骤3 若i>chcount:则算法结束;否则i=i+1,跳转步骤2。
1.3.3 生成集合N中复杂数据类型节点的测试用例控制节点在输入消息模型树中,负责以一定的限制规则复合其子节点的测试用例,从而形成更为复杂的测试用例集。集合C中的节点可视为集合N中节点的特殊形式。集合C中的节点可分为四个子集,分别表示为Co, Ca, Cs, Cc以下分别介绍4种节点测试用例的生成算法。
对集合Co,节点在模型树中用以限制其子节点的出现次数,且仅能包含唯一的子节点。对于任意Co中的节点n,限定其子节点出现次数o满足(minOccur≤o≤maxOccur),其中minOccur为非负整数,maxOccur为正整数或无穷大。根据等价类划分策略,对Co中节点测试数据出现次数o进行等价类划分,如表 3所示。
等价类 | 等价类存在条件 | 测试用例有效性 |
o < minOccur | minOccur>0 | 无效 |
minOccur≤o≤maxOccur | 任意情况 | 有效 |
o>maxOccur | maxOccur≠+∞ | 无效 |
因此,Co中节点的测试用例集可分为两部分,分别为根据o的等价类所生成的测试用例,和保持o取值有效的情况下,子节点的测试用例集。
对集合Ca, Cs中节点,在模型树中用以限制其子节点出现的次序,Ca中节点的子节点可按任意次序出现,Cs中节点的子元素必须依次出现,无论是Ca中还是Cs中,节点的子节点都必须全部出现,不能缺失。根据等价类划分策略,对Ca, Cs中节点的子节点出现情况做等价类划分,分别如表 4和表 5所示。
集合Cc中的节点,在模型树中用以限制其子节点,以选择形式出现,即每个测试用例中,必须出现Cc中的子节点之一,且仅能出现其子节点之一,根据等价类划分策略,对Cc中子节点出现情况做等价类划分,如表 6所示。
基于对开发难度、可移植性和可扩展性的综合考虑,本文采用Java编程语言在Eclipse集成开发环境基于Jdk1.8开发Web服务的测试用例自动化生成工具OTCG,实现XML文件解析模块、文档结构分析模块、测试用例生成模块以及结果处理模块。OTCG工具顶层架构如图 4所示。
同时,本文采用有针对性的实验数据通过对于不同的XML Schema架构元素的解析测试,共进行7组实验,覆盖15种架构元素。实验结果表明,本文提出的测试用例生成方法在很大程度上简化了测试用例的生成过程,大量替代目前手工完成的测试用例编写工作,使测试人员仅用完成模型树中叶节点的测试用例集编写,就可以得到自动生成的根节点测试用例集,对测试用例自动生成方法具有广泛借鉴意义。具体实验情况如表 7所示。
实验编号 | 实验目的 | 实验源文件地址 | 实验结果 |
1 | 实验OTCG对于Schema元素中名称空间的解析,element元素的定义,派生。 | http://www.w3school.com.cn/schema/el_element.asp | 名称空间解析正常,生成2组有效测试用例和1组无效测试用例,并为每组测试用例输出了详细的构成信息。 |
2 | 实验OTCG对于element元素的定义、引用,以及complexType的使用。 | http://www.w3school.com.cn/schema/el_element.asp | 元素定义、引用正确,complexType使用正确,生成2组有效测试用例和4组无效测试用例,并为每组测试用例输出了详细的构成信息。 |
3 | 针对架构元素attribute、simpleType及enumeration进行实验,实验内容包括simpleType、enumeration元素的解析,attribute元素的定义、引用和派生。 | http://www.w3school.com.cn/schema/el_simpletype.asp | 元素解析正确,生成2组有效测试用例和3组无效测试用例,并为每组测试用例输出了详细的构成信息。 |
4 | 针对架构元素all进行实验,实验内容针对架构元素all的解析,对all结构等价类划分的结果,对于all子节点实验文件组合的情况。 | http://www.w3school.com.cn/schema/el_all.asp | 元素解析以及等价划分正确,生成2组有效测试用例和3组无效测试用例,并为每组测试用例输出了详细的构成信息。 |
5 | 针对架构元素sequence进行实验,实验内容针对架构元素sequence的解析,对sequence结构等价类划分的结果,对于sequence子节点实验文件组合的情况。 | http://www.w3school.com.cn/schema/el_sequence.asp | 元素解析以及等价划分正确,生成2组有效测试用例和4组无效测试用例,并为每组测试用例输出了详细的构成信息。 |
6 | 针对架构元素choice进行实验,实验内容针对架构元素choice的解析,对choice结构等价类划分的结果,对于choice子节点实验文件组合的情况 | http://www.w3school.com.cn/schema/el_all.asp | 元素解析以及等价划分正确,生成2组有效测试用例和3组无效测试用例,并为每组测试用例输出了详细的构成信息。 |
7 | 使用一个稍复杂的XML Schema实例对OTCG进行综合实验,实验文件中包含元素定义元素及属性的定义,sequence、all、choice机构的使用并包含notation、documentation、appInfo等注释信息。 | http://www.w3school.com.cn/schema/schema_example.asp | 元素定义与使用正确,生成2组有效测试用例和22组无效测试用例,并为每组测试用例输出了详细的构成信息。 |
本文提出了一种基于WSDL文档和形式化模型树自动生成Web服务操作测试用例的方法。首先给出了输入消息模型树的形式化定义及模型树的构造算法,接着给出以输入消息模型树为基础的测试用例生成算法,成功地将以嵌套结构数据类型定义的解析,简化为对单个架构元素的解析,实现测试用例的自动化生成。实验结果表明,本方法在很大程度上简化了测试用例的生成过程,能大量替代目前以手工完成的测试用例编写工作,大幅提高了Web服务测试用例生成的效率。
[1] | Mouli Varsha R, Jevitha K P. Web Services Attacks and Security——A Systematic Literature Review[J]. Procedia Computer Science, 2016, 93: 870-877. DOI:10.1016/j.procs.2016.07.265 |
[2] | Ji S, Li B, Zhang P. Test Case Selection for Data Flow Based Regression Testing of BPEL Composite Services[C]//IEEE International Conference on Services Computing, 2016: 547-554 |
[3] | Singal P, Mishra A K, Singh L. Test Case Selection for Regression Testing of Applications Using Web Services Based on WSDL Specification Changes[C]//ICCCA, 2015: 908-913 |
[4] |
李吟. 基于接口契约的有状态Web服务用例集生成[J]. 计算机研究与发展, 2017(3): 609-622.
Li Yin. Test Suite Generating for Stateful Web Services Using Interface Contract[J]. Journal of Computer Research and Development, 2017(3): 609-622. DOI:10.7544/issn1000-1239.2017.20151045 (in Chinese) |
[5] |
李吟, 方建勇. 面向需求覆盖的Web服务自动化测试框架[J]. 计算机科学与探索, 2017, 11(11): 1747-1763.
Li Yin, Fang Jianyong. Requirement Coverage Oriented Automatic Testing Framework for Web Services[J]. Journal of Frontiers of Computer Science and Technology, 2017, 11(11): 1747-1763. DOI:10.3778/j.issn.1673-9418.1609024 (in Chinese) |
[6] |
庄梅玲. Yeepay接口自动化测试系统的设计与实现[D]. 南京: 南京大学, 2016 Zhuang Meiling. Test Design and Implementation of Yeepay's Automated System of API[D]. Nanjing, Nanjing University, 2016(in Chinese) |
[7] |
张卉. Web应用系统自动化软件测试技术研究[D]. 曲阜: 曲阜师范大学, 2016 Zhang Hui. Research on Web Application System Automation Software Testing Technology[D]. Qufu, Qufu University, 2016(in Chinese) |
[8] |
韩璐. 基于Web用户行为的测试用例生成技术研究与实现[D]. 郑州: 郑州大学, 2016 Han Lu, Research and Implementation of Test Case Generation Technology Based on Web Users' Behavior[D]. Zhengzhou, Zhengzhou University, 2016(in Chinese) |
[9] |
周立波. 基于文档解析和约束求解的组合Web服务测试用例生成[D]. 南京: 南京大学, 2015 Zhou Libo. Composite Web Service Test Cases Generation Based on Parsing XML Documents and Solving Constraints[D]. Nanjing, Nanjing University, 2015(in Chinese) |
2. School of Software and Microelectronics, Northwestern Polytechnical University, Xi'an 710072, China