基于Multi-RQP方法的数据库测试数据生成研究

2013-10-17 03:19王莹莹
计算机与现代化 2013年1期
关键词:测试数据完整性实例

王莹莹

(广东机电职业技术学院信息工程学院,广东 广州 510515)

0 引言

在这科技日新月异的时代,数据库在各个领域发挥着极为重要的作用。数据库是软件程序的核心部分。软件测试是保证软件质量的重要手段,数据库测试已被高度重视。数据库测试与传统软件测试有所区别。因为在实际应用中,增、删、改、查是最常用的数据操作,所以数据库测试是要验证并确保数据的映射、事务的ACID属性、数据的完整性及业务的准确性,这些测试工作主要以SQL程序的方式进行。设计、执行测试用例要求有相应的数据库测试数据。理想的测试数据应是实际的、有效的、覆盖尽可能多的应用场景的最小数据集合,并且包括某些特殊数据。

1 常用数据库测试数据生成方法简析

目前,已有不少成熟的专用测试数据生成工具可以快速产生大量有效的测试数据。如DataFactory能建立复杂数据关系,允许测试人员毫不费力地产生百万行有意义的测试数据;在使用中首先读取数据库中表的schema,即表的定义之类的内容,以列表的形式显示;然后由用户定制要产生数据的具体内容,如数字范围、字符串长度、要产生数据记录的个数等;最后运行工程,生成数据。再如TestDataBuilder可以帮助程序开发或测试人员自动生成数据库中的测试数据,并且具有期望的值分布和列间相关性,生成的测试数据既能直接插入到数据表中,也能以Insert语句形式记录在文件中。当然,还可以使用自动化测试工具、其它数据库辅助工具等生成数据库测试数据。但以上这些方法只能生成一般的测试数据,很可能与实际测试工作中要执行的测试用例无关。为了解决这一问题,Binning等人提出了 RQP和Multi-RQP(简称MRQP)方法,将Select查询语句(组)、期望结果(组)与数据库模式作为输入,得到满足该查询语句(组)、期望结果(组)与数据库模式的一个数据库实例。

2 Multi-RQP基本思想

定义1(RQP) 给出一个SQL查询语句Q和该语句相应的期望结果R,以及一个关系数据库模式S(包括数据库的完整性约束),找到一个数据库实例D,使得R=Q(D),同时D满足S及其各种完整性约束。

定义2(Multi-RQP) 给出一组任意的SQL查询语句Q={Q1,Q2,…,Qn}和这些语句相应的一组期望结果 R={R1,R2,…,Rn},以及一个关系数据库模式S(包括数据库的完整性约束),找到一个数据库实例D,使D对于任意一个Ri=Q(Di)(1≤i≤n),同时D满足S及其各种完整性约束。

MRQP的数据生成算法如下:

其中,Q表示一组任意的SQL查询语句;R表示和查询语句组Q对应的一组期望结果;S表示一个关系数据库模式(包括数据库的完整性约束);Query Refinements(Fi,RFi)表示对应Q的查询改进语句组及其期望结果。

该算法首先生成一个空的数据库实例D。接着检查Q中的每一个查询语句Qi是否存在查询改进语句Fi。如果存在,则递归调用MRQP,根据Fi、Rfi和S生成一个数据库实例DFi,然后调整Ri(从原来的Ri中移除Qi在DFi上的查询结果),调整Qi使Qi与Fi不相交。跟着,将原来的D与DFi及使用RQP(根据调整后的Qi,调整后的Ri与S)得到的数据库实例合并,生成新的D。如果合并出错,或合并后的D不满足主键约束或唯一约束,则返回错误,否则返回数据库实例D。

3 Multi-RQP应用分析

3.1 RQP-disjoint

成功使用MRQP生成数据库测试数据有一个前提:查询语句组Q必须为RQP-disjoint,即查询语句组中Q的任意一对查询语句(Qj,Qk)(j≠k)必须为RQP-disjoint。如果由Qj定义的视图的更新独立于用RQP(Qk,Rk,S)方法得到的任意更新操作(如 insert语句),反之亦然,则这对查询语句(Qj,Qk)为RQP-disjoint。

例如数据库模式S为:

现有两个查询语句与相应的期望结果:

可见,即使R1、R2变为其他值,Q1的视图更新独立于I2,Q2的视图更新独立于 I1。因此 Q1和 Q2为RQP-disjoint。

通过对 Q1和 R1,Q2和 R2应用 MRQP,最终得到数据库测试数据如下,满足数据库模式与完整性约束,如表1和表2所示。

表1 book表中的数据

表2 course表中的数据

3.2 Query Refinement

在实际测试工作中,找到符合数据库实际应用场景且满足RQP-disjoint的一组查询语句并不容易。如,将上例中的 Q1和 R1,Q2和 R2变为:

则可能使用MRPQ生成的数据库实例满足数据库模式的完整性约束,但不符合实际应用场景,如表3、表4所示。

表3 book表中的数据

表4 course表中的数据

