CN111897742B - 生成智能合约测试案例的方法和装置 - Google Patents
生成智能合约测试案例的方法和装置 Download PDFInfo
- Publication number
- CN111897742B CN111897742B CN202011054152.1A CN202011054152A CN111897742B CN 111897742 B CN111897742 B CN 111897742B CN 202011054152 A CN202011054152 A CN 202011054152A CN 111897742 B CN111897742 B CN 111897742B
- Authority
- CN
- China
- Prior art keywords
- parameter
- mutated
- data
- structural
- test case
- 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/3684—Test management for test design, e.g. generating new test cases
-
- 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/3688—Test management for test execution, e.g. scheduling of test suites
-
- 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/3692—Test management for test results analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06Q—INFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
- G06Q40/00—Finance; Insurance; Tax strategies; Processing of corporate or income taxes
- G06Q40/04—Trading; Exchange, e.g. stocks, commodities, derivatives or currency exchange
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/32—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials
- H04L9/3236—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials using cryptographic hash functions
- H04L9/3239—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols including means for verifying the identity or authority of a user of the system or for message authentication, e.g. authorization, entity authentication, data integrity or data verification, non-repudiation, key authentication or verification of credentials using cryptographic hash functions involving non-keyed hash functions, e.g. modification detection codes [MDCs], MD5, SHA or RIPEMD
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L9/00—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
- H04L9/50—Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols using hash chains, e.g. blockchains or hash trees
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Business, Economics & Management (AREA)
- Computer Security & Cryptography (AREA)
- Signal Processing (AREA)
- Computer Networks & Wireless Communication (AREA)
- Accounting & Taxation (AREA)
- Finance (AREA)
- Development Economics (AREA)
- Economics (AREA)
- Marketing (AREA)
- Strategic Management (AREA)
- Technology Law (AREA)
- General Business, Economics & Management (AREA)
- Debugging And Monitoring (AREA)
Abstract
本说明书实施例提供一种生成智能合约测试案例的方法和装置,该方法包括:首先从当前的测试案例中选取至少一个待变异结构化参数,并保证所选出的待变异结构化参数能够被待测试智能合约中的至少一个接口识别;接着针对每一个待变异结构化参数,得到该待变异结构化参数对应的参数结构;接着针对每一个待变异结构化参数,根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,获得变异后结构化参数;接着生成包括有各变异后结构化参数的测试案例,作为输入待测试智能合约的测试案例。
Description
技术领域
本说明书一个或多个实施例涉及区块链技术领域,尤其涉及用于对区块链系统中智能合约进行测试的测试案例的生成方法和装置。
背景技术
区块链系统中的智能合约是一套以数字形式定义的承诺,其中包括了合约参与方执行所定义承诺的协议,通过智能合约可以在没有中心化第三方介入的情况下自动使互不信任的参与方实现约定的协议。智能合约对于区块链系统的参与方来说是完全透明的,而且一旦部署很难被更改,为此在智能合约部署之前需要对智能合约进行测试,以确保所部署智能合约的安全性和正确性。
在对智能合约进行测试时,需要生成一系列测试案例作为智能合约的输入,使得智能合约在执行各测试案例时能够覆盖到不同的程序路径,以对智能合约进行较全面的测试。由于智能合约上的接口仅能解析具有特定格式的数据,所以难以高效地生成能够被智能合约解析的测试案例。
因此,希望能有改进的方案,可以更高效的生成能够通过智能合约数据解析的测试案例。
发明内容
本说明书一个或多个实施例描述了一种生成智能合约测试案例的方法和装置,能够更高效地生成能够通过智能合约数据解析的测试案例。
第一方面,本说明书提供了一种生成智能合约测试案例的方法,包括:
针对当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数,其中,所述待变异结构化参数能够被待测试智能合约中的至少一个接口识别;
针对每一个所述待变异结构化参数,得到该待变异结构化参数对应的参数结构,其中,所述参数结构通过对预先构建的样本结构化参数进行分析而确定,且所述样本结构化参数能够被所述待测试智能合约中的至少一个接口识别;
针对每一个所述待变异结构化参数,根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,获得变异后结构化参数;
生成包括各所述变异后结构化参数的测试案例,并将该测试案例作为输入所述待测试智能合约的测试案例。
一种可能的实施方式,每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的数据类型,在这样情况下,所述根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,包括:
从该待变异结构化参数包括的各原始类型数据中选取至少一个待变异原始类型数据;
根据该待变异结构化参数对应的参数结构确定每个所述待变异原始类型数据的数据类型;
根据每个所述待变异原始类型数据的数据类型,对该待变异原始类型数据进行参数值变异,以改变该待变异结构化参数的参数值。
一种可能的实施方式,所述根据每个所述待变异原始类型数据的数据类型,对该待变异原始类型数据进行参数值变异,包括:
如果一个所述待变异原始类型数据的数据类型为未限制长度的数据类型,则对该待变异原始类型数据执行修改字节值、删除字节、插入字节和对字节进行移位中的至少一项;
如果一个所述待变异原始类型数据的数据类型为限制长度的数据类型,则对该待变异原始类型数据执行修改字节值和对字节进行位移中的至少一项。
一种可能的实施方式,所述未限制长度的数据类型包括:字符串类型;所述限制长度的数据类型包括:64位整数类型或者256位Hash类型。
一种可能的实施方式,每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置,在这种情况下,所述根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,包括:
根据所述参数结构包括的原始类型数据的起始位置或结束位置,确定该待变异结构化参数中每个原始类型数据的起始位置或结束位置;
在该待变异结构化参数包括的至少一个原始类型数据的起始位置之前或结束位置之后,新增至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,每个结构化参数包括至少两个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置,在这种情况下,所述根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,包括:
根据所述参数结构包括的原始类型数据的起始位置或结束位置,确定该待变异结构化参数中每个原始类型数据的起始位置或结束位置;
根据待变异结构化参数中每个原始类型数据的起始位置或结束位置,删除其中的至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,每个结构化参数包括至少两个原始类型数据,且所述参数结构包括各原始类型数据之间的顺序,在这种情况下,所述根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,包括:
根据该待变异结构化参数对应的参数结构,确定该待变异结构化参数中各原始类型数据之间的顺序;
改变该待变异结构化参数中的各原始类型数据在该待变异结构化参数中的顺序,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,在所述针对当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数之前,进一步包括:
将此前已被所述待测试智能合约执行过的一个测试案例确定为所述当前的测试案例。
一种可能的实施方式,在所述针对当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数之前,进一步包括:
将人工生成的一个测试案例确定为所述当前的测试案例。
一种可能的实施方式,所述将此前已被所述待测试智能合约执行过的一个测试案例确定为所述当前的测试案例,包括:
将上一次输入所述待测试智能合约的测试案例确定为第一测试案例;
判断所述待测试智能合约执行所述第一测试案例时是否覆盖到了新的程序路径;
如果是,则将所述第一测试案例确定为所述当前的测试案例;
如果否,则将第二测试案例确定为所述当前的测试案例,其中,所述第二测试案例满足:已被输入所述待测试智能合约,且所述第一测试案例是通过对所述第二测试案例中的结构化参数进行变异而获得的。
第二方面,本说明书还提供了一种生成智能合约测试案例的装置,包括:
参数选取单元,配置为针对当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数,其中,所述待变异结构化参数能够被待测试智能合约中的至少一个接口识别;
结构识别单元,配置为针对所述参数选取单元选取出的每一个所述待变异结构化参数,得到该待变异结构化参数对应的参数结构,其中,所述参数结构通过对预先构建的样本结构化参数进行分析而确定,且所述样本结构化参数能够被所述待测试智能合约中的至少一个接口识别;
参数变异单元,配置为针对每一个所述待变异结构化参数,根据所述结构识别单元得到的该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,获得变异后结构化参数;
案例生成单元,用于生成包括所述参数变异单元所获得的各所述变异后结构化参数的测试案例,并将该测试案例作为输入所述待测试智能合约的测试案例。
一种可能的实施方式,每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的数据类型,在这种情况下,所述参数变异单元包括:
数据选择子单元,配置为从一个待变异结构化参数包括的各原始类型数据中选取至少一个待变异原始类型数据;
类型识别子单元,配置为根据一个待变异结构化参数对应的参数结构,确定所述数据选择子单元选取的每个所述待变异原始类型数据的数据类型;
第一变异子单元,配置为根据所述类型识别子单元确定出的每个所述待变异原始类型数据的数据类型,对该待变异原始类型数据进行参数值变异,以改变该待变异原始类型数据所在的待变异结构化参数的参数值。
一种可能的实施方式,所述第一变异子单元配置为针对每一个所述待变异原始类型数据,如果该待变异原始类型数据的数据类型为未限制长度的数据类型,则对该待变异原始类型数据执行修改字节值、删除字节、插入字节和对字节进行移位中的至少一项,如果该待变异原始类型数据的数据类型为限制长度的数据类型,则对该待变异原始类型数据执行修改字节值和对字节进行移位中的至少一项。
一种可能的实施方式,所述未限制长度的数据类型包括:字符串类型;所述限制长度的数据类型包括:64位整数类型或者256位Hash类型。
一种可能的实施方式,每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置,在这种情况下,所述参数变异单元包括:
第一位置识别子单元,配置为根据所述参数结构包括的至少一个原始类型数据的起始位置或结束位置,确定一个所述待变异结构化参数中每个原始类型数据的起始位置或结束位置;
数据新增子单元,配置为针对一个所述待变异结构化参数,根据所述第一位置识别子单元确定的该待变异结构化参数中每个原始类型数据的起始位置或结束位置,在该待变异结构化参数包括的至少一个原始类型数据的起始位置之前或结束位置之后,新增至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,每个结构化参数包括至少两个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置,在这种情况下,所述参数变异单元包括:
第二位置识别子单元,配置为根据所述参数结构包括的原始类型数据的起始位置或结束位置,确定一个所述待变异结构化参数中每个原始类型数据的起始位置或结束位置;
数据删除子单元,配置为针对一个所述待变异结构化参数,根据所述第二位置识别子单元确定的该待变异结构化参数中每个原始类型数据的起始位置或结束位置,删除该待变异结构化参数中的至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,每个结构化参数包括至少两个原始类型数据,且所述参数结构包括各原始类型数据之间的顺序,在这种情况下,所述参数变异单元包括:
顺序识别子单元,配置为根据一个所述待变异结构化参数对应的参数结构,确定该待变异结构化参数中各原始类型数据之间的顺序;
数据调序子单元,配置为针对一个所述待变异结构化参数,根据所述顺序识别子单元确定出的该待变异结构化参数中各原始类型数据之间的顺序,改变该待变异结构化参数中的各原始类型数据在该待变异结构化参数中的顺序,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,该生成智能合约测试案例的装置进一步包括:
第一案例获取单元,配置为将此前已被所述待测试智能合约执行过的一个测试案例确定为所述当前的测试案例。
一种可能的实施方式,该生成智能合约测试案例的装置进一步包括:
第二案例获取单元,配置为将人工生成的一个测试案例确定为所述当前的测试案例。
一种可能的实施方式,所述第一案例获取单元配置为将将上一次输入所述待测试智能合约的测试案例确定为第一测试案例,并判断所述待测试智能合约执行所述第一测试案例时是否覆盖到了新的程序路径,如果是,则将所述第一测试案例确定为所述当前的测试案例,否则将第二测试案例确定为所述当前的测试案例,其中,所述第二测试案例满足:已被输入所述待测试智能合约,且所述第一测试案例是通过对所述第二测试案例中的结构化参数进行变异而获得的。
第三方面,本说明书提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述第一方面以及第一方面的任一可能的实施方式所提供的方法。
第四方面,本说明书提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述第一方面以及第一方面的任一可能的实施方式所提供的方法。
根据本说明书实施例提供的生成智能合约测试案例的方法和装置,一方面,在得到待变异结构化参数的参数结构后,根据参数结构对待变异结构化参数进行变异获得变异后结构化参数,进而得到包括有变异后结构化参数的测试案例,保证所生成测试案例能够通过待测试智能合约的解析而被待测试智能合约执行,进而覆盖到待测试智能合约更深处的程序路径,以提高对待测试智能合约进行测试的效率。
附图说明
为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本说明书一个实施例提供的一个实施场景的示意图;
图2是本说明书一个实施例提供的一种生成智能合约测试案例的方法的流程图;
图3是本说明书一个实施例提供的一种参数结构模板的示意图;
图4是本说明书一个实施例提供的另一个实施场景的示意图;
图5是本说明书一个实施例提供的一种生成智能合约测试案例的装置的示意图;
图6是本说明书一个实施例提供的另一种生成智能合约测试案例的装置的示意图;
图7是本说明书一个实施例提供的一种包括数据新增子单元的生成智能合约测试案例的装置的示意图;
图8是本说明书一个实施例提供的一种包括数据删除子单元的生成智能合约测试案例的装置的示意图;
图9是本说明书一个实施例提供的一种包括数据调序子单元的生成智能合约测试案例的装置的示意图;
图10是本说明书一个实施例提供的又一种生成智能合约测试案例的装置的示意图;
图11是本说明书一个实施例提供的再一种生成智能合约测试案例的装置的示意图。
具体实施方式
如前所述,为了保证部署到区块链系统中智能合约的正确性,在将智能合约部署到区块链系统上之前需要对智能合约进行测试。对智能合约进行测试的基本思想为生成一系列模拟智能合约实际使用过程中作为输入的测试案例,将所生成的测试案例输入智能合约后,获取智能合约的执行动作或输出结果,进而根据所输入测试案例与所获得执行动作或输出结果之间的匹配性来确定智能合约是否存在错误。
但是,智能合约的接口参数通常被设计成可序列化的复杂数据结构,以便于区块链系统中不同节点之间的数据传输。用于对智能合约进行测试的测试案例包括有一个或多个结构化参数,测试案例被智能合约执行时每一个结构化参数调用智能合约上的一个接口,结构化参数的参数结构需要满足其所调用接口的接口参数才能够被其所调用的接口识别,在采用诸如随机删除字节、重复字节、插入字节、左移字节和右移字节等简单随机变异策略生成测试案例时,所生成的大部分测试案例由于其中结构化参数的参数结构不满足相应的接口参数而无法被智能合约解析,而无法被智能合约解析的测试案例不能被智能合约进一步执行而覆盖智能合约中更深处的程序路径,因此会影响对智能合约进行测试的效率。
为了高效的生成能够被智能合约解析的测试案例,根据本说明书实施例的构思,由于测试案例由一个或多个结构化参数构成,而结构化参数用于调用智能合约中的接口,如果一个结构化参数能够被智能合约上的接口识别,那么根据该结构化参数的参数结构对该结构化参数进行变异所获得的变异后结构化参数也能够被智能合约上的接口识别,从而可以生成包括有变异后结构化参数的测试案例,保证所生成的测试案例能够被智能合约执行而覆盖到智能合约更深处的程序路径,从而能够提高对智能合约进行测试的效率。
图1为本说明书披露的一个实施例的实施场景示意图。如图1所示,针对当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数,并保证所选取的待变异结构化参数能够被待测试智能合约中的至少一个接口识别,在确定出每个待变异结构化参数的参数结构后,根据每一个待变异结构化参数的参数结构对该待变异结构化参数进行变异,获得相应的变异后结构化参数,进而生成包括有各变异后结构化参数的下一个测试案例,所生成的测试案例会被输入待测试智能合约以对待测试智能合约进行测试。由于待变异结构化参数能够被待测试智能合约中的至少一个接口识别,而变异后结构化参数与相应待变异结构化参数具有相同的参数结构,因此变异后结构化参数也能够被待测试智能合约中的至少一个接口识别,从而所生成的包括有各变异后结构化参数的测试案例能够被待测试智能合约执行而覆盖到待测试智能合约更深处的程序路径,从而可以提高对待测试智能合约进行测试的效率。下面描述智能合约测试案例生成的具体实现过程。
图2示出一个实施例的生成智能合约测试案例的方法。可以理解,该方法可以通过任何具有计算、处理能力的装置、设备、平台和设备集群来执行。如图2所示,该生成智能合约测试案例的方法可以包括以下步骤:
步骤22:针对当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数,其中,待变异结构化参数能够被待测试智能合约中的至少一个接口识别;
步骤24:针对每一个待变异结构化参数,得到该待变异结构化参数对应的参数结构,其中,参数结构通过对预先构建的样本结构化参数进行分析而确定,且样本结构化参数能够被待测试智能合约中的至少一个接口识别;
步骤26:针对每一个待变异结构化参数,根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,获得变异后结构化参数;
步骤28:生成包括各变异后结构化参数的测试案例,并将该测试案例作为输入待测试智能合约的测试案例。
在该实施例中,针对当前的一个测试案例,从该测试案例所包括的各结构化参数中选取一个或多个待变异结构化参数,并保证所选取的待变异结构化参数能够被待测试智能合约中的接口识别,之后根据待变异结构化参数的参数结构对待变异结构化参数进行变异而获得变异后结构化参数,使得变异后结构化参数与相对应的待变异结构化参数具有相同的参数结构,进而生成包括有各变异后结构化参数的测试案例作为输入待测试智能合约的测试案例。由于变异后结构化参数与相应待变异结构化参数具有相同的参数结构,而待变异结构化参数能够被待测试智能合约上的接口识别,所以变异后结构化参数也能够被待测试智能合约上的接口识别,从而所生成的测试案例能够被待测试智能合约执行而覆盖到待测试智能合约更深处的程序路径,以提高对待测试智能合约进行测试的效率。
在步骤22,从当前的测试案例所包括的各结构化参数中选取待变异结构化参数,并保证所选取的待变异结构化参数能够被待测试智能合约行的接口识别。可以理解,待测试智能合约包括有至少一个接口,所筛选出的每个待变异结构化参数均能够被待测试智能合约包括的至少一个接口识别,而且当前的测试案例包括有至少一个结构化参数,优选的是当前的测试案例所包括的每个结构化参数均能够被待测试智能合约上的至少一个接口识别。
由于测试案例中的每个结构化参数用于调用待测试智能合约上的一个接口,不同的结构化参数可能用于调用待测试智能合约上的同一个接口,如果当前的测试案例包括的每个结构化参数均能够被待测试智能合约上的至少一个接口识别,在基于当前的测试案例生成新的测试案例时,具有较多可被选取的待变异结构化参数,从而能够生成多个不同的测试案例。
更进一步地,当前的测试案例包括的每个结构化参数均能够被该结构化参数所调用的接口识别,这样当前的测试案例本身就能够被待测试智能合约完全解析并执行,进而基于当前的测试案例生成的新的测试案例也能够被待测试智能合约完全解析并执行,以增加单个测试案例所能够覆盖的程序路径,从而进一步提高对智能合约进行测试的效率。
在步骤24,针对所选取出的每一个待变异结构化参数,得到该待变异结构化参数的参数结构,以便后续根据参数结构对相应待变异结构化参数进行变异,使得变异后结构化参数与相对应的待变异结构化参数具有相同的参数结构,进而保证所获得的变异后结构化参数能够被待测试智能合约中的接口识别。
具体地,针对当前的测试案例,该测试案例包括至少一个结构化参数,而且该测试案例所包括的结构化参数可以是预先构建的样本结构化参数,也可以是由样本结构化参数变异而来的结构化参数,其中由样本结构化参数变异而来的结构化参数是指对样本结构化参数进行一次或多次变异而得到的结构化参数。样本结构化参数能够被待测试智能合约中的至少一个接口识别。在通过对结构化参数进行变异生成测试案例的过程中,待变异结构化参数与变异后结构化参数具有相同的参数结构,因此由样本结构化参数变异来的结构化参数由于与样本结构化参数具有相同的参数结构,所以由样本结构化参数变异来的结构化参数也能够被待测试智能合约中的至少一个接口识别。
由于当前的测试案例中的结构化参数为样本结构化参数或由样本结构化参数变异而来的结构化参数,所以所选取的每个待变异结构化参数与至少一个样本结构化参数具有相同的参数结构,因此可以根据样本结构化参数的参数结构来确定待变异结构化参数的参数结构,而样本结构化参数的参数结构可以通过对样本结构化参数进行结构分析而确定。通过样本结构化参数的参数结构确定待变异结构化参数的参数结构,不需要在每次生成新的测试案例时都对待变异结构化参数进行结构分析,从而能够提高生成测试案例的效率。
在构建样本结构化参数时,可以分别针对待测试智能合约上每一个接口,根据该接口的接口参数,构建一个或多个能够被该接口所识别的样本结构化参数。或者,可以针对待测试智能合约构建一个初始测试案例,初始测试案例包括有至少一个样本结构化参数,每个样本结构化参数均能够被待测试智能合约中的至少一个接口识别,即每个样本结构化参数均符合待测试智能合约上至少一个接口的复杂数据结构。在通过构建初始测试案例而获得样本结构化参数时,为了保证待测试智能合约中的每个接口均具有被所生成测试案例调用的机会,针对待测试智能合约包括的每一个接口,初始测试案例中包括有至少一个可以被该接口识别的样本结构化参数。
例如,初始测试案例包括有样本结构化参数1、样本结构化参数2和样本结构化参数3,待测试智能合约包括有接口1、接口2和接口3,而样本结构化参数1能够被接口1识别,样本结构化参数2能够被接口1和接口2识别,样本结构化参数3能够被接口2和接口3识别。从当前的测试案例选取出待变异结构化参数1和待变异结构化参数2,待变异结构化参数1就是样本结构化参数1,待变异结构化参数2是由样本结构化参数2变异而来的结构化参数。因此,在确定待变异结构化参数的参数结构时,确定待变异结构化参数1与样本结构化参数1具有相同的参数结构,确定待变异结构化参数2与样本结构化参数2具有相同的参数结构。
在步骤28,生成包括各变异后结构化参数的测试案例,并将所生成的测试案例作为输入待测试智能合约的测试案例。在对一个测试案例进行变异获得新的测试案例时,通常不会对该测试案例所包括的全部结构化参数进行变异,而只会选择其中的一个或多个结构化参数作为待变异结构化参数,因此生成的新的测试案例通常情况下也不仅仅包括各变异后结构化参数。为此,可以生成包括各变异后结构化参数以及当前的测试案例中未被选中作为待变异结构化参数的结构化参数的测试案例,作为输入待测试智能合约的测试案例。
例如,当前的测试案例包括结构化参数1、结构化参数2和结构化参数3,其中结构化参数1被选中作为待变异结构化参数,通过对结构化参数1进行变异获得结构化参数,进而生成包括结构化参数、结构化参数2和结构化参数3的测试案例,作为输入待测试智能合约的测试案例。
另外,在生成包括各变异后结构化参数的测试案例时,除了可以将当前的测试案例中未被选中作为待变异结构化参数的全部结构化参数包括在所生成的测试案例中之外,所生成的测试案例还可以仅包括当前的测试案例中未被选中作为待变异结构化参数的部分结构化参数,或者所生成的测试案例还可以包括除变异后结构化参数和当前的测试案例中结构化参数之外的其他结构化参数,但需要保证所生成的测试案例中各结构化参数均能够被待测试智能合约上的至少一个接口识别。
在一个实施例中,步骤26根据一个待变异结构化参数的参数结构对该待变异结构化参数进行变异,获得相对应的变异后结构化参数,其中对待变异结构化参数进行的变异可以包括如下两种变异形式中的至少一个:
变异形式一:对待变异结构化参数进行参数值变异,以改变待变异结构化参数的参数值;
变异形式二:对待变异结构化参数进行参数结构变异,以改变待变异结构化参数的参数结构。
下面对上述两种变异形式进行分别说明。
针对变异形式一:
当一个待变异结构化参数包括有至少一个原始类型数据,且该待变异结构化参数的参数结构用于表征该待变异结构化参数中每个原始类型数据的数据类型时,可以从该待变异结构化参数包括的各原始类型数据中选取至少一个待变异原始类型数据,之后根据该待变异结构化参数的参数结构确定每个待变异原始类型数据的数据类型,进而根据每个待变异原始类型数据的数据类型对该待变异原始类型数据进行参数值变异,从而改变整个待变异结构化参数的参数值,获得与待变异结构化参数不同的变异后结构化参数。
每个测试案例包括有一个或多个结构化参数,每个结构化参数包括有一个或多个原始类型数据,每个原始类型数据由具体的参数值构成。每个结构化参数用于调用待测试智能合约中的一个接口,同一结构化参数中不同的原始类型数据可以具有相同或不同的数据类型。
一个结构化参数的参数结构可以用于表征该结构化参数中每个原始类型数据的数据类型,数据类型定义了原始类型数据的数据结构类型,而且数据类型还可以定义原始类型数据所包括字节的位数。原始类型数据的数据结构类型可以是整数类型、浮点类型、字符串类型或者布尔类型,原始类型数据所包括字节的位数可以是固定位数或任意位数,因此原始类型数据的数据类型定义了原始类型数据的数据结构类型和字节位数中的一个或全部。例如,一个结构化参数的参数结构表征该结构化参数包括有原始类型数据1、原始类型数据2和原始类型数据3,原始类型数据1的数据类型为64位整数类型,原始类型数据2的数据类型为256位hash类型,原始类型数据3的数据类型为字符串类型。
由于待变异结构化参数能够被待测试智能合约中至少一个接口识别,因此待变异结构化参数的参数结构与待测试智能合约中相应接口的复杂数据结构相对应,满足参数结构的结构化参数便能够通过待测试智能合约的数据解析而调用相应的接口,进而被待测试智能合约执行而覆盖待测试智能合约更深处的程序路径。
在对一个待变异结构化参数进行变异时,可以仅对该待变异结构化参数中的一个原始类型数据进行参数值变异,也可以对该待变异结构化参数中的多个原始类型数据同时进行参数值变异。对一个待变异结构化参数进行变异时所涉及原始类型数据的个数,可以通过预先设定变异策略进行定义,比如在每次对一个待变异结构化参数进行变异时仅对该待变异结构化参数中的一个原始类型数据进行参数值变异。
进一步地,在对一个待变异原始类型数据进行参数值变异时,如果数据结构仅定义了该待变异原始类型数据的数据结构类型,即该待变异原始类型数据的数据类型为未限制长度的数据类型时,则可以对该待变异原始类型数据执行修改字节值、删除字节、插入字节和对字节进行移位中的至少一项,以实现对该待变异原始类型数据的参数值变异;如果数据结构定义了该待变异原始类型数据的数据结构类型和所包括字节的位数,即该待变异原始类型数据的数据类型为限制长度的数据类型时,则可以对该待变异原始类型数据执行修改字节值和对字节进行移位中的至少一项,以实现对该待变异原始类型数据的参数值变异。
修改字节值是指对某个字节的值进行修改,比如将待变异原始类型数据中某个字节的值由1修改为0。对字节进行移位是指将待变异原始类型数据中的某个字节向左或向右移动一个或多个字节位。另外,在对待变异原始类型数据中进行参数值变异时,可以随机选择待变异原始类型数据中的某个字节进行字节修改、删除字节、插入字节或对字节进行移位,也可以根据预先设定的变异策略顺次选择待变异原始类型数据中的字节进行字节修改、删除字节、插入字节或对字节进行移位。
可以理解,当采用插入字节的方式对一个待变异原始类型数据进行参数值变异时,可以复制该待变异原始类型数据中的一个或多个字节插入到该待变异原始类型数据中的相应位置,这样可以避免所插入节点由于取值超过可识别取值范围而导致变异后原始类型数据无法被待测试智能合约所识别的情况发生,从而可以进一步提高生成有效测试案例的效率。
在对一个待变异原始类型数据进行参数值变异时,根据参数结构中该待变异原始类型数据的数据类型对该待变异原始类型数据进行参数值变异,保证变异所获得的新的原始类型数据与该待变异原始类型数据具有相同的数据类型,从而保证所生成变异后结构化参数仍能够被待测试智能合约中相应的接口所识别,保证所生成的每一个测试案例均能够覆盖到待测试智能合约中较深处的程序路径,而并不是仅覆盖待测试智能合约中最浅处用于对输入数据进行解析校验的程序路径。
针对变异形式二:
通过对待变异结构化参数进行参数结构变异,生成与待变异结构化参数所描述内容不同的变异后结构化参数,变异后结构化参数输入待测试智能合约后可能会覆盖到待测试智能合约中新的程序路径。对待变异结构化参数进行参数结构变异主要包括如下三种结构变异方式:
结构变异方式一:在待变异结构化参数中新增至少一个原始类型数据;
结构变异方式二:从待变异结构化参数中删除至少一个原始类型数据;
结构变异方式三:改变待变异结构化参数中各原始类型数据的顺序。
针对上述结构变异方式一,其前提为待变异结构化参数包括至少一个原始类型数据,而且一个待变异结构化参数的参数结构用于表征该待变异结构化参数中各原始类型数据的起始位置或结束位置。在对一个待变异结构化参数进行参数结构变异时,首先根据该待变异结构化参数的参数结构确定该待变异结构化参数中每个原始类型数据的起始位置或结束位置,之后在该待变异结构化参数包括的至少一个原始类型数据的起始位置之前或结束位置之后,新增至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
例如,一个待变异结构化参数的结构形式为原始类型数据1-原始类型数据2-原始类型数据3,在根据该待变异结构化参数的参数结构确定出原始类型数据1、原始类型数据2和原始类型数据3的起始位置或结束位置后,在原始类型数据2的起始位置之前新增一个原始类型数据4,生成形如原始类型数据1-原始类型数据4-原始类型数据2-原始类型数据3的变异后结构化参数。
再例如,待变异结构化参数的结构形式为原始类型数据1-原始类型数据2-原始类型数据3,在根据该待变异结构化参数的参数结构确定出原始类型数据1、原始类型数据2和原始类型数据3的起始位置或结束位置后,在原始类型数据3的起始位置之前新增一个原始类型数据5,并在原始类型数据3的结束位置之后新增一个原始类型数据6,生成形如原始类型数据1-原始类型数据2-原始类型数据5-原始类型数据3-原始类型数据6的变异后结构化参数。
可以理解,当采用新增原始类型数据的方式对待变异结构化参数进行参数结构变异时,可以复制该待变异结构化参数中的一个或多个原始类型数据到该待变异结构化参数中的相应位置,这样可以避免随机生成的原始类型数据由于参数类型无法被待测试智能合约所识别而导致生成的变异后结构化参数无法调用相应接口的情况发送,从而可以保证通过参数结构变异所生成的测试案例能够被待测试智能合约执行。
针对上述结构变异方式二,其前提为待变异结构化参数包括至少两个原始类型数据,而且一个待变异结构化参数的参数结构用于表征该待变异结构化参数中各原始类型数据的起始位置或结束位置。在对一个待变异结构化参数进行参数结构变异时,首先根据该待变异结构化参数的参数结构确定该待变异结构化参数中每个原始类型数据的起始位置或结束位置,之后根据该待变异结构化参数中各原始类型数据的起始位置或结束位置,删除其中至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
例如,一个待变异结构化参数的结构形式为原始类型数据1-原始类型数据2-原始类型数据3,在根据该待变异结构化参数的参数结构确定出原始类型数据1、原始类型数据2和原始类型数据3的起始位置或结束位置后,将原始类型数据2删除,生成形如原始类型数据1-原始类型数据3的变异后结构化参数。
针对上述结构变异方式三,由于包括原始类型数据相同但各原始类型数据顺序不同的结构化参数所描述的内容不同,所以智能合约在执行所包括原始类型数据顺序不同的结构化参数时所覆盖的程序路径不同。比如,结构化参数A和结构化参数B均包括原始类型数据1至原始类型数据3,但结构化参数A中3个原始类型数据的排序为原始类型数据1-原始类型数据2-原始类型数据3,而结构化参数B中3个原始类型数据的排序为原始类型数据3-原始类型数据2-原始类型数据1。
上述结构变异方式三的前提为待变异结构化参数包括至少两个原始类型数据,而且一个待变异结构化参数的参数结构用于表征该待变异结构化参数中各原始类型数据的顺序。在对一个待变异结构化参数进行参数结构变异时,首先根据该待变异结构化参数的参数结构,可以确定该待变异结构化参数中各原始类型数据之间的顺序,之后改变该待变异结构化参数中各原始类型数据在该待变异结构化参数中的顺序,以改变该待变异结构化参数的参数结构。
例如,一个待变异结构化参数的结构形式为原始类型数据1-原始类型数据2-原始类型数据3,在根据该待变异结构化参数的参数结构确定出原始类型数据1、原始类型数据2和原始类型数据3的顺序后,调换该待变异结构化参数中原始类型数据1和原始类型数据3之间的位置,生成形如原始类型数据3-原始类型数据2-原始类型数据1的变异后结构化参数。
综上所述,在对待变异结构化参数进行参数结构变异时,可以对待变异结构化参数执行新增原始类型数据、删除原始类型数据或者改变原始类型数据顺序中的至少一项。在对一个待变异结构化参数进行参数结构变异时,可以随机的在该待变异结构化参数中新增原始类型数据、删除原始类型数据或改变各原始类型数据的顺序,也可以根据预先设定的变异策略按照顺序对该待变异结构化参数中各原始类型数据进行删除、插入或变换顺序。
在对一个待变异结构化参数进行参数结构变异时,根据该待变异结构化参数的参数结构,对该待变异结构化参数中原始类型数据的数量和顺序进行变异生成变异后结构化参数,进而能够生成包括有不同结构化参数的测试案例,但测试案例中结构化参数所包括的原始类型数据仍能够被待测试智能合约的接口所识别,从而能够生成可能会覆盖到待测试智能合约中新的程序路径的测试案例,在保证所生成测试案例能够被待测试智能合约执行的前提下,可以进一步提高对待测试智能合约进行测试的全面性。
另外,根据上述对待变异结构化参数进行参数值变异和参数结构变异的说明,参数结构不仅可以表征结构化参数中原始类型数据的数据类型,还可以表征结构化参数中各原始类型数据的顺序以及各原始类型数据的起始位置或结束位置。结构化参数的参数结构可以通过呈树状结构的参数结构模板进行表示,参数结构模板包括至少一个参数结构节点,各参数结构节点构成树状结构,树状结构中每一个上层的参数结构节点包括至少一个下层的参数结构节点或至少一个原始类型数据。
参数结构模板呈树状结构,树状结构的参数结构模板包括有多个层级,最底层为原始类型数据,除最底层外其他各层级包括有至少一个参数结构节点,位于上层级的每个参数结构节点包括至少一个下层的参数结构节点或至少一个原始类型数据,最顶层的参数结构节点表征相应结构化参数的类型名。在对一个结构化参数进行参数结构变异时,从该结构化参数所对应的参数结构模板中选择一个或多个参数结构节点进行删除、插入或变换排序,从而可以实现对单一原始类型数据或多个原始类型数据的组合进行参数结构变异,使得对结构化参数的参数结构变异更加多样,一方面可以满足不同用户的个性化需求,另一方面还可以提高通过参数结构变异生成测试案例的效率。
图3示出了一种呈树状结构的参数结构模板,该参数结构模板的根节点为参数根类型R,用于表征相应结构化参数的类型名,子节点为参数子类型T1和参数子类型T2,用于表征其父类节点的成员类型,叶节点为三个原始类型数据,64位整数类型的原始类型数据和256位Hash类型的原始类型数据为子节点参数子类型T1下的叶节点,字符串类型的原始类型数据为子节点参数子类型T2下的叶节点。
根据图3示出的参数结构模板,可以确定相应结构化参数包括三个原始类型数据,这三个原始类型数据的数据类型和字符长度分别为64位整数类型、256位Hash类型以及字符串类型,其中字符串类型的字符长度为任意长度。而且还可以确定三个原始类型数据的瞬息为64位整数类型-256位Hash类型-字符串类型。
根据上述实施例的说明,在对一个待变异结构化参数结构变异获得变异后结构化参数时,可以仅对该待变异结构化参数进行参数值变异、也可以仅对该待变异结构化参数进行参数结构变异,还可以同时对该待变异结构化参数进行参数值变异和参数结构变异。
在一个实施例中,在步骤22从结构化参数中选取待变异结构化参数之前,可以将此前已被待测试智能合约执行过的一个测试案例确定为当前的测试案例,也可以将人工生成的一个测试案例确定为当前的测试案例。
将此前已被待测试智能合约执行过的一个测试案例作为当前的测试案例,可以根据待测试智能合约执行此前测试案例时所覆盖到的程序路径来生成新的测试案例,有针对性的生成可能会覆盖到新的程序路径的测试案例,这不仅可以进一步提高对智能合约进行测试的效率,还能够实现待测试智能合约的全自动化测试,降低智能合约测试过程中测试人员的劳动强度。
将人工生成的测试案例确定为当前的测试案例,在测试案例生成开始时将人工生成的测试案例作为当前的测试案例,使得测试案例的生成过程能够顺序进行。在测试案例生成过程中将人工生成的测试案例作为当前的测试案例,可以针对待测试智能合约中未被覆盖到的程序路径人工生成测试案例作为当前的测试案例,进而在该测试案例的基础上变异出的测试案例能够更快地覆盖到待测试智能合约中此前未被覆盖到的程序路径,从而进一步提高对智能合约进行测试的效率。
进一步地,在将此前已被待测试智能合约执行过的一个测试案例确定为当前的测试案例时,首先将上一次输入待测值智能合约的测试案例确定为第一测试案例,然后判断待测试智能合约执行第一测试案例时是否覆盖到了新的程序路径,如果待测试智能合约执行第一测试案例时覆盖到了新的程序路径,则将第一测试案例确定为当前的测试案例,如果待测试智能合约执行第一测试案例时未覆盖到了新的程序路径,则将第二测试案例确定为当前的测试案例,其中第二测试案例为已被输入待测试智能合约,且第一测试案例是通过对第二测试案例进行变异而获得的测试案例。
待测试智能合约在执行一个测试案例后,会生成针对该测试案例的反馈信息,反馈信息包括了执行该测试案例过程中待测试智能合约的代码覆盖情况,比如是反馈信息可以是代码覆盖率信息,根据反馈信息确定待测试智能合约执行该测试案例时是否覆盖到了新的程序路径。如果待测试智能合约执行第一测试案例时覆盖到了新的程序路径,则可以对该第一测试案例进行再次变异,以尝试变异出可以覆盖到新的程序路径的测试案例,因此将该第一测试案例确定为当前的测试案例。如果待测试智能合约执行第一测试案例时未覆盖到新的程序路径,通过对该第一测试案例进行变异也难以生成可以覆盖到新的程序路径的测试案例,因此可以确定通过变异获得该第一测试案例时所使用的第二测试案例,并将第二测试案例确定为当前的测试案例,以在第二测试案例的基础上变异生成新的测试案例。
例如,通过对测试案例1进行变异而获得测试案例2,待测试智能合约执行测试案例2后获得待测试智能合约的反馈信息,如果根据反馈信息确定待测试智能合约执行测试案例2时覆盖到了新的程序路径,则将测试案例2确定为当前的测试案例,进而通过对测试案例2进行变异来获得新的测试案例,如果根据反馈信息确定待测试智能合约执行测试案例2时未覆盖到新的程序路径,则将测试案例1确定为当前的测试案例,进而通过对测试案例1进行再次变异获得新的测试案例,而且需要保证所对测试案例1进行再次变异获得的测试案例与测试案例2不同。
待测试智能合约执行完一个测试案例后,根据待测试智能合约的反馈信息,如果根据反馈信息确定执行该测试案例时覆盖到了新的程序路径,则通过对该测试案例进行变异而生成新的测试案例,如果根据反馈信息确定执行该测试案例未覆盖到新的程序路径,则对通过变异生成该测试案例时所使用的测试案例再次变异而生成新的测试案例,这样基于执行反馈确定通过变异生成测试案例时所使用的测试案例,可以更快的生成能够覆盖到新的程序路径的测试案例,从而可以提高对智能合约进行测试的效率。
可以理解,可以通过区块链执行引擎将所生成的测试案例输入待测试智能合约,并通过区块链执行引擎获得待测试智能合约的执行反馈(反馈信息),进而根据执行反馈再次生成新的测试案例。另外,可以在待测试智能合约中插桩,当待测试智能合约执行到一个插桩位置后该插桩的值被置为0或1,进而在待测试智能合约执行完一个测试案例后,根据被置为0或1的插桩的个数便可以确定哪些程序路径已被覆盖,即可以获得反馈信息。
在一个实施例中,可以获取初始测试案例,通过对初始测试案例进行解析,分别获取初始测试案例中每一个原始类型数据的值作为相应原始类型数据的用户字典,在对待测试结构化参数进行变异时,首先根据预先设定的参数值变异策略从当前的测试案例包括的各原始类型数据中确定至少一个待变异原始类型数据,之后针对所选取的每一个待变异原始类型数据,确定该待变异原始类型数据对应的用户字典,进而根据参数值变异策略对该待变异原始类型数据对应的用户字典执行修改字节值、删除字节、插入字节和对字节进行移位中的至少一项。
由于初始测试案例为能够被待测试智能合约正常执行的测试案例,因此初始测试案例中各原始类型数据的值也是能够被待测试智能合约所识别的正常数值,将初始测试案例中各原始类型数据的值作为相应原始类型数据的用户字典,后续在对原始类型数据进行参数值变异时,通过对相应原始类型数据对应的用户字典进行修改字节值、删除字节、插入字节和对字节进行移位中的至少一项实现参数值变异,保证了变异后原始类型数据的值仍能够被待测试智能合约所识别,从而提高生成有效测试案例的效率。
进一步地,结合前述实施例采用参数结构变异和参数值变异生成测试案例的方式,图4是本说明书披露了另一个实施例的实施场景示意图。如图4所示,由测试人员生成初始测试案例后,通过对初始测试案例进行解析,确定出初始测试案例中每一个结构化参数的参数结构,并将初始测试案例中每一个原始类型数据的值确定为用户字典,之后自动测试调度器根据所确定出的参数结构和用户字典,选择参数值变异和参数结构变异中的一个或多个对测试案例进行变异生成新的测试案例,并将所生成的新的测试案例作为合约输入传输给待测试智能合约。区块链执行引擎驱动待测试智能合约执行输入的测试案例,并将待测试智能合约给出的执行反馈传输给自动测试调度器,自动测试调度器再次按照上述方式对此前生成的测试案例进行变异而获得新的测试案例,重复上述过程直至对待测试智能合约的测试覆盖率达到预设值后,生成对待测试智能合约进行测试的测试报告。
回顾以上生成智能合约测试案例的过程,一方面,在得到待变异结构化参数的参数结构后,根据参数结构对待变异结构化参数进行变异获得变异后结构化参数,进而得到包括有变异后结构化参数的测试案例,保证所生成测试案例能够通过待测试智能合约的解析而被待测试智能合约执行,进而覆盖到待测试智能合约更深处的程序路径,以提高对待测试智能合约进行测试的效率。另一方面,中等粒度的参数结构变异用于对结构化参数中原始类型数据的数量和顺序进行变异,最细粒度的参数值变异用于对原始类型数据的值进行变异,通过以上两个粒度的变异方式的结合对测试案例进行变异而生成新的测试案例,保证所生成的测试案例符合待测试智能合约的业务逻辑,并且所生成的测试案例可以覆盖到待测试智能合约中更多的程序路径,从而可以提高对智能合约进行测试的全面性和效率。
另一方面的实施例,还提供了一种生成智能合约测试案例的装置。如图5示出一个实施例的生成智能合约测试案例的装置。可以理解,该装置可以通过任何具有计算、处理能力的装置、设备、平台和设备集群来实现。如图5所示,该装置50包括:
参数选取单元51,配置为针对当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数,其中,所述待变异结构化参数能够被待测试智能合约中的至少一个接口识别;
结构识别单元52,配置为针对所述参数选取单元51选取出的每一个所述待变异结构化参数,得到该待变异结构化参数对应的参数结构,其中,所述参数结构通过对预先构建的样本结构化参数进行分析而确定,且所述样本结构化参数能够被所述待测试智能合约中的至少一个接口识别;
参数变异单元53,配置为针对每一个所述待变异结构化参数,根据所述结构识别单元52得到的该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,获得变异后结构化参数;
案例生成单元54,用于生成包括所述参数变异单元53所获得的各所述变异后结构化参数的测试案例,并将该测试案例作为输入所述待测试智能合约的测试案例。
一种可能的实施方式,每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的数据类型。在这样的情况下,如图6所示,所述参数变异单元53包括:
数据选择子单元531,配置为从一个待变异结构化参数包括的各原始类型数据中选取至少一个待变异原始类型数据;
类型识别子单元532,配置为根据一个待变异结构化参数对应的参数结构,确定所述数据选择子单元531选取的每个所述待变异原始类型数据的数据类型;
第一变异子单元533,配置为根据所述类型识别子单元532确定出的每个所述待变异原始类型数据的数据类型,对该待变异原始类型数据进行参数值变异,以改变该待变异原始类型数据所在的待变异结构化参数的参数值。
进一步地,第一变异子单元533配置为针对每一个所述待变异原始类型数据,如果该待变异原始类型数据的数据类型为未限制长度的数据类型,则对该待变异原始类型数据执行修改字节值、删除字节、插入字节和对字节进行移位中的至少一项,如果该待变异原始类型数据的数据类型为限制长度的数据类型,则对该待变异原始类型数据执行修改字节值和对字节进行移位中的至少一项。
进一步地,所述未限制长度的数据类型包括:字符串类型;所述限制长度的数据类型包括:64位整数类型或者256位Hash类型。
一种可能的实施方式,每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置。在这样的情况下,如图7所示,所述参数变异单元53包括:
第一位置识别子单元534,配置为根据所述参数结构包括的至少一个原始类型数据的起始位置或结束位置,确定一个所述待变异结构化参数中每个原始类型数据的起始位置或结束位置;
数据新增子单元535,配置为针对一个所述待变异结构化参数,根据所述第一位置识别子单元534确定的该待变异结构化参数中每个原始类型数据的起始位置或结束位置,在该待变异结构化参数包括的至少一个原始类型数据的起始位置之前或结束位置之后,新增至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,每个结构化参数包括至少两个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置。在这样的情况下,如图8所示,所述参数变异单元53包括:
第二位置识别子单元536,配置为根据所述参数结构包括的原始类型数据的起始位置或结束位置,确定一个所述待变异结构化参数中每个原始类型数据的起始位置或结束位置;
数据删除子单元537,配置为针对一个所述待变异结构化参数,根据所述第二位置识别子单元536确定的该待变异结构化参数中每个原始类型数据的起始位置或结束位置,删除该待变异结构化参数中的至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,每个结构化参数包括至少两个原始类型数据,且所述参数结构包括各原始类型数据之间的顺序。在这样的情况下,如图9所示,所述参数变异单元53包括:
顺序识别子单元538,配置为根据一个所述待变异结构化参数对应的参数结构,确定该待变异结构化参数中各原始类型数据之间的顺序;
数据调序子单元539,配置为针对一个所述待变异结构化参数,根据所述顺序识别子单元538确定出的该待变异结构化参数中各原始类型数据之间的顺序,改变该待变异结构化参数中的各原始类型数据在该待变异结构化参数中的顺序,以改变该待变异结构化参数的参数结构。
一种可能的实施方式,在图5所示生成智能合约测试案例的装置50的基础上,如图10所示,该生成智能合约测试案例的装置50可以进一步包括:
第一案例获取单元55,配置为将此前已被所述待测试智能合约执行过的一个测试案例确定为所述当前的测试案例。
一种可能的实施方式,在图5所示生成智能合约测试案例的装置50的基础上,如图11所示,该生成智能合约测试案例的装置50可以进一步包括:
第二案例获取单元56,配置为将人工生成的一个测试案例确定为所述当前的测试案例。
一种可能的实施方式,在图10所示生成智能合约测试案例的装置50的基础上,所述第一案例获取单元55配置为将将上一次输入所述待测试智能合约的测试案例确定为第一测试案例,并判断所述待测试智能合约执行所述第一测试案例时是否覆盖到了新的程序路径,如果是,则将所述第一测试案例确定为所述当前的测试案例,否则将第二测试案例确定为所述当前的测试案例,其中,所述第二测试案例满足:已被输入所述待测试智能合约,且所述第一测试案例是通过对所述第二测试案例中的结构化参数进行变异而获得的。
需要说明的是,本说明书实施例示意的结构并不构成对生成智能合约测试案例的装置的具体限定。在说明书的另一些实施例中,生成智能合约测试案例的装置可以包括比图示更多或者更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件、软件或者软件和硬件的组合来实现。
上述装置内的各单元之间的信息交互、执行过程等内容,由于与本说明书方法实施例基于同一构思,具体内容可参见本说明书方法实施例中的叙述,此处不再赘述。
又一方面的实施例,还提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述各实施例所述的生成智能合约测试案例的方法。
再一方面的实施例,还提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述各实施例所述的生成智能合约测试案例的方法。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本说明书所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
以上所述的具体实施方式,对说明书的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为说明书的具体实施方式而已,并不用于限定说明书的保护范围,凡在说明书的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在说明书的保护范围之内。
Claims (16)
1.一种生成智能合约测试案例的方法,包括:
将上一次输入待测试智能合约的测试案例确定为第一测试案例;
判断所述待测试智能合约执行所述第一测试案例时是否覆盖到了新的程序路径;
如果是,则将所述第一测试案例确定为当前的测试案例;
如果否,则将第二测试案例确定为所述当前的测试案例,其中,所述第二测试案例满足:已被输入所述待测试智能合约,且所述第一测试案例是通过对所述第二测试案例中的结构化参数进行变异而获得的;
针对所述当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数,其中,所述待变异结构化参数能够被待测试智能合约中的至少一个接口识别;
针对每一个所述待变异结构化参数,得到该待变异结构化参数对应的参数结构,其中,所述参数结构通过对预先构建的样本结构化参数进行分析而确定,且所述样本结构化参数能够被所述待测试智能合约中的至少一个接口识别;
针对每一个所述待变异结构化参数,根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,获得变异后结构化参数,所述变异后结构化参数能够被待测试智能合约中的至少一个接口识别;
生成包括各所述变异后结构化参数的测试案例,并将该测试案例作为输入所述待测试智能合约的测试案例。
2.根据权利要求1所述的方法,其中每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的数据类型;
所述根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,包括:
从该待变异结构化参数包括的各原始类型数据中选取至少一个待变异原始类型数据;
根据该待变异结构化参数对应的参数结构确定每个所述待变异原始类型数据的数据类型;
根据每个所述待变异原始类型数据的数据类型,对该待变异原始类型数据进行参数值变异,以改变该待变异结构化参数的参数值。
3.根据权利要求2所述的方法,其中,所述根据每个所述待变异原始类型数据的数据类型,对该待变异原始类型数据进行参数值变异,包括:
如果一个所述待变异原始类型数据的数据类型为未限制长度的数据类型,则对该待变异原始类型数据执行修改字节值、删除字节、插入字节和对字节进行移位中的至少一项;
如果一个所述待变异原始类型数据的数据类型为限制长度的数据类型,则对该待变异原始类型数据执行修改字节值和对字节进行位移中的至少一项。
4.根据权利要求3所述的方法,其中,
所述未限制长度的数据类型包括:字符串类型;
所述限制长度的数据类型包括:64位整数类型或者256位Hash类型。
5.根据权利要求1至4中任一所述的方法,其中每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置;
所述根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,包括:
根据所述参数结构包括的原始类型数据的起始位置或结束位置,确定该待变异结构化参数中每个原始类型数据的起始位置或结束位置;
在该待变异结构化参数包括的至少一个原始类型数据的起始位置之前或结束位置之后,新增至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
6.根据权利要求1至4中任一所述的方法,其中每个结构化参数包括至少两个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置;
所述根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,包括:
根据所述参数结构包括的原始类型数据的起始位置或结束位置,确定该待变异结构化参数中每个原始类型数据的起始位置或结束位置;
根据待变异结构化参数中每个原始类型数据的起始位置或结束位置,删除其中的至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
7.根据权利要求1至4中任一所述的方法,其中每个结构化参数包括至少两个原始类型数据,且所述参数结构包括各原始类型数据之间的顺序;
所述根据该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,包括:
根据该待变异结构化参数对应的参数结构,确定该待变异结构化参数中各原始类型数据之间的顺序;
改变该待变异结构化参数中的各原始类型数据在该待变异结构化参数中的顺序,以改变该待变异结构化参数的参数结构。
8.一种生成智能合约测试案例的装置,包括:
第一案例获取单元,配置为将上一次输入待测试智能合约的测试案例确定为第一测试案例,并判断所述待测试智能合约执行所述第一测试案例时是否覆盖到了新的程序路径,如果是,则将所述第一测试案例确定为当前的测试案例,否则将第二测试案例确定为所述当前的测试案例,其中,所述第二测试案例满足:已被输入所述待测试智能合约,且所述第一测试案例是通过对所述第二测试案例中的结构化参数进行变异而获得的;
参数选取单元,配置为针对所述当前的测试案例,从该测试案例包括的各结构化参数中选取至少一个待变异结构化参数,其中,所述待变异结构化参数能够被待测试智能合约中的至少一个接口识别;
结构识别单元,配置为针对所述参数选取单元选取出的每一个所述待变异结构化参数,得到该待变异结构化参数对应的参数结构,其中,所述参数结构通过对预先构建的样本结构化参数进行分析而确定,且所述样本结构化参数能够被所述待测试智能合约中的至少一个接口识别;
参数变异单元,配置为针对每一个所述待变异结构化参数,根据所述结构识别单元得到的该待变异结构化参数对应的参数结构,对该待变异结构化参数进行变异,获得变异后结构化参数,所述变异后结构化参数能够被待测试智能合约中的至少一个接口识别;
案例生成单元,用于生成包括所述参数变异单元所获得的各所述变异后结构化参数的测试案例,并将该测试案例作为输入所述待测试智能合约的测试案例。
9.根据权利要求8所述的装置,其中每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的数据类型;
所述参数变异单元,包括:
数据选择子单元,配置为从一个待变异结构化参数包括的各原始类型数据中选取至少一个待变异原始类型数据;
类型识别子单元,配置为根据一个待变异结构化参数对应的参数结构,确定所述数据选择子单元选取的每个所述待变异原始类型数据的数据类型;
第一变异子单元,配置为根据所述类型识别子单元确定出的每个所述待变异原始类型数据的数据类型,对该待变异原始类型数据进行参数值变异,以改变该待变异原始类型数据所在的待变异结构化参数的参数值。
10.根据权利要求9所述的装置,其中,
所述第一变异子单元,配置为针对每一个所述待变异原始类型数据,如果该待变异原始类型数据的数据类型为未限制长度的数据类型,则对该待变异原始类型数据执行修改字节值、删除字节、插入字节和对字节进行移位中的至少一项,如果该待变异原始类型数据的数据类型为限制长度的数据类型,则对该待变异原始类型数据执行修改字节值和对字节进行移位中的至少一项。
11.根据权利要求10所述的装置,其中,
所述未限制长度的数据类型包括:字符串类型;
所述限制长度的数据类型包括:64位整数类型或者256位Hash类型。
12.根据权利要求8至11中任一所述的装置,其中每个结构化参数包括至少一个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置;
所述参数变异单元,包括:
第一位置识别子单元,配置为根据所述参数结构包括的至少一个原始类型数据的起始位置或结束位置,确定一个所述待变异结构化参数中每个原始类型数据的起始位置或结束位置;
数据新增子单元,配置为针对一个所述待变异结构化参数,根据所述第一位置识别子单元确定的该待变异结构化参数中每个原始类型数据的起始位置或结束位置,在该待变异结构化参数包括的至少一个原始类型数据的起始位置之前或结束位置之后,新增至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
13.根据权利要求8至11中任一所述的装置,其中每个结构化参数包括至少两个原始类型数据,且所述参数结构包括原始类型数据的起始位置或结束位置;
所述参数变异单元,包括:
第二位置识别子单元,配置为根据所述参数结构包括的原始类型数据的起始位置或结束位置,确定一个所述待变异结构化参数中每个原始类型数据的起始位置或结束位置;
数据删除子单元,配置为针对一个所述待变异结构化参数,根据所述第二位置识别子单元确定的该待变异结构化参数中每个原始类型数据的起始位置或结束位置,删除该待变异结构化参数中的至少一个原始类型数据,以改变该待变异结构化参数的参数结构。
14.根据权利要求8至11中任一所述的装置,其中每个结构化参数包括至少两个原始类型数据,且所述参数结构包括各原始类型数据之间的顺序;
所述参数变异单元,包括:
顺序识别子单元,配置为根据一个所述待变异结构化参数对应的参数结构,确定该待变异结构化参数中各原始类型数据之间的顺序;
数据调序子单元,配置为针对一个所述待变异结构化参数,根据所述顺序识别子单元确定出的该待变异结构化参数中各原始类型数据之间的顺序,改变该待变异结构化参数中的各原始类型数据在该待变异结构化参数中的顺序,以改变该待变异结构化参数的参数结构。
15.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-7中任一项所述的方法。
16.一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-7中任一项所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011054152.1A CN111897742B (zh) | 2020-09-30 | 2020-09-30 | 生成智能合约测试案例的方法和装置 |
US17/357,916 US11204860B2 (en) | 2020-09-30 | 2021-06-24 | Methods and apparatuses for generating smart contract test case |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011054152.1A CN111897742B (zh) | 2020-09-30 | 2020-09-30 | 生成智能合约测试案例的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111897742A CN111897742A (zh) | 2020-11-06 |
CN111897742B true CN111897742B (zh) | 2021-01-15 |
Family
ID=73224064
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011054152.1A Active CN111897742B (zh) | 2020-09-30 | 2020-09-30 | 生成智能合约测试案例的方法和装置 |
Country Status (2)
Country | Link |
---|---|
US (1) | US11204860B2 (zh) |
CN (1) | CN111897742B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112100084B (zh) * | 2020-11-17 | 2021-02-26 | 支付宝(杭州)信息技术有限公司 | 生成智能合约测试案例的方法和装置 |
CN112686671B (zh) * | 2021-01-07 | 2022-07-12 | 腾讯科技(深圳)有限公司 | 基于区块链的智能合约部署方法、装置、设备以及介质 |
CN115659358B (zh) * | 2022-12-28 | 2023-03-17 | 北京邮电大学 | 一种智能合约模糊测试方法及装置 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107239392B (zh) * | 2016-03-29 | 2021-02-12 | 腾讯科技(深圳)有限公司 | 一种测试方法、装置、终端及存储介质 |
US9934138B1 (en) * | 2016-12-07 | 2018-04-03 | International Business Machines Corporation | Application testing on a blockchain |
US10705949B2 (en) * | 2017-11-03 | 2020-07-07 | Oracle International Corporation | Evaluation of library test suites using mutation testing |
CN110221956A (zh) * | 2018-03-02 | 2019-09-10 | 富士通株式会社 | 用于生成区块链智能合约的测试用例的方法和设备 |
US20190303623A1 (en) * | 2018-04-02 | 2019-10-03 | Ca, Inc. | Promotion smart contracts for software development processes |
CN111459786B (zh) * | 2019-01-18 | 2023-08-29 | 南京大学 | 一种基于变异fuzz的智能合约安全测试方法 |
CN110046089B (zh) * | 2019-03-01 | 2022-05-17 | 华南师范大学 | 一种基于路径覆盖充分性准则的智能合约测试方法 |
CN110196813B (zh) * | 2019-06-06 | 2023-05-02 | 北京百度网讯科技有限公司 | 接口测试方法、装置、设备和介质 |
-
2020
- 2020-09-30 CN CN202011054152.1A patent/CN111897742B/zh active Active
-
2021
- 2021-06-24 US US17/357,916 patent/US11204860B2/en active Active
Also Published As
Publication number | Publication date |
---|---|
US20210318947A1 (en) | 2021-10-14 |
CN111897742A (zh) | 2020-11-06 |
US11204860B2 (en) | 2021-12-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111897742B (zh) | 生成智能合约测试案例的方法和装置 | |
CN110427331B (zh) | 基于接口测试工具自动生成性能测试脚本的方法 | |
US8010844B2 (en) | File mutation method and system using file section information and mutation rules | |
CN107341102B (zh) | 一种测试用例文件生成方法及装置 | |
CN109344053B (zh) | 接口覆盖测试方法、系统、计算机设备和存储介质 | |
CN107608873B (zh) | 软件测试方法和系统及测试平台 | |
Surendran et al. | Evolution or revolution: the critical need in genetic algorithm based testing | |
CN108897588B (zh) | 一种用于模块间通信的路由方法和路由装置 | |
US20080104576A1 (en) | Method and arrangement for locating input domain boundaries | |
CN112559343B (zh) | 测试路径生成方法及相关设备 | |
CN111966597B (zh) | 测试数据生成方法及装置 | |
US20060064570A1 (en) | Method and apparatus for automatically generating test data for code testing purposes | |
CN112948193A (zh) | 一种基于差异测试的fpga综合工具缺陷检测方法 | |
CN112100084B (zh) | 生成智能合约测试案例的方法和装置 | |
Toeppe et al. | Practical validation of model based code generation for automotive applications | |
CN113918473B (zh) | 一种基于Swagger文档的RESTful APIs组合测试方法 | |
CN116702157A (zh) | 一种基于神经网络的智能合约漏洞检测方法 | |
CN116560984A (zh) | 一种基于调用依赖图的测试用例聚类分组方法 | |
US6681374B1 (en) | Hit-or-jump method and system for embedded testing | |
Wever et al. | Active coevolutionary learning of requirements specifications from examples | |
Rauf et al. | Fully automated gui testing and coverage analysis using genetic algorithms | |
CN114416547A (zh) | 基于测试用例的测试方法 | |
CN111078548A (zh) | 测试用例解析方法、装置、存储介质及验证平台 | |
CN117075891B (zh) | 一种为测试用例关联配置文件的方法及装置 | |
Kaur et al. | SFrame: Design & Development of Smart Framework to Port Linux Kernel on ARM based Raspberry Pi |
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 | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40039763 Country of ref document: HK |