一种应用于同步软件测试的方法和装置
【技术领域】
本发明涉及数据库技术领域,特别是涉及一种应用于同步软件测试的方法和装置。
【背景技术】
数据库是数据有组织的集合,为各种应用服务提供数据服务。目前提供数据库服务的厂商越来越多,每种数据库产品的数据组织结构各不相同。为了备份和防灾需求,数据同步的需求也越来越大。在数据同步软件测试过程中,源端数据库产生测试数据是极为重要的测试步骤。
现有技术中的测试过程,通常都是按部就班的,以一套普适性的方案来对同步软件进行测试。这种测试方法,通常无法有效的发现同步软件特性和存在的问题,相对而言容易产生漏测的问题。
进一步的,目前主要通过插入随机数据的方法在源端数据库产生测试数据。但是此方法有几个弊端:每种数据库的数据类型名称、精度、标度都不相同,表结构语法不相同,需要在运行前详细配置。
鉴于此,克服该现有技术所存在的缺陷是本技术领域亟待解决的问题。
【发明内容】
本发明要解决的技术问题是现有技术中的测试过程,通常都是按部就班的,以一套普适性的方案来对同步软件进行测试。这种测试方法,通常无法有效的发现同步软件特性和存在的问题,相对而言容易产生漏测的问题。
本发明进一步要解决的技术问题是现有技术中生成表结构时候,会发生与被赋予表结构的源端数据库不匹配的问题,造成整个数据同步测试过程中的源端数据库准备工作出现纰漏。
本发明采用如下技术方案:
第一方面,本发明提供了一种应用于同步软件测试的方法,包括:
获取各备选数据库的数据库元信息,根据所述数据库元信息选择存在字符集差异的至少两个数据库,作为源端数据库和目的数据库;
根据选择好的源端数据库中对应的字符集属性和页大小属性,自动化生成源端表结构;
启动所述同步软件,将源端数据库中所述自动化生成源端表结构,同步到所述目的数据库;
根据同步结果与源端数据中的表结构进行比较,得到测试结果。
优选的,所述根据所述数据库元信息选择存在字符集差异的至少两个数据库,作为源端数据库和目的数据库,具体包括:
选择字符集之间,具有向下兼容的一方作为源端数据库,而另一方作为目的数据库;或者,
在所选择的至少两个数据库之间,其字符集相互之间不兼容,则任意选择一方作为源端数据库,而另一方作为目的数据库。
优选的,所述根据同步结果与源端数据中的表结构进行比较,具体包括:
比较目的数据库被同步过去的目的表结构,与源端数据库中的源端表结构,两者在数据对应性上是否存在偏差;所述偏差具体包括,是否存在字符的异常和/或丢失。
优选的,自动获取源数据库属性,包括:
根据数据库类型可得到的列类型集合、单表支持的最大列数;
结合数据库元信息以及数据库初始化信息得到的页大小属性、单行数据最大长度。
优选的,所述根据选择好的源端数据库中对应的字符集属性和页大小属性,自动化生成源端表结构,具体包括:
步骤a1)、根据数据库元信息,确定列类型集合Column_SET;单行数据最大长度MAX_ROW_LENGTH;单表支持的最大列数MAX_COLUMNS;
步骤b1)、随机生成表的列数colCnt;其中,colCnt的范围为1<=colCnt<=MAX_COLUMNS;
步骤c1)、初始化表的列集合cols;此时行数据长度RowLenthCnt设置为0,cols元素数目为0;
步骤d1)、进入生成表结构循环,具体,循环起始通过判定列集合cols元素数目是否小于colCnt;如果为真,跳转到步骤e1);否则,跳转到步骤h1);
步骤e1)、从列类型集合Column_SET中随机取出一个列类型Column,并确定Column的最大长度是MAX_ROW_LENGTH–RowLenthCnt;
步骤f1)、设置Column的列名、精度和标度,并计算Column实际的存储长度len;
步骤g1)、判定len+RowLenthCnt是否小于MAX_ROW_LENGTH;如果为真,Column加入表的列集合cols,更新RowLenthCnt,转到步骤d1);否则,舍去Column,转到步骤h1)。
步骤h1)、完成表的属性处理,包括增加主键约束和非空约束;
步骤i1)、结束表结构生成操作。
优选的,所述方法还包括:
以表为单位,根据表结构的列信息,针对每一列构造数据生成器,形成表的数据生成器;
其中,所有数据类型均转换为JDBC的标准数据类型处理。
优选的,为了统一管理列的数据生成器,将数据生成器作为一个抽象类;每个列在生成数据生成器的时候,根据列类型确定所实现的类对象,并输入包括标度和精度在内的列信息,确定数据生成器的各项参数。
优选的,在所述同步软件测试过程中,还包括对源端数据库的插入操作,具体包括:
步骤a2)、以PreparedStatement的方式执行表的insertSQL;
步骤b2)、所述数据生成器生成一行或者多行数据Rows;
步骤c2)、表的记录缓冲区中保存Rows中的部分数据;
步骤d2)、批量绑定数据Rows;
步骤e2)、执行insertSQL;
步骤f2)、判定步骤e2)是否执行成功;如果成功,跳转到步骤g2);如果失败,跳转到步骤h2);
步骤g2)、执行提交操作,统计此次提交成功的数据数目,记录插入操作成功一次,转到步骤i2);
步骤h2)、执行回滚操作,记录插入操作失败一次,转到步骤i2);
步骤i2)、更新统计信息,包括插入操作总次数、插入成功次数、插入失败次数,以及表的记录数目。
优选的,在所述同步软件测试过程中,还包括对源端数据库的更新操作,具体包括:
步骤a3)、表的数据生成器生成一行数据NewData作为新值;至少包含一个列值;
步骤b3)、表的记录缓冲区中选取一条记录OldData作为where条件,并从记录缓冲区中淘汰该记录;
步骤c3)、构造待参数的语句updateSQL。利用步骤a3)的NewData生成其中的set部分,利用步骤b3)的OldData生成其中的where部分。以PreparedStatement的方式执行updateSQL;
步骤d3)、绑定数据,包括步骤a3)的NewData与步骤b3)的OldData;
步骤e3)、执行updateSQL;
步骤f3)、判定步骤e3)是否执行成功;如果成功,转到步骤g3);如果失败,转到步骤h3);
步骤g3)、执行提交操作,统计此次提交更新的数据数目,记录更新操作成功一次,转到步骤i3);
步骤h3)、执行回滚操作,记录更新操作失败一次,转到步骤i3);
步骤i3)、更新统计信息,包括更新操作总次数,更新成功次数,更新失败次数。
第二方面,本发明还提供了一种应用于同步软件测试的装置,用于实现第一方面所述的应用于同步软件测试的方法,所述装置包括:
至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被程序设置为执行第一方面所述的应用于同步软件测试的方法。
第三方面,本发明还提供了一种非易失性计算机存储介质,所述计算机存储介质存储有计算机可执行指令,该计算机可执行指令被一个或多个处理器执行,用于完成第一方面所述的应用于同步软件测试的方法。
本发明提出了更具针对性的同步软件测试的方法,相比较现有技术的普适性的测试过程,本发明方法切入点更为刁钻,能够直接向同步软件的潜在问题点进行测试,同样的测试结果能够极大的缩减测试时间。
在优选的实现方案中,提出了一种数据生成器实现方法,操作简单,不需要详细配置表结构就可以支持多种源端数据库产生随机数据;提高了数据同步软件产生测试数据的覆盖范围,除了插入的数据,还包括更新的数据,删除的数据。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种应用于同步软件测试的方法流程示意图;
图2是本发明实施例提供的一种应用于同步软件测试的方法中生成表结构的流程示意图;
图3是本发明实施例提供的一种应用于同步软件测试的方法中包含插入的流程示意图;
图4是本发明实施例提供的一种应用于同步软件测试的方法中包含更新的流程示意图;
图5是本发明实施例提供的一种应用于同步软件测试的方法中包含删除的流程示意图;
图6是本发明实施例提供的一种应用于同步软件测试的装置结构示意图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
实施例1:
发明人在测试过程中,发现被测试的源端数据库和目的端数据库自身的特性也会对最终的同步软件测试结果造成一定的影响,而现有的测试过程,对此却很少有关注和研究的。本发明实施例1提供了一种应用于同步软件测试的方法,如图1所示,包括:
在步骤201中,获取各备选数据库的数据库元信息,根据所述数据库元信息选择存在字符集差异的至少两个数据库,作为源端数据库和目的数据库。
在具体测试环境中,更多遇到的是单一源端数据库和单一目的数据库之间的同步测试。为了简化测试描述过程,本发明实施例后续内容将以单一源端数据库和单一目的数据库之间关系展开描述。但是,对于本领域技术人员而言,多对一、一对多、多对多的场景,仅需要预先做好配置文件便可实现,因此,在本发明实施例已经提供了一对一的场景之后,可以在无需创造性劳动的情况下,将本发明实施例及其相关扩展方案应用到上述其它场景中去。
在步骤202中,根据选择好的源端数据库中对应的字符集属性和页大小属性,自动化生成源端表结构。
此处为本发明实施例针对现有的原生的源端数据库中,进行同步软件测试的进一步支撑。在无需用户手动导入用于同步的对象(即表结构)情况下,能够通过自动化生成源端表结构,实现整个测试过程的自动化实现。
在步骤203中,启动所述同步软件,将源端数据库中所述自动化生成源端表结构,同步到所述目的数据库。
这里的同步内容由各个同步软件自身具体实现,因此,在本发明实施例中对于具体的同步过程不做过多赘述。
在步骤204中,根据同步结果与源端数据中的表结构进行比较,得到测试结果。
本发明提出了更具针对性的同步软件测试的方法,相比较现有技术的普适性的测试过程,本发明方法切入点更为刁钻,能够直接向同步软件的潜在问题点进行测试,同样的测试结果能够极大的缩减测试时间。
在优选的实现方案中,提出了一种数据生成器实现方法,操作简单,不需要详细配置表结构就可以支持多种源端数据库产生随机数据;提高了数据同步软件产生测试数据的覆盖范围,除了插入的数据,还包括更新的数据,删除的数据。
在本发明具体实现过程中,对于步骤201中所涉及的,所述根据所述数据库元信息选择存在字符集差异的至少两个数据库,作为源端数据库和目的数据库,提供了一种具体的实现方式,包括:
选择字符集之间,具有向下兼容的一方作为源端数据库,而另一方作为目的数据库;或者,在所选择的至少两个数据库之间,其字符集相互之间不兼容,则任意选择一方作为源端数据库,而另一方作为目的数据库。在实际实现过程中,有可能一开始会指定源端数据库或者目的数据库中的一方,但是,同样也可以依据上述给予的条件进行筛选另一侧数据库;例如:若指定了源端数据库,则根据上述条件,选择字符集被所述指定了的源端数据库兼容,而自身的字符集不兼容所述源端数据库的数据库作为目的数据库;或者,筛选出字符集与所述源端数据库不兼容的数据库作为目的数据库。
在本发明实施例中,步骤204中涉及的,所述根据同步结果与源端数据中的表结构进行比较,存在一种具体的实现方式,尤其是针对字符集设定而言,具体包括:
比较目的数据库被同步过去的目的表结构,与源端数据库中的源端表结构,两者在数据对应性上是否存在偏差;所述偏差具体包括,是否存在字符的异常和/或丢失。在具体实现过程中,现有技术中已经存在的评判同步软件性能指标的,在本发明实施例中同样适用,上述的比较“字符的异常和/或丢失”是针对本发明所提出的专向、高效测试方法而提出的,是可以和现有评判同步软件性能指标方式共同实现的。
在本发明实施例中,除了上述从字符集属性出发设置专向测试维度以外,还可以针对不同数据库之间的页大小属性着手,进一步选择差异性较大的两个数据作为源端数据库和目的数据库,从而进一步提高一次测试过程中,对同步软件应对极端复杂情况的应对能力,同时也能将此测试过程平滑迁移至其它数据同步测试环境(包括同类型数据库不同初始化参数,或者不同类型数据库)。
具体的,自动获取源数据库属性,包括:
仅根据数据库类型可得到的列类型集合、单表支持的最大列数;
需要结合数据库元信息以及数据库初始化信息得到的页大小属性、单行数据最大长度。
实施例2:
本发明实施例,对于实施例1中所涉及的所述根据选择好的源端数据库中对应的字符集属性和页大小属性,自动化生成源端表结构,提供了一具体方法步骤过程,如图2所示,包括:
步骤301中,根据数据库元信息,确定列类型集合Column_SET;单行数据最大长度MAX_ROW_LENGTH;单表支持的最大列数MAX_COLUMNS。
步骤302中,随机生成表的列数colCnt;其中,colCnt的范围为1<=colCnt<=MAX_COLUMNS。
步骤303中,初始化表的列集合cols;此时行数据长度RowLenthCnt设置为0,cols元素数目为0。
步骤304中,进入生成表结构循环,具体,循环起始通过判定列集合cols元素数目是否小于colCnt;如果为真,跳转到步骤305;否则,跳转到步骤308。
步骤305中,从列类型集合Column_SET中随机取出一个列类型Column,并确定Column的最大长度是MAX_ROW_LENGTH–RowLenthCnt。
步骤306中,设置Column的列名、精度和标度,并计算Column实际的存储长度len。
步骤307中,判定len+RowLenthCnt是否小于MAX_ROW_LENGTH;如果为真,那么表示可以增加列类型为Column的列,Column加入表的列集合cols,表列集合增加了一列,所以需要更新RowLenthCnt,RowLenthCnt增加len,转到步骤304;否则,舍去Column,转到步骤308。
步骤308中,完成表的属性处理。例如主键(primary key,表中的一个或多个字段,它的值用于唯一标识表中的某一条记录),部分列的非空约束(表示该列的值是否可以为空),设置自增列(部分数据库支持自增列类型)等等。后续的某些操作可能涉及表属性。例如插入操作如果遇到自增列类型,那么该列值不能插入,构造insertSQL和行数据时需要忽略自增列;记录缓冲区保留部分行数据记录时需要保存主键列;生成行数据时如果该列有非空约束那么该列的值就不能是空值(NULL)。
步骤309中,结束表结构生成操作。
经过本发明实施例操作,能够自动生成适用于源端数据库的表结构,相比较现有技术中需要操作人员手动实现方案,能够极大的提高整个测试周期的效率。同时能方便快速的生成包含数百列的大型表结构(表结构支持的最多列数根据源端数据库判断得到),有效的扩展了数据同步软件测试数据的广度和深度。该发明对源端数据库的自适应处理,有效的合并了数据同步软件测试多种数据库的测试用例,减少了测试用例数量。
相应关键部分的实Java现代码如下:
实施例3:
本发明实施例是可以进一步支撑实施例1完善测试过程提出的,在本发明实施例中以表为单位(例如实施例中的源端表结构和目的表结构,在本发明实施例中主要指代源端表结构),根据表结构的列信息,针对每一列构造数据生成器,形成表的数据生成器;
其中,为了兼容处理多种类型的数据库,所有数据类型均转换为JDBC的标准数据类型处理。
为了统一管理列的数据生成器,将数据生成器作为一个抽象类;每个列在生成数据生成器的时候,根据列类型确定所实现的类对象,并输入包括标度和精度在内的列信息,确定数据生成器的各项参数。
抽象类的Java代码如下:
非大对象类型(包括数值、字符、时间)以String类型返回。大对象类型(包括blob、clob)由于数据长度可能超过String的限制,所以采用Object类型返回。
实施例4:
本发明实施例,对于实施例1的所述同步软件测试过程中,还包括对源端数据库提供自动的插入操作,从而进一步增加对同步软件的测试全面性考虑,具体包括:
步骤401中,准备执行insertSQL。在构造insertSQL时,需要结合表的列数,构造带有输入参数的SQL,然后选择以PreparedStatement方式执行SQL语句。这样不仅分离insertSQL和测试数据,做到重复使用insertSQL,而且后续可以批量绑定待插入的数据,提高插入操作的效率。
步骤402中,所述的数据生成器生成行数据Rows。对于不包含大对象类型(clob、blob)的表,一次性可以生成多行数据;包含大对象类型(clob、blob)的表,一次性仅生成一行数据。由于大对象类型的单个数据可能很大(部分数据库中blob、clob类型最大长度是2GB),为了避免资源消耗过大,限制包含大对象类型数据的表一次仅生成一行数据。
步骤403中,表的记录缓冲区中保存Rows中的部分数据。在有限的资源限制下,可以设定记录缓冲区的最大容量(记录数据的最大行数),并实行一定的淘汰机制(2种方案,1是当记录缓冲区达到最大容量时随机淘汰一批记录,2是一定时间内淘汰一批记录)。由于记录缓冲区中的数据用来生成更新操作和删除操作的where条件,所以不需要完整记录每行数据的所有列值。为了避免消耗太多资源,并综合业务实际考虑,判定行数据的具体某列是否进入记录缓冲区遵循2个原则:1是主键(Primary Key)需要记录;2是存储长度大的列值不记录。记录主键是因为对于有主键的表,数据同步软件是根据主键来定位数据行记录并进行数据同步的;存储长度大的列值不记录,是因为存储长度大的列值是长字符串、二进制串、大对象类型。这种列类型在业务逻辑上一般不会作为筛选行数据的特征条件。例如一个表结构为T1(c1 int primary key,c2varchar(30)),那么仅列c1进入记录缓冲区;一个表结构为T2(n1 varchar(200),n2 char(20),n3 blob),那么仅列n2进入记录缓冲区。
步骤404中,批量绑定数据Rows。对于非大对象类型,以String类型绑定参数;大对象类型数据,由于String类型的长度大小不满足测试数据长度要求,需要进行特殊处理,Clob类型绑定clob数据,Blob类型绑定blob数据。
步骤405中,执行insertSQL。
步骤406中,判定步骤405是否执行成功;如果成功,跳转到步骤407;如果失败,跳转到步骤408。
步骤407中,执行提交操作,操作日志记录插入操作成功一次,转到步骤409。由于可能是批量提交行数据,所以还需要获取此次插入操作成功插入的数据行数。
步骤408中,执行回滚操作,操作日志记录插入操作失败一次,转到步骤409。
步骤409中,更新该表的操作统计信息,包括插入操作总次数、插入成功次数、插入失败次数,以及表的记录数目。由于支持多个线程同时处理一个表结构,所以每个线程完成一次表操作(包括插入操作、删除操作、更新操作)后,需要同步更新涉及表的操作统计信息。
实施例5:
本发明实施例是针对所述同步软件测试过程中,还包括对源端数据库的更新操作。一次更新操作涉及2个行数据,NewData和OldData。NewData是更新的目标值,OldData是限定条件,用于选择需要更新的行数据。数据库中,如果更新操作没有限定条件,那么实际的操作是更新表中的所有行数据。如何实现自动化更新的方法过程,如图4所示,具体包括:
步骤501中,表的数据生成器生成一行数据NewData作为新值;由于一次更新操作时不必更新一行数据的所有列值,但是必须更新至少一列,所以生成的NewData中至少应该包含一个列,每个列可以出现一次。
步骤502中,表的记录缓冲区中选取一条记录OldData作为where条件。生成where条件时,每次随机选择某些列作为where条件。由于如果表包含主键,那么主键列肯定会在记录缓冲区中保存。在行数据进入记录缓冲区时,存储长度大的列值不会保存,所以得到的where条件不会包含存储长度大的列值(长字符串、二进制串、大对象类型)。这2个措施确保了可以快速定位需要更新的行数据,因此保证了更新操作的执行效率。选择作为OldData记录可以从记录缓冲区中淘汰。
步骤503中,构造待参数的语句updateSQL。其中的set部分是更新目标值,利用步骤501的NewData生成;其中的where部分是限定条件,利用步骤502的OldData生成。以PreparedStatement的方式执行updateSQL。
步骤504中,绑定数据,包括步骤501的NewData与步骤502的OldData。
步骤505中,执行updateSQL。
步骤506中,判定步骤505是否执行成功;如果成功,转到步骤507;如果失败,转到步骤508。
步骤507中,执行提交操作,操作日志记录更新操作成功一次,转到步骤509。
步骤508中,执行回滚操作,操作日志记录更新操作失败一次,转到步骤509。
步骤509中,更新该表的操作统计信息,包括更新操作总次数,更新成功次数,更新失败次数;由于更新操作不影响表的记录数目,所以无需更新表的记录数目。
实施例6:
本发明实施例是针对所述同步软件测试过程中,还包括对源端数据库的删除操作。删除操作需要限定条件。数据库中,如果删除操作没有限定条件,那么实际的操作是删除表中的所有行数据。如何实现自动化更新的方法过程,如图5所示,具体包括:
步骤601中,表的记录缓冲区中选取一条记录OldData作为where条件。生成where条件时,每次随机选择某些列作为where条件。由于如果表包含主键,那么主键列肯定会在记录缓冲区中保存。在行数据进入记录缓冲区时,存储长度大的列值不会保存,所以得到的where条件不会包含存储长度大的列值(长字符串、二进制串、大对象类型)。这2个措施确保了可以快速定位需要删除的行数据,因此保证了删除操作的执行效率。选择作为OldData记录可以从记录缓冲区中淘汰。
步骤602中,构造待参数的语句deleteSQL;其中的where部分是限定条件,利用步骤601的OldData生成;以PreparedStatement的方式执行deleteSQL。
步骤603中,绑定数据,包括步骤601中的OldData。
步骤604中,执行deleteSQL。
步骤605中,判定步骤604是否执行成功。如果成功,转到步骤606;如果失败,转到步骤607。
步骤606中,执行提交操作,操作日志记录删除操作成功一次,转到步骤608。由于一次删除操作可能删除多行数据,所以还需要获取此次删除操作删除的数据数目。
步骤607中,执行回滚操作,操作日志记录删除操作失败一次,转到步骤608。
步骤608中,更新该表的操作统计信息,包括删除操作总次数,删除成功次数,删除失败次数,以及表的记录数目。由于支持多个线程同时处理一个表结构,所以每个线程完成一次表操作(包括插入操作、删除操作、更新操作)后,需要同步更新涉及表的操作统计信息。
实施例7:
如图6所示,是本发明实施例的应用于同步软件测试的装置的架构示意图。本实施例的应用于同步软件测试的装置包括一个或多个处理器21以及存储器22。其中,图6中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图6中以通过总线连接为例。
存储器22作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序和非易失性计算机可执行程序,如实施例1中的应用于同步软件测试的方法。处理器21通过运行存储在存储器22中的非易失性软件程序和指令,从而执行应用于同步软件测试的方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
所述程序指令/模块存储在所述存储器22中,当被所述一个或者多个处理器21执行时,执行上述实施例1中的应用于同步软件测试的方法,例如,执行以上描述的图1-图5所示的各个步骤。
值得说明的是,上述装置和系统内的模块、单元之间的信息交互、执行过程等内容,由于与本发明的处理方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。