在表4中的列bookid值均为'b0000001',表示该课程所用的教材编号均为'b0000001',即均使用'VB'这本书,虽满足与表book主键列bookid的参照完整性,却不符合实际授课所用教材的实际情况。

为此,可引入对应Q的Query Refinement,即查询改进语句组。在上例中,已有Q1和R1,Q2和R2的基础上增加查询改进语句F21及期望查询结果RF21(对应Q2):

应用MRQP生成数据库测试数据的过程如下:

D1(即 RQP(Q1,R1,S)):得到的结果如表3 所示。

DF21(即 MRQP(F21,RF21,S)):得到的表 book 的数据与表3相同,表course中的数据如表5所示。

表5 course表中的数据

R2(即 R2Q2(DF21)):为空;

D2(即 RQP(Q2,R2,S)∪DF21):其中 RQP(Q2,R2,S)的结果与表5相同,该结果与DF21合并后则得到表book(详见表3)与表course(详见表5)。

最终得到的数据库测试数据为D1∪D2,即表book(详见表3)与表course(详见表5)。

4 Multi-RQP应用拓展

MRQP方法只能针对查询语句生成数据库实例,无法对其他数据操作(增、删、改等)生成测试数据。如果能把插入语句、删除语句、修改语句转化为等价的查询语句,那么问题就基本解决了。

例如,根据前面的例子,设有Delete语句:delete from course where courseid=‘c0000001’,若要使该删除操作成功,那么数据库实例中应有courseid值为‘c0000001’的记录。则可将该删除语句转化为对应的查询语句select*from course where courseid=‘c0000001’,期望结果包含courseid值为‘c0000001’的记录(如{<‘c0000001’,‘VB programming’,3,54,‘b0000001’>}。类似地,可将插入语句、修改语句转化为等价的查询语句。之后,应用MRQP方法求得相应的测试数据库。

5 结束语

通过以上应用分析可知,成功使用MRQP生成数据库测试数据要求符合 RQP-disjoint,具有Query Refinement。但在实际测试工作中,面对大型数据库测试,找到符合数据库实际应用场景且满足RQP-disjoint的查询语句组以及Query Refinement,确实比较繁琐、困难。因此,进一步的研究方向应是考虑根据非RQP-disjoint的任意查询语句组生成数据库测试数据的方法,其中的关键就是保证表间参照完整性。

[1]Vijay.Tips to Design Test Data Before Executing Your Test Cases[EB/OL].http://www.softwaretestinghelp.com/tips-to-design-test-data-before-executing-your-test-cases,2008-01-29.

[2]Carsten Binning,Donail Kossmann,Eric Lo.Reverse query processing[C]//IEEE 23rd International Conference on Data Engineering.Washington,DC:ICDE,2007:506-515.

[3]Carsten Binning,Donail Kossmann,Eric Lo.Multi-RQP generating test database for the functional testing of OLTP applications[C]//Proceeding of the 1st International Wordshop on Testing Database Systems.Newwork:ACM,2008:1-6.

[4]冯丽云,洪玫,杨秋辉,等.基于逆向查询处理算法的数据库系统测试数据生成方法[J].计算机应用,2011,31(4):948-951.

[5]董敏,毕盛,齐德昱.基于正则表达式的测试数据自动生成技术[J].计算机工程,2009,35(16):29-31.

[6]朱如龙.SQL Server 2005数据库应用系统开发技术[M].北京:机械工业出版社,2010.

[7]巩文化,毕学军,刘娟.基于数据库的快速测试数据生成方法研究[J].电脑知识与技术,2010,6(4):775-777.

[8]曾明,洪玫,王卓,等.数据库系统测试中测试用例的自动规范方法[J].计算机工程与设计,2009,30(15):3577-3580.

[9]陈郑珍.基于数据库应用系统的数据库测试[J].科技与生活,2012(15):112.

[10]何湘智,郭得广,王荣春.一种基于数据库的测试程序自动生成设计[J].机械工程与自动化,2010(5):166-167.

[11]李征宇,陈磊.数据库性能评测指标及其测试方法研究[J].电子设计工程,2011,19(4):4-5.

[12]费雯悦.一种基于改进遗传算法的测试用例自动生成研究[J].北京石油化工学院学报,2011,19(4):43-48.

[13]陈剑.基于RQP的测试数据库生成技术研究[D].长沙:长沙大学,2010.

[14]潘福霞.大型关系数据库自动化测试方法研究[D].武汉:华中科技大学,2009.

猜你喜欢
测试数据完整性实例
稠油热采水泥环完整性研究
测试数据管理系统设计与实现
莫断音动听 且惜意传情——论音乐作品“完整性欣赏”的意义
基于自适应粒子群优化算法的测试数据扩增方法
精子DNA完整性损伤的发生机制及诊断治疗
空间co-location挖掘模式在学生体能测试数据中的应用
完形填空Ⅱ
完形填空Ⅰ
桩身完整性检测中缺陷的综合判别
影响《标准》测试数据真实性的因素及破解策略