CN105653579B - 一种对分布式事务进行测试的方法和装置 - Google Patents
一种对分布式事务进行测试的方法和装置 Download PDFInfo
- Publication number
- CN105653579B CN105653579B CN201510958780.5A CN201510958780A CN105653579B CN 105653579 B CN105653579 B CN 105653579B CN 201510958780 A CN201510958780 A CN 201510958780A CN 105653579 B CN105653579 B CN 105653579B
- Authority
- CN
- China
- Prior art keywords
- tested
- affairs
- verification
- data
- unit
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供了一种对分布式事务进行测试的方法和装置,其中对分布式事务进行测试的方法包括:校验单元从配置文件中读取待测试事务对应的配置项;从结果数据库中获取所述待测试事务的待校验数据,以及,依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参考值,其中所述校验参数值包括数据初始值或执行预期值;利用所述校验参数值,对所述待校验数据进行校验。通过本发明的技术方案,可以有效的对分布式事务进行测试。
Description
【技术领域】
本发明涉及计算机程序测试的领域,特别涉及一种对事务进行测试的方法和装置。
【背景技术】
随着互联网的飞速发展,通过互联网来实现金融和支付业务的需求也日益增大,然而这些业务瞬时并发事务量大,对系统的响应速度也有较高要求。以典型的秒杀、抢购业务为例,这些业务通常是使用多台服务器,在分布式数据库间进行的数据交换,其对核心交易数据严格要求实时一致,不一致的数据有可能会导致严重的资金问题。
对于高并发下分布式事务,其中ACID是数据库事务正确执行的四个基本要素的缩写,ACID特征是衡量其事务能否正确执行的四个基本要素,其包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必需要具有这四种特性,否则在事务过程(Transactionprocessing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。
具体地,原子性——整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性——在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。具体来说就是,比如表与表之间存在外键约束关系,那么你对数据库进行的修改操作就必需要满足约束条件,即如果你修改了一张表中的数据,那你还需要修改与之存在外键约束关系的其他表中对应的数据,以达到一致性。
隔离性——隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性——在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
现有技术中通常是对单个事务进行的测试,由于分布式数据库是近几年才发展起来的技术,高并发下分布式事务的ACID特性测试还在起步阶段。如何验证高并发下的分布式ACID特性有很大难度,现有技术中用对账来进行校验,但对账只能校验最终一致性,即对账验证的是每次执行命令的结果。
因此现有技术中还没有一种有效的方式来测试分布式事务。
【发明内容】
本发明提供了一种对分布式事务进行测试的方法和装置,用以解决现有技术中没有一种有效的方式进行分布式事务测试的问题。
具体技术方案如下:
一种对分布式事务进行测试的方法,所述方法包括:
校验单元从配置文件中读取待测试事务对应的配置项;
从结果数据库中获取所述待测试事务的待校验数据,以及,依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参考值,其中所述校验参数值包括数据初始值或执行预期值;
利用所述校验参数值,对所述待校验数据进行校验。
根据本发明一优选实施例,在校验单元从配置文件中读取待测试事务对应的配置项之前,所述方法还包括:
准备单元将生成的待测试事务送入待测试事务列表,以及在配置文件中针对各待测试事务分别添加配置项。
根据本发明一优选实施例,所述从结果数据库中获取所述待测试事务的待校验数据包括:
依据所述配置项包含的指示待测试事务存储位置的信息,从所述结果数据库中获取所述待测试事务的待检验数据。
根据本发明一优选实施例,所述依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参考值包括:
如果所述执行状态是已完成状态,则从所述配置项中获取执行预期值作为校验参数值;
否则从所述配置项中获取数据初始值作为校验参数值。
根据本发明一优选实施例,所述校验单元和执行单元同时开始对同一待测试事务的处理。
根据本发明一优选实施例,所述利用所述校验参数值,对所述待校验数据进行校验包括:
将校验参数值与待校验数据进行比较;
如果校验参数值与待校验数据相等,则所述待测试事务通过校验;
如果校验参数值与待校验数据不相等,则校验未通过,记录校验日志。
根据本发明一优选实施例,所述方法还包括:
准备单元针对待测试事务列表分配执行单元,以由分配的执行单元执行所述待测试事务列表中的各待测试事务;
针对各待测试事务列表中的各待测试事务分别分配校验单元。
根据本发明一优选实施例,针对各待测试事务列表分配的执行单元并行执行对应待测试事务列表中的事务。
根据本发明一优选实施例,所述校验单元每间隔预设的时间执行一次待测试事务的校验,直至达到预设的校验次数。
根据本发明一优选实施例,所述待测试事务和配置文件是存储在redis数据库中的,所述待测试事务是以SQL语言编写的SQL脚本。
一种对分布式事务进行测试的装置,所述装置包括校验单元和执行单元,其中:
校验单元,用于从配置文件中读取待测试事务对应的配置项;从结果数据库中获取所述待测试事务的待校验数据,以及,依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参考值,其中所述校验参数值包括数据初始值或执行预期值;利用所述校验参数值,对所述待校验数据进行校验;
执行单元,用于执行待测试事务。
根据本发明一优选实施例,所述装置还包括准备单元,用于将生成的待测试事务送入待测试事务列表,以及在配置文件中针对各待测试事务分别添加配置项。
根据本发明一优选实施例,所述校验单元从结果数据库中获取所述待测试事务的待校验数据执行的具体操作包括:
依据所述配置项包含的指示待测试事务存储位置的信息,从所述结果数据库中获取所述待测试事务的待检验数据。
根据本发明一优选实施例,所述校验单元依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参考值执行的具体操作包括:
如果所述执行状态是已完成状态,则从所述配置项中获取执行预期值作为校验参数值;
否则从所述配置项中获取数据初始值作为校验参数值。
根据本发明一优选实施例,所述校验单元和执行单元同时开始对同一待测试事务的处理。
根据本发明一优选实施例,所述校验单元利用校验参数值,对所述待校验数据进行校验执行的具体操作包括:
将校验参数值与待校验数据进行比较;
如果校验参数值与待校验数据相等,则所述待测试事务通过校验;
如果校验参数值与待校验数据不相等,则校验未通过,记录校验日志。
根据本发明一优选实施例,所述准备单元还用于执行以下操作:
针对待测试事务列表分配执行单元,以由分配的执行单元执行所述待测试事务列表中的各待测试事务;
针对各待测试事务列表中的各待测试事务分别分配校验单元。
根据本发明一优选实施例,针对各待测试事务列表分配的执行单元并行执行对应待测试事务列表中的事务。
根据本发明一优选实施例,所述校验单元每间隔预设的时间执行一次待测试事务的校验,直至达到预设的校验次数。
根据本发明一优选实施例,所述待测试事务和配置文件是存储在redis数据库中的,所述待测试事务是以SQL语言编写的SQL脚本。
由以上技术方案可以看出,本发明的校验单元依据执行单元对待测试事务的执行状态从待测试事务的配置项中获取不同的校验参考值,利用所述校验参数值对所述待校验数据进行校验,从而可以有效的对分布式事务进行测试。
【附图说明】
图1为本发明实施例一提供的一种对分布式事务进行测试的方法流程图;
图2为本发明实施例二提供的一种对分布式事务进行测试的装置结构示意图;
图3为本发明对分布式事务中各待测试事务进行测试的整体结构示意图。
【具体实施方式】
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。
实施例一、
图1为本发明实施例一提供的一种对分布式事务进行测试的方法流程图,如图1所示,该方法的具体流程包括:
101、准备单元将生成的待测试事务送入待测试事务列表,以及在配置文件中针对各待测试事务分别添加配置项。
该步骤是对分布式事务进行测试的数据准备阶段。
可以首先生成多个需要执行的待测试事务,该待测试事务可以是由SQL语言编写的SQL脚本。SQL脚本是使用SQL语言,依据SQL格式编写的“.sql”文件,其中每一个SQL脚本均是一个完整的事务。
并且该SQL脚本可以是随机生成的,随机生成SQL脚本的目的是可以对分布式事务进行全面的测试。
多个随机生成的SQL脚本可能会有交叉。所谓交叉,就是SQL脚本的事务之间具有相关性,例如A、B、C、D四个人,随机生成的多个事务可以包括A向B转账的事务,其中,该完整的事务包括两个操作,其是通过一、从A的账户减钱,二、向B的账户加钱这样的逻辑来实现的,多个事务还可以包括向A的账户充值的事务,B向A转账的事务、A给C发红包的事务、D向B转账的事务等,其中A向B转账、向A的账户充值,B向A转账、A给C发红包这四个SQL脚本的事务均涉及对A账户的操作,因此可以认为这四个脚本是交叉的。
并且,可以预先建立一个配置文件,在每生成一个待测试事务时,可以向配置文件中添加一条配置项,该配置项可以包括待测试事务的事务名称、指示待测试事务存储位置的信息、需要校验哪一条数据和该条数据的校验参考值。
其中,指示待测试事务存储位置的信息可以包括该待测试事务涉及的库和表等、该条数据的校验参考值可以包括这条数据的初始值、以及此待测试事务执行成功后,执行预期值等。
举个例子:假设生成的SQL脚本是用于执行A向B转账,其中A在结果数据库中账户余额有10元钱,B有8元钱,设定A向B转账3元钱,则在配置文件中,所要校验的数据就是A的账户值和B的账户值,这条数据的初始值中A为10、B为8,而在执行完A向B转账3元的脚本后,则执行预期值A是7,B是11。
在配置文件中为事务A向B转账3元所添加的配置项可以如表1所示:
表1
还可以将生成的待测试事务送入待测试事务列表中,以便提供给执行单元执行列表中的待测试事务,其中每个列表可以包括至少一个待测试事务。
在生成了随机SQL脚本后,将该随机SQL脚本存入redis数据库中。
redis存储系统的特点是将数据都缓存在内存中,从而保证了效率。本实施例通过将SQL脚本存入redis数据库中以完成测试,可以支持测试的效率。
其中,所述redis数据库中不仅存储有脚本,还存储有与脚本相关的配置文件。
102、准备单元针对待测试事务列表分配执行单元,针对各待测试事务列表中的各待测试事务分别分配校验单元。
该步骤中,准备单元在将生成的待测试事务送入待测试事务列表后,可以为待测试事务列表分配执行单元,以便由执行单元执行所述待测试事务列表中的各待测试事务;并且针对各待测试事务列表中的各待测试事务分别分配校验单元。
其中,分配的执行单元和校验单元可以分别以执行线程和校验线程的方式实现。
在准备测试分布式事务时,可以读取redis数据库中的配置文件,对该配置文件进行解析以获得待测试事务列表。
执行单元与待测试事务列表存在对应关系,执行单元负责执行其对应待测试事务列表中的待测试事务。也就是说,若待测试事务列表存在多个,则可以分配对应数量的执行单元,使得每个待测试事务列表分配一个执行单元。
该分配的执行单元是用于执行当前待测试事务列表中的每个待测试事务,每个待测试事务有一个标志位,用于表示待测试事务的执行状态。
其中在生成待测试事务列表时,将每一个待测试事务的标志位的值初始化为0,值0在数据准备阶段,可以表示待测试事务未执行。
而在随后介绍的执行阶段,可以表示待测试事务未执行成功。
并且当待测试事务执行成功后,将标志位设为1,以表示待测试事务已完成。
其中,针对各待测试事务列表分配的执行单元并行执行对应待测试事务列表中的事务。
并且,待测试事务列表中可以仅包含一个待测试事务,在该种情况下,为每个待测试事务列表分配一个执行单元也就是为仅包含的该待测试事务分配的执行单元。
103、校验单元从配置文件中读取待测试事务对应的配置项。
该步骤中,可以从配置文件中获得每个待测试事务的配置项的内容,包括用以指示待测试事务存储位置的该待测试事务涉及的库和表等信息、需要校验哪一条数据、以及该条数据的初始值、以及执行预期值等校验参考值。
104、校验单元从结果数据库中获取所述待测试事务的待校验数据,以及,依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参考值。
该步骤中,针对待测试事务,校验单元可以根据该待测试事务名称的名称查询待测试事务的配置项,从该配置项中获取指示待测试事务存储位置的库和表等信息。
如表1所示,待测试事务SQL1中,待测试的A的值位于名称为库1的数据库的表1中,而B的值位于名称为库2的数据库的表2中,可见,由于分布式事务是使用分布式数据库,因此A和B可能存在于不同的数据库和不同的表中。然而,可以依据配置项包含的指示待测试事务存储位置的信息,从数据库1或数据库2中等分布式结果数据库获取所述待测试事务的待校验数据。
仍以A向B转账这一待测试事务SQL1为例,则校验单元从结果数据库中分别取得A账户和B账户内的当前余额,即会取到A的账户有10元钱,B的账户有8元钱这样的数值作为待校验数据。
另外,为了实现校验,还需要根据待测试事务的执行状态,从配置项中获取与执行状态相对应的校验参考值。
如果所述执行状态是已完成状态,则从配置项中获取执行预期值作为校验参数值;否则从配置项中获取数据初始值作为校验参数值。
具体地,可以从待测试事务的标志位中确定该待测试事务的执行状态是否是已完成状态,其中可以将标志位设为1以表示已完成状态。
由于只有执行成功的待测试事务才将标记设为1,因此当获取的执行状态为0时,则表示该待测试事务未执行或未执行成功,因此从配置项中获取数据初始值作为校验参数值;当获取的执行状态为1时,则表示该待测试事务执行成功,则从配置项中获取执行预期值作为校验参数值。
例如,当获取SQL1的待测试事务的执行状态为0时,则从配置项中取A的值10、B的值8作为校验参数值,当执行状态为1时,从配置项中取A的值7、B的值11作为校验参数值。
105、校验单元利用所述校验参数值,对所述待校验数据进行校验,以及执行单元执行该待测试事务。
该步骤中,可以将校验参数值与待校验数据进行比较,如果校验参数值与待校验数据相等,则所述待测试事务通过校验;如果校验参数值与待校验数据不相等,则校验未通过,记录校验日志。
具体地,执行单元可以执行待测试事务。
如果执行成功,则将其所执行的待测试事务的标志位置为1,如果执行不成功,则仍保持待测试事务的标志位为0。
具体地,当标志位为0时,校验单元从结构数据库中取出待校验数据后,与配置项中的数据初始值比较,若相等,校验通过。若不相等,校验不通过,记录相关日志。标志位为1时,校验单元从结构数据库中取出待校验数据后与执行预期值比较,若相等,校验通过,否则,校验不通过,记录相关日志。
其中,由于每个待测试事务均对应一个校验单元,因此对于每一个未成功执行的待测试事务均会对应一个相关日志,该相关日志可以包括从配置项中获取的事务名称、校验哪一条数据、涉及的库和表等,并且也可以包括“值”不相等这样的具体执行错误信息,或者是否读到不完整的数据,是否读到未提交的数据,是否读到已提交的数据等多种情况的信息。
接续前面的例子进一步说明:假设待测试事务“A向B转账3元”未成功执行,则理论上,在结果数据库中A账户仍有10元,而B账户仍为8元,因此校验过程中,可以依据该待测试事务未成功执行的状态,从配置项中获取数据初始值,即A的10以及B的8,并分别与结果数据库中的待校验数据进行比较,如果比较结果是两个数据相等,则证明待测试事务通过校验,否则,如果两个数据不相等,例如从结果数据库中获取的A账户中是9元,而不是理论上应该获取到的10元的值,则证明在待测试事务在执行过程中产生了错误,因此记录日志。
通过该日志中所记录这些信息,可以从执行该待测试事务的具体实例中获取该时间点的实例日志,从而根据实例日志检测到引起错误的具体原因。
对于同一待测试事务,执行单元的执行情况与校验单元的校验情况之间的对应关系如表2所示:
表2
举个例子,校验单元读到不完整的数据具体体现在校验的用户不存在,或者校验的账户没有足够的余额加减等。
并且,在校验单元对待测试事务进行校验的同时,执行单元可以执行该待测试事务。
具体地,当校验单元从结果数据库中获取到待测试事务的待校验数据后,可以在校验单元开始查询配置项中的校验参数值并进行校验的同时,使执行单元执行同一待测试事务。
在要执行待测试事务时,执行单元可以从校验单元获取SQL脚本,或者直接从redis中获取SQL脚本。
如前所述,由于各脚本的标志位可以标记各脚本的执行状态,且初始值均为0。当执行单元执行完毕后,则执行单元会更新该脚本事务的状态,即如果脚本执行成功,则将相应脚本的标志位设为1。
其中,可以在校验单元从结果数据库中获取待测试事务的待测试数据时,由其向执行单元发出通知,触发执行单元执行与校验单元正校验的同一待测试事务。
以每个待测试列表中均只包括一个待测试事务为例,则为每个待测试列表分配的执行单元仅唯一执行一个待测试事务,在此情况下,可以当校验单元获取该待测试事务的待校验数据时,由校验单元通知执行单元开始执行与其正校验的相同的待测试事务。通过这种方式可以保证校验单元和执行单元几乎同时开始对同一待测试事务的处理。
或者,可以在校验单元从结果数据库中获取待测试数据时,由准备单元或通过其他方式触发执行单元执行同一待测试事务。
另外,可以设置校验单元对一个待测试事务的检验的间隔时间以及校验次数,该校验单元可以每间隔预设的时间执行一次待测试事务的校验,直至达到预设的校验次数。
例如,可以使校验单元针对一个待测试事务重复的查询该待测试事务的配置项中的相应校验参数值,例如校验单元每隔200ms校验一次,且设定共校验10次结束。
通过使校验单元和执行单元对同一待测试事务的处理同时进行,可以使校验单元对执行单元所执行的待测试事务进行实时校验。通过对一个待测试事务按一定时间间隔进行多次校验,类似于对待测试事务的执行过程进行采样的方式,可以动态发现待测试事务在执行过程中每一个采样点是否存在错误,从而基于发现的一个采样时间点的错误,可以通过该时间点,准确的从待测试事务的一个完整过程中找到错误在当前时间的产生的具体原因。
以送入待测试事务列表中的待测试事务为例,由于多个列表的待测试事务均是并行执行,因此在执行一个待测试事务时,有可能同一时刻有其他交叉事务也在执行,例如在执行A向B转账时,A给C发红包的事务也在并行执行,这种情况下,就可能存在两个事务均对A的账户进行调用的操作,当多个事务在执行过程中要调用一个对象的数据时,则会产生死锁等并行性事务通常会产生的问题。针对一个待测试事务的校验,通过设置校验的间隔时间和次数,可以不停地查询该待测试事务配置项中的相应字段,以保证在待测试事务的不同执行阶段、例如加锁、解锁、死锁等阶段都能进行事务的测试。
优选地,本实施例还可以不断地调节重复校验时间的长度和测试规模,通过不断地模型自适应性学习,即通过建立模型,将循环时间的长度置入模型以找到一个稳定有效的测试模型。
实施例二、
图2为本发明实施例二提供的一种对分布式事务进行测试的装置结构示意图,如图2所示,该装置包括准备单元201、校验单元202、以及执行单元203。其中:
准备单元201,用于为分布式事务的测试提供数据准备。
为了提供数据准备,准备单元执行如下具体操作:
第一、准备单元201在校验单元从配置文件中读取待测试事务对应的配置项之前,将生成的待测试事务送入待测试事务列表,以及在配置文件中针对各待测试事务分别添加配置项。
可以首先生成多个需要执行的待测试事务,该待测试事务可以是由SQL语言编写的SQL脚本。其中每一个SQL脚本均是一个完整的事务。
并且该SQL脚本可以是随机生成的,随机生成SQL脚本的目的是可以对分布式事务进行全面的测试。
多个随机生成的SQL脚本可能会有交叉。
准备单元201可以预先建立一个配置文件,在每生成一个待测试事务时,可以向配置文件中添加一条配置项,该配置项可以包括待测试事务的事务名称、指示待测试事务存储位置的信息、需要校验哪一条数据和该条数据的校验参考值。
其中,指示待测试事务存储位置的信息可以包括该待测试事务涉及的库和表等、该条数据的校验参考值可以包括这条数据的初始值、以及此待测试事务执行成功后,执行预期值等。
准备单元201还可以将生成的待测试事务送入待测试事务列表中,以便提供给执行单元执行列表中的待测试事务,其中每个列表可以包括至少一个待测试事务。
准备单元201在生成了随机SQL脚本后,还可以用于将该随机SQL脚本存入redis数据库中。
其中,所述redis数据库中不仅存储有脚本,还存储有与脚本相关的配置文件。
第二、准备单元201针对待测试事务列表分配执行单元,针对各待测试事务列表中的各待测试事务分别分配校验单元。
具体地,准备单元201在将生成的待测试事务送入待测试事务列表后,可以为待测试事务列表分配执行单元,以便由执行单元执行所述待测试事务列表中的各待测试事务;并且针对各待测试事务列表中的各待测试事务分别分配校验单元。
其中,分配的执行单元203和校验单元202可以分别以执行线程和校验线程的方式实现。
在准备测试分布式事务时,准备单元201可以读取redis数据库中的配置文件,对该配置文件进行解析以获得待测试事务列表。
该分配的执行单元是用于执行当前待测试事务列表中的每个待测试事务,每个待测试事务有一个标志位,用于表示待测试事务的执行状态。
其中在生成待测试事务列表时,将每一个待测试事务的标志位的值初始化为0,值0在数据准备阶段,可以表示待测试事务未执行。
而在随后介绍的执行阶段,也可以表示待测试事务未执行成功。
并且当待测试事务执行成功后,将标志位设为1,以表示待测试事务已完成。
其中,针对各待测试事务列表分配的执行单元并行执行对应待测试事务列表中的事务。
并且,各待测试事务列表中可以仅包含一个待测试事务,在该种情况下,为每个待测试事务列表分配一个执行单元也就是为仅包含的该待测试事务分配的执行单元。
校验单元202,用于对待测试事务进行校验。
该校验单元202可以执行如下具体操作:
第一、校验单元202可以用于从配置文件中读取待测试事务对应的配置项。
具体地,校验单元202可以从配置文件中获得每个待测试事务的配置项的内容,包括用以指示待测试事务存储位置的该待测试事务涉及的库和表等信息、需要校验哪一条数据、以及该条数据的初始值、以及执行预期值等校验参考值。
第二、校验单元202可以用于从结果数据库中获取所述待测试事务的待校验数据,以及,依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参考值。
具体地,针对待测试事务,校验单元202可以根据该待测试事务名称的名称查询待测试事务的配置项,从该配置项中获取指示待测试事务存储位置的库和表等信息。从而依据该存储位置信息,从分布式结果数据库中获取所述待测试事务的待校验数据。
另外,为了实现校验,还需要根据待测试事务的执行状态,从配置项中获取与执行状态相对应的校验参考值。
如果所述执行状态是已完成状态,则从配置项中获取执行预期值作为校验参数值;否则从配置项中获取数据初始值作为校验参数值。
具体地,可以从待测试事务的标志位中确定该待测试事务的执行状态是否是已完成状态,其中可以将标志位设为1以表示已完成状态。
由于只有执行成功的待测试事务才将标记设为1,因此当获取的执行状态为0时,则表示该待测试事务未执行或未执行成功,因此从配置项中获取数据初始值作为校验参数值;当获取的执行状态为1时,则表示该待测试事务执行成功,则从配置项中获取执行预期值作为校验参数值。
第三、校验单元202可以用于利用校验参数值,对所述待校验数据进行校验。
校验单元202可以将校验参数值与待校验数据进行比较,如果校验参数值与待校验数据相等,则所述待测试事务通过校验;如果校验参数值与待校验数据不相等,则校验未通过,记录校验日志。
具体地,当标志位为0时,校验单元从结构数据库中取出待校验数据后,与配置项中的数据初始值比较,若相等,校验通过。若不相等,校验不通过,记录相关日志。标志位为1时,校验单元从结构数据库中取出待校验数据后与执行预期值比较,若相等,校验通过,否则,校验不通过,记录相关日志。
其中,由于每个待测试事务均对应一个校验单元,因此对于每一个未成功执行的待测试事务均会对应一个相关日志,该相关日志可以包括从配置项中获取的事务名称、校验哪一条数据、涉及的库和表等,并且也可以包括“值”不相等这样的具体执行错误信息,或者是否读到不完整的数据,是否读到未提交的数据,是否读到已提交的数据等多种情况的信息。
接续前面的例子进一步说明:假设待测试事务“A向B转账3元”未成功执行,则理论上,在结果数据库中A账户仍有10元,而B账户仍为8元,因此校验过程中,可以依据该待测试事务未成功执行的状态,从配置项中获取数据初始值,即A的10以及B的8,并分别与结果数据库中的待校验数据进行比较,如果比较结果是两个数据相等,则证明待测试事务通过校验,否则,如果两个数据不相等,例如从结果数据库中获取的A账户中是9元,而不是理论上应该获取到的10元的值,则证明在待测试事务在执行过程中产生了错误,因此记录日志。
通过该日志中所记录这些日志信息,可以从执行该待测试事务的具体实例中获取该时间点的实例日志,从而根据实例日志检测到引起错误的具体原因。
另外,可以设置校验单元对一个待测试事务的检验的间隔时间以及校验次数,该校验单元可以每间隔预设的时间执行一次待测试事务的校验,直至达到预设的校验次数。
执行单元203,用于执行校验单元所校验的待测试事务。
具体地,执行单元可以执行校验单元202当前正校验的待测试事务。
如果执行成功,则将其所执行的待测试事务的标志位置为1,如果执行不成功,则仍保持待测试事务的标志位为0。
对于同一待测试事务,执行单元的执行情况与校验单元的校验情况之间的对应关系可以如实施例一中的表2所示。
并且,在校验单元202对待测试事务进行校验的同时,执行单元203可以执行该待测试事务。
具体地,当校验单元202从结果数据库中获取到待测试事务的待校验数据后,可以在校验单元开始查询配置项中的校验参数值并进行校验的同时,使执行单元执行同一待测试事务。
在要执行待测试事务时,执行单元203可以从校验单元202获取SQL脚本,或者直接从redis中获取SQL脚本。
如前所述,由于各脚本的标志位可以标记各脚本的执行状态,且初始值均为0。当执行单元203执行完毕后,则执行单元会更新该脚本事务的状态,即如果脚本执行成功,则将相应脚本的标志位设为1。
其中,可以在校验单元202从结果数据库中获取待测试事务的待测试数据时,由其向执行单元203发出通知,触发执行单元执行与校验单元正校验的同一待测试事务。
或者,可以在校验单元202从结果数据库中获取待测试数据时,由准备单元203或通过其他方式触发执行单元203执行同一待测试事务。
优选地,本实施例还可以不断地调节重复校验时间的长度和测试规模,通过不断地模型自适应性学习,即通过建立模型,将循环时间的长度置入模型以找到一个稳定有效的测试模型。
图3示出了本发明对分布式事务中各待测试事务进行测试的整体结构示意图。
如图3所示,本发明的准备单元将生成的待测试事务送入多个待测试事务列表,例如列表1至列表N,为每个待测试事务列表分配一个执行单元,即执行单元1至N,执行单元用于执行待测事务列表中的各待测试事务,而校验单元1至N可以对当前执行的待测试事务进行校验以得到校验结果。
通过上述方式,可以对分布式事务中的各个待测试事务进行全面校验,从而可以有效的对分布式事务进行测试。
通过本发明的实施例,可以实现如下技术效果:
(1)通过本发明的对分布式事务进行测试的方法和装置,可以对涉及事务的各方面进行全面测试。
(2)本发明克服了现有技术中往往只能分析单个事务的局限性,而能够对并行执行的事务进行测试。
(3)本发明使校验单元每间隔预设的时间执行一次待测试事务的校验,直至达到预设的校验次数,从而能够获得多个校验样本,达到对待测试事务更全面校验的目的。
(4)本发明通过校验日志中所记录信息,从执行该待测试事务的具体实例中获取该时间点的实例日志,从而根据实例日志检测到引起错误的具体原因,使校验结果直观并可以解释。
在本发明所提供的几个实施例中,应该理解到,所揭露方法和装置,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
Claims (18)
1.一种对分布式事务进行测试的方法,其特征在于,所述方法包括:
校验单元从配置文件中读取待测试事务对应的配置项;
从结果数据库中获取所述待测试事务的待校验数据,以及,
依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参数值,其中所述校验参数值包括数据初始值或执行预期值,如果所述执行状态是已完成状态,则从所述配置项中获取执行预期值作为校验参数值,否则从所述配置项中获取数据初始值作为校验参数值;
利用所述校验参数值,对所述待校验数据进行校验。
2.根据权利要求1所述的方法,其特征在于,在校验单元从配置文件中读取待测试事务对应的配置项之前,所述方法还包括:
准备单元将生成的待测试事务送入待测试事务列表,以及在配置文件中针对各待测试事务分别添加配置项。
3.根据权利要求1所述的方法,其特征在于,所述从结果数据库中获取所述待测试事务的待校验数据包括:
依据所述配置项包含的指示待测试事务存储位置的信息,从所述结果数据库中获取所述待测试事务的待检验数据。
4.根据权利要求1所述的方法,其特征在于,所述校验单元和执行单元同时开始对同一待测试事务的处理。
5.根据权利要求1所述的方法,其特征在于,所述利用所述校验参数值,对所述待校验数据进行校验包括:
将校验参数值与待校验数据进行比较;
如果校验参数值与待校验数据相等,则所述待测试事务通过校验;
如果校验参数值与待校验数据不相等,则校验未通过,记录校验日志。
6.根据权利要求2所述的方法,其特征在于,所述方法还包括:
准备单元针对待测试事务列表分配执行单元,以由分配的执行单元执行所述待测试事务列表中的各待测试事务;
针对各待测试事务列表中的各待测试事务分别分配校验单元。
7.根据权利要求6所述的方法,其特征在于,针对各待测试事务列表分配的执行单元并行执行对应待测试事务列表中的事务。
8.根据权利要求1-7任一项所述的方法,其特征在于:
所述校验单元每间隔预设的时间执行一次待测试事务的校验,直至达到预设的校验次数。
9.根据权利要求1-7任一项所述的方法,其特征在于,所述待测试事务和配置文件是存储在redis数据库中的,所述待测试事务是以SQL语言编写的SQL脚本。
10.一种对分布式事务进行测试的装置,其特征在于,所述装置包括校验单元和执行单元,其中:
校验单元,
用于从配置文件中读取待测试事务对应的配置项;从结果数据库中获取所述待测试事务的待校验数据,以及,
依据执行单元对待测试事务的执行状态,从所述配置项中获取校验参数值,其中所述校验参数值包括数据初始值或执行预期值,如果所述执行状态是已完成状态,则从所述配置项中获取执行预期值作为校验参数值,否则从所述配置项中获取数据初始值作为校验参数值;
利用所述校验参数值,对所述待校验数据进行校验;
执行单元,用于执行待测试事务。
11.根据权利要求10所述的装置,其特征在于,所述装置还包括准备单元,用于将生成的待测试事务送入待测试事务列表,以及在配置文件中针对各待测试事务分别添加配置项。
12.根据权利要求10所述的装置,其特征在于,所述校验单元从结果数据库中获取所述待测试事务的待校验数据执行的具体操作包括:
依据所述配置项包含的指示待测试事务存储位置的信息,从所述结果数据库中获取所述待测试事务的待检验数据。
13.根据权利要求10所述的装置,其特征在于,所述校验单元和执行单元同时开始对同一待测试事务的处理。
14.根据权利要求10所述的装置,其特征在于,所述校验单元利用校验参数值,对所述待校验数据进行校验执行的具体操作包括:
将校验参数值与待校验数据进行比较;
如果校验参数值与待校验数据相等,则所述待测试事务通过校验;
如果校验参数值与待校验数据不相等,则校验未通过,记录校验日志。
15.根据权利要求11所述的装置,其特征在于,所述准备单元还用于执行以下操作:
针对待测试事务列表分配执行单元,以由分配的执行单元执行所述待测试事务列表中的各待测试事务;
针对各待测试事务列表中的各待测试事务分别分配校验单元。
16.根据权利要求15所述的装置,其特征在于,针对各待测试事务列表分配的执行单元并行执行对应待测试事务列表中的事务。
17.根据权利要求10-16任一项所述的装置,其特征在于,所述校验单元每间隔预设的时间执行一次待测试事务的校验,直至达到预设的校验次数。
18.根据权利要求10-16任一项所述的装置,其特征在于,所述待测试事务和配置文件是存储在redis数据库中的,所述待测试事务是以SQL语言编写的SQL脚本。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510958780.5A CN105653579B (zh) | 2015-12-18 | 2015-12-18 | 一种对分布式事务进行测试的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510958780.5A CN105653579B (zh) | 2015-12-18 | 2015-12-18 | 一种对分布式事务进行测试的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105653579A CN105653579A (zh) | 2016-06-08 |
CN105653579B true CN105653579B (zh) | 2019-06-28 |
Family
ID=56477553
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510958780.5A Active CN105653579B (zh) | 2015-12-18 | 2015-12-18 | 一种对分布式事务进行测试的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105653579B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106095688A (zh) * | 2016-06-23 | 2016-11-09 | 微梦创科网络科技(中国)有限公司 | 一种软件性能测试方法及装置 |
CN107179907A (zh) * | 2017-05-15 | 2017-09-19 | 北京奇艺世纪科技有限公司 | 一种配置系统及方法 |
CN108255724B (zh) * | 2018-01-17 | 2021-10-08 | 北京网信云服信息科技有限公司 | 一种事务参与者的测试方法及系统 |
CN109151021B (zh) * | 2018-08-21 | 2021-05-25 | 郑州云海信息技术有限公司 | 一种分布式存储系统文件锁特性测试方法和装置 |
CN109271399A (zh) * | 2018-11-19 | 2019-01-25 | 武汉达梦数据库有限公司 | 一种数据库写入日志一致性的校验方法 |
CN117076547B (zh) * | 2023-10-16 | 2024-01-02 | 江苏量界数据科技有限公司 | 基于虚拟分布式服务器的数据存储方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103345487A (zh) * | 2013-06-24 | 2013-10-09 | 北京奇虎科技有限公司 | 一种多平台之间数据一致性校验的方法和系统 |
CN103578030A (zh) * | 2013-10-31 | 2014-02-12 | 北京奇虎科技有限公司 | 一种数据处理方法和装置 |
CN104794138A (zh) * | 2014-01-22 | 2015-07-22 | 深圳市沃信科技有限公司 | 一种数据库交易结果确认方法、装置及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9898501B2 (en) * | 2013-09-12 | 2018-02-20 | Neustar, Inc. | Method and system for performing transactional updates in a key-value store |
-
2015
- 2015-12-18 CN CN201510958780.5A patent/CN105653579B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103345487A (zh) * | 2013-06-24 | 2013-10-09 | 北京奇虎科技有限公司 | 一种多平台之间数据一致性校验的方法和系统 |
CN103578030A (zh) * | 2013-10-31 | 2014-02-12 | 北京奇虎科技有限公司 | 一种数据处理方法和装置 |
CN104794138A (zh) * | 2014-01-22 | 2015-07-22 | 深圳市沃信科技有限公司 | 一种数据库交易结果确认方法、装置及系统 |
Non-Patent Citations (1)
Title |
---|
分布式移动代理系统的事务管理及死锁检测研究;胡国玲;《微电子学与计算机》;20071031;第24卷(第10期);第146-149页 |
Also Published As
Publication number | Publication date |
---|---|
CN105653579A (zh) | 2016-06-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105653579B (zh) | 一种对分布式事务进行测试的方法和装置 | |
US20130132335A1 (en) | Updating method and system of application system database thereof | |
US10133767B1 (en) | Materialization strategies in journal-based databases | |
CN107153609B (zh) | 一种自动化测试方法和装置 | |
CN112307124B (zh) | 数据库同步验证方法、装置、设备及存储介质 | |
CN109446208A (zh) | 一种数据存储方法、计算机可读存储介质及服务器 | |
CN110134694A (zh) | 一种双活数据库中表数据的快速比对装置及方法 | |
CN112905437A (zh) | 一种测试用例的方法、装置及存储介质 | |
CN107704568A (zh) | 一种测试数据添加的方法及装置 | |
Grov et al. | Increasing consistency in multi-site data stores: Megastore-CGC and its formal analysis | |
CN109743233A (zh) | 一种对强身份认证系统进行数据采集的方法及计算机设备 | |
CN107395623A (zh) | 接口访问数据验证方法及装置、计算机存储介质和设备 | |
CN111694851B (zh) | 分布式事务的交易处理方法及相关设备 | |
US9081772B1 (en) | Method and apparatus for acid validation within a distributed relational database under controlled concurrent workloads | |
Wang et al. | Application of model-based testing on a quorum-based distributed storage | |
CN114925639A (zh) | 一种soc芯片仿真验证数据一致性的检测方法 | |
US20230068551A1 (en) | Transaction Validator | |
CN113238950A (zh) | 一种分布式系统测试的系统及方法、存储介质、电子设备 | |
AU2019222794A1 (en) | Method and system for testing and validation of cryptographic algorithms | |
CN111090420A (zh) | 基于任务功能线的软件项目管理方法及系统 | |
CN110609790A (zh) | 解析程序测试方法、装置、介质和计算机设备 | |
Herle | IRON: Internalizing Real-time Ordering to Verify Strictly Serializable Databases | |
CN117473918B (zh) | 一种动态构建验证环境的方法、电子设备及存储介质 | |
CN113238966B (zh) | 报表平台前端测试方法、装置、设备及存储介质 | |
Harȩ̇zlak et al. | Extension of the MOODLE e-learning platform with database management mechanisms |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |