CN112286828B - 一种区块链智能合约的测试方法和系统 - Google Patents
一种区块链智能合约的测试方法和系统 Download PDFInfo
- Publication number
- CN112286828B CN112286828B CN202011552436.3A CN202011552436A CN112286828B CN 112286828 B CN112286828 B CN 112286828B CN 202011552436 A CN202011552436 A CN 202011552436A CN 112286828 B CN112286828 B CN 112286828B
- Authority
- CN
- China
- Prior art keywords
- test
- code segment
- variable
- tested
- code
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本说明书实施例提供了一种区块链智能合约的测试方法和系统,所述方法包括:确定智能合约中的待测试代码段;对待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常场景;基于预先确定的代码段与变量对应关系,确定能够触发待测试代码段的测试变量及其取值;向智能合约中的测试变量输入所述取值,以触发待测试代码段并获得待测试代码段在异常场景下的测试结果。实现测试智能合约在异常环境的处理能力,以及可以有针对性地对智能合约中的某些代码段(例如目标场景的脆弱点)进行精细测试,实现对智能合约的完善和全面测试,有助于改进区块链智能合约以增强其健壮性。
Description
技术领域
本申请涉及计算机技术领域,特别涉及智能合约测试方法和系统。
背景技术
计算机程序测试过程中,可以基于各种不同的输入触发计算机程序的执行来测试计算机程序的执行逻辑,例如模糊测试技术。得到的程序执行或处理情况反应的是程序在受到输入触发时,程序能否正常执行或者能否合理处理这些输入触发的各种场景(甚至是异常场景)。而实际上程序运行的环境复杂,存在各种异常场景,例如服务器系统异常(系统资源CPU、内存不足等)、依赖服务异常(运行过程中数据库、第三方依赖服务无响应,请求其他接口返回异常信息等)、程序本身异常(进程重启、挂掉、假死、响应时间变慢等)等。如何对计算机程序进行尽可能多角度的测试,获取计算机程序在尽可能多的异常场景下的处理情况,对于检测并提升计算机程序,尤其是应用于稳定性要求更高的应用场景的计算机程序(如区块链智能合约)的健壮性有着重要意义。
发明内容
本说明书一个方面提供一种区块链智能合约的测试方法,所述方法包括:确定智能合约中的待测试代码段;对所述待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常场景;基于预先确定的代码段与变量对应关系,确定能够触发所述待测试代码段的测试变量及其取值;向所述智能合约中的所述测试变量输入所述取值,以触发所述待测试代码段并获得所述待测试代码段在所述异常场景下的测试结果。
本说明书另一个方面提供一种用于区块链智能合约测试的代码段与变量对应关系的获取方法,所述方法包括:获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序及其一个或多个测试变量及其取值;对于一个或多个历史测试的计算机程序的每一个:逐一向该计算机程序的各测试变量输入其对应的取值,获得各测试变量能够触发的该计算机程序的代码段;基于触发结果,建立各测试变量与该计算机程序各代码段的对应关系。
本说明书另一个方面提供一种区块链智能合约测试系统,所述系统包括:代码段确定模块:用于确定智能合约中的待测试代码段;异常注入模块:用于对所述待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常执行场景;测试变量值确定模块:用于基于预先确定的代码段与变量对应关系,确定能够触发所述待测试代码段的测试变量及其取值;测试模块:用于向所述智能合约中的所述测试变量输入所述取值,以触发所述待测试代码段并获得所述待测试代码段在所述异常场景下的测试结果。
本说明书另一个方面提供一种区块链智能合约的测试装置,包括至少一个存储介质和至少一个处理器,所述至少一个存储介质用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令以实现所述的区块链智能合约的测试方法。
附图说明
本说明书将以示例性实施例的方式进一步说明,这些示例性实施例将通过附图进行详细描述。这些实施例并非限制性的,在这些实施例中,相同的编号表示相同的结构,其中:
图1是根据本说明书一些实施例所示的一种区块链智能合约的测试系统的框图;
图2是根据本说明书一些实施例所示的一种区块链智能合约的方法的示例性流程图;
图3是根据本说明书一些实施例所示的一种用于智能合约测试的代码段与变量对应关系的获取方法的示例性流程图;
图4是根据本说明书一些实施例所示的一种代码段与变量对应关系的示例性示意图;
图5是根据本说明书一些实施例所示的另一种代码段与变量对应关系的示例性示意图。
具体实施方式
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单的介绍。显而易见地,下面描述中的附图仅仅是本说明书的一些示例或实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图将本说明书应用于其它类似情景。除非从语言环境中显而易见或另做说明,图中相同标号代表相同结构或操作。
应当理解,本说明书中所使用的“系统”、“装置”、“单元”和/或“模组”是用于区分不同级别的不同组件、元件、部件、部分或装配的一种方法。然而,如果其他词语可实现相同的目的,则可通过其他表达来替换所述词语。
如本说明书和权利要求书中所示,除非上下文明确提示例外情形,“一”、“一个”、“一种”和/或“该”等词并非特指单数,也可包括复数。一般说来,术语“包括”与“包含”仅提示包括已明确标识的步骤和元素,而这些步骤和元素不构成一个排它性的罗列,方法或者设备也可能包含其它的步骤或元素。
本说明书中使用了流程图用来说明根据本说明书的实施例的系统所执行的操作。应当理解的是,前面或后面操作不一定按照顺序来精确地执行。相反,可以按照倒序或同时处理各个步骤。同时,也可以将其他操作添加到这些过程中,或从这些过程移除某一步或数步操作。
本说明书的一些实施例所示的计算机程序测试方法可以应用在各种软件、系统、平台中,实现对各种程序、软件、系统、平台的测试。
计算机程序(Computer program),也称为软件(software),简称程序(Program),是指一组指示计算机或其他具有信息处理能力装置执行动作或做出判断的指令,一个计算机程序是一系列指令的集合,运行于某种目标体系结构上。计算机程序通常用某种程序设计语言编写,即计算机程序是编写的一组代码,一般来说,一句指令对应一行代码。
计算机程序测试是指为了发现程序中错误而执行计算机程序的过程,计算机程序测试的目的在于检验程序是否满足规定的需求或是弄清楚预期结果与实际结果之间的差别。计算机程序测试可以包括单元测试、集成测试、系统测试、回归测试、白盒测试、静态测试、动态测试、黑盒测试等。在计算机程序测试过程中,可以生成各种不同的输入(或称为测试变量及其取值),例如随机的、畸形的、非预期的输入等,通过各种不同的输入触发计算机程序的执行,以测试程序的执行或处理,发现程序中的错误。
在一些实施例中,计算机程序测试系统可以应用于对区块链网络的计算机程序(如智能合约)进行测试。
区块链是分布式、去中心化的数据库,区块链的数据具有不可纂改、全程留痕、可以追溯等特点,被应用于各个数据存证场景。智能合约是指是由计算机程序定义并自动执行的承诺协议。智能合约可以部署于区块链网络中的节点上,运行在虚拟机环境中。智能合约由合约开发者编写并部署,智能合约开发者可以根据需求编写智能合约。智能合约被成功部署后,节点可以接收调用智能合约的交易,并对已部署的智能合约进行执行(调用)。虚拟机是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在一些实施例中,虚拟机可以包括但不限于以太坊虚拟机(Embedded VirturalMachine,EVM)、EOS虚拟机(Web Assembly,WASM)、比原链虚拟机(Bottos VirturalMachine,BVM)等。可以理解的是,智能合约在一定程度上代表着区块链网络的行为能力,智能合约的稳定健壮影响着区块链网络能否平稳健康运行。为了确保在各种复杂场景下,区块链网络仍然能够提供稳定可靠的服务,有必要提供一种更加全面高效的区块链智能合约的测试方法。
在本说明书中,提出了一种基于红蓝攻防思想,对计算机程序中的特定待测试代码段进行精细和全面测试的方法。红蓝攻防思想是指类似于军事领域的红蓝军对抗。本说明书一些实施例提出的计算机程序测试方法,可以对计算机程序的待测试代码段进行异常注入,使得该待测试代码段被执行时能够出现异常场景,并向计算机程序中的能够触发该可能出现异常场景的待测试代码段的测试变量输入相应的变量值,以模拟红军攻击;待测试代码段在异常场景下的处理,例如容错处理、应变措施等,即可以作为蓝军防守的模拟。通过该种方式可以实现对计算机程序在各种异常场景下的反应进行测试,以及有针对性地对计算机程序的某个功能单元或代码段进行精细的测试获得测试结果以便程序开发人员基于测试结果对计算机程序进行改进,让计算机程序即使处于异常状态下也不会出现问题或事故。在一些实施例中,所述计算机程序可以是指部署于区块链网络中的智能合约。
图1是根据本说明书一些实施例所示的一种区块链智能合约的测试系统的框图。
在一些实施例中,区块链智能合约的测试系统100可以包括代码段确定模块110、异常注入模块120、测试变量值确定模块130以及测试模块140,可选的,在一些实施例中,系统100还可以包括对应关系确定模块150。
代码段确定模块110可以用于:确定智能合约中的待测试代码段。
异常注入模块120可以用于:对所述待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常执行场景。在一些实施例中,异常注入模块120还可以用于:在所述代码段添加异常触发代码行或修改所述代码段中的部分代码行以进行异常注入。
测试变量值确定模块130可以用于:基于预先确定的代码段与变量对应关系,确定能够触发所述待测试代码段的测试变量及其取值。
测试模块140可以用于:向所述智能合约中的所述测试变量输入所述取值,以触发所述待测试代码段并获得所述待测试代码段在所述异常执行场景下的测试结果。
对应关系确定模块150可以用于:获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序及其一个或多个测试变量及其取值;对于一个或多个历史测试的计算机程序的每一个:逐一向该计算机程序的各测试变量输入其对应的取值,获得各测试变量能够触发的该计算机程序的所述代码段;基于触发结果,建立各测试变量与该计算机程序各代码段的对应关系。在一些实施例中,对应关系确定模块150还可以用于:获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序及其一个或多个测试变量及其取值;对于一个或多个历史测试的计算机程序的每一个及其每一个测试变量:对该测试变量的所述取值进行增量变化,向该计算机程序的所述测试变量输入变化后的取值,获得变化后的取值能够触发的该计算机程序的代码段,以此重复,建立该测试变量的不同取值与该计算机程序各代码段的对应关系。在一些实施例中,所述代码段与变量对应关系反映不同变量与不同代码段的对应关系,和/或反映不同变量的不同取值与不同代码段的对应关系;其中,所述代码段能够被其对应的变量或对应的变量取值触发。
应当理解,所示的系统及其模块可以利用各种方式来实现。例如,在一些实施例中,系统及其模块可以通过硬件、软件或者软件和硬件的结合来实现。其中,硬件部分可以利用专用逻辑来实现;软件部分则可以存储在存储器中,由适当的指令执行系统,例如微处理器或者专用设计硬件来执行。本领域技术人员可以理解上述的方法和系统可以使用计算机可执行指令和/或包含在处理器控制代码中来实现,例如在诸如磁盘、CD或DVD-ROM的载体介质、诸如只读存储器(固件)的可编程的存储器或者诸如光学或电子信号载体的数据载体上提供了这样的代码。本申请的系统及其模块不仅可以有诸如超大规模集成电路或门阵列、诸如逻辑芯片、晶体管等的半导体、或者诸如现场可编程门阵列、可编程逻辑设备等的可编程硬件设备的硬件电路实现,也可以用例如由各种类型的处理器所执行的软件实现,还可以由上述硬件电路和软件的结合(例如,固件)来实现。
需要注意的是,以上对于区块链智能合约的测试系统100及其模块的描述,仅为描述方便,并不能把本说明书限制在所举实施例范围之内。可以理解,对于本领域的技术人员来说,在了解该系统的原理后,可能在不背离这一原理的情况下,对各个模块进行任意组合,或者构成子系统与其他模块连接。例如,测试变量值确定模块130和测试模块140可以合并为一个模块。诸如此类的变形,均在本申请的保护范围之内。
图2是根据本说明书的一些实施例所示的一种区块链智能合约的测试方法的示例性流程图。
如图2所示,该区块链智能合约的测试方法200可以包括:
步骤210,确定智能合约中的待测试代码段。
具体的,该步骤210可以由代码段确定模块110执行。
如前所述,区块链智能合约是指由计算机程序定义并自动执行的承诺协议,换而言之,智能合约是编写的一组代码。一组代码可以由多个代码段组成,即智能合约可以包括多个代码段。代码段是指一组代码中的由一行或多行代码组成的代码片段,一个代码段可以对应智能合约中的一个指令或一个功能。在一些实施例中,智能合约中的不同代码段可以实现不同的指令或功能。例如,智能合约中的一个代码段A:FILE*p_file =fopen("1.txt","w")实现读取文件的功能,智能合约中的另一个代码段B:if(p_file){for(num=0;num<=4;num ++){fprintf(p_file,“%d-”,arr[num]);}实现存储数据的功能,其中p_file表示文件指针。
待测试代码段是指计算机程序(例如智能合约)中需要测试的代码段。例如,对于一个实现交易数据验证并上链存储的智能合约,需要对智能合约的储存数据功能进行测试,则智能合约中存储数据功能对应的代码段B:if(p_file){for(num=0;num<=4; num++){fprintf(p_file, “%d-”,arr[num]);}为待测试代码段。又例如,对于区块链平台(或区块链网络),需要对区块链平台的交易数据存储场景进行测试,则与区块链平台的交易数据存储场景相关的各个智能合约的代码段都为待测试代码段。
在一些实施例中,待测试代码段可以根据指定的测试需求确定,例如指定需要测试区块链平台的交易数据存储场景,则区块链平台的交易数据存储场景相关的各个智能合约的代码段为待测试代码段。在一些实施例中,待测试代码段可以通过识别被测试区块链智能合约的脆弱点来确定。例如,通过脆弱点识别技术或经验得出实现交易数据验证并存储的智能合约中,能否正常访问存储设备或者能否正常打开需要读写的文件是较为敏感的脆弱点,则可以将该智能合约的用于读写存储设备或文件的代码段为待测试代码段。脆弱点识别可以采用已知的各种脆弱点识别技术实现,例如漏洞扫描、渗透性测试等,也可以基于程序测试人员的经验确定。
步骤220,对所述待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常场景。
具体的,该步骤220可以由异常注入模块120执行。
异常注入是指对计算机程序或计算机程序的代码段注入错误,使得当计算机程序或计算机程序的代码段执行时出现异常。在一些实施例中,注入的错误可以是指执行的异常环境或错误指令。例如,可以对智能合约或智能合约的代码段注入内存已满的异常环境,也可以对智能合约或智能合约的代码段注入不能正确打开文件的错误指令。
在一些实施例中,可以通过在智能合约的代码段添加异常触发代码行或修改智能合约的代码段中的部分代码行以进行异常注入。在一些实施例中,可以通过钩子(hook)技术、创建远程线程和特洛伊DLL等注入技术进行异常注入。以hook技术为例,是在原有的代码行前后加入自定义的代码,相当于在程序没有调用该函数之前,hook程序就先捕获该消息,可以先得到控制权,这时hook函数便可以加工处理(改变)该函数的执行行为,即可以添加异常触发代码行或修改代码段中的部分代码行以进行异常注入。
智能合约或智能合约的代码段可以包括一个或多个代码行。修改智能合约的代码段中的部分代码行可以是指修改代码行中的命令执行函数、代码的变量、代码的变量的数值或其它代码字符。例如,可以将代码行中的读取命令执行函数fopen中的文件名修改为一个并不存在的文件名,使得该函数被执行时,不能正确打开要读写的文件,进而产生异常场景。
异常触发代码行是指可以制造异常执行环境或表示错误指令的代码行,例如制造磁盘被写满的环境的代码行fiu_return_on("no_free_space",0)可以作为异常触发代码行,又例如在交易数据存储场景中,打开文件指针为空的文件的代码行可以作为异常触发代码行。在一些实施例中,可以在智能合约的代码段的执行前、中、后的任意对应位置处添加异常触发代码行。
异常场景是指计算机程序的非正常场景。例如,对于区块链平台的交易数据存储场景的相关智能合约,其对应的异常场景可以包括内存存储空间不够,磁盘被损坏,网络中断等。
在一些实施例中,可以通过触发经过异常注入的智能合约或智能合约的代码段,使得智能合约或智能合约的代码段执行时出现异常场景。即,对待测试代码段进行异常注入后,可以触发该经过异常注入的待测试代码段,使得该待测试代码段执行时出现异常场景。
在一些实施例中,异常场景可以是人为预设的,也可以是系统推荐预设的,本实施例对异常场景的设定方式不做限制。
步骤230,基于预先确定的代码段与变量对应关系,确定能够触发所述待测试代码段的测试变量及其取值。
具体的,该步骤230可以由测试变量值确定模块130执行。
在本说明书一些实施例中,变量也可以称为字段,是指能够存储或代表计算机程序输入数据的抽象概念。例如,一段计算机程序(例如智能合约)的输入参数。在一些实施例中,可以使计算机程序具有比正式上线运行时更多的输入变量(在程序测试阶段,这些输入变量也可以称为测试变量),已满足不同的测试需要。变量可以包括变量值、变量名称、变量类型等要素。变量的变量值(或称为取值)可以变化,可以通过变量名称查看变量或更改变量值,不同类型的变量可以存储不同类型的数据。例如,可以在智能合约或智能合约的代码段中创建一个名为Click Count的变量,用于存储用户访问某个文件的次数,Click Count的取值即表示次数。在一些实施例中,计算机程序可以具有不同类型的输入变量,例如指针类变量,整型类变量。通过对计算机程序(例如智能合约)中的相应输入变量输入某一具体取值时,可以触发不同的代码段执行。
计算机程序(例如智能合约)的各个不同代码段可以被不同的变量触发执行。例如,代码段A:FILE*p_file=fopen("1.txt","w")可以被变量a触发执行,代码段B:if(p_file){for(num=0;num<=4; num++){fprintf(p_file, “%d-”,arr[num]);}可以被变量b触发执行。当对变量a设置一个具体数值,如2.3,并向变量a输入该数值时,代码段A会被触发执行。可以理解,一个代码段可以被对应的特定变量触发执行,即变量与代码段之间存在对应关系,例如变量a与代码段A存在对应关系。在一些实施例中,一个变量可以触发对应的一个或多个特定代码段执行,即一个变量可以与一个或多个代码段存在对应关系。在一些实施例中,一个代码段可以被一个或多个变量触发执行,即一个代码段可以与一个或多个变量存在对应关系。
在一些实施例中,只要给对应的变量输入任一取值便可以触发相应的代码段执行。然而在又一些实施例中,变量能否有效触发执行的代码段可能与变量的取值相关,不同的变量取值可以触发执行不同的代码段或者只有预设范围内的变量取值才能触发执行变量对应的代码段。例如,输入到变量a的取值只有在(1-3)范围内才能触发执行变量a对应的代码段A。又例如,变量a的变量取值在(1-3)范围内时可以触发代码段A,变量a的变量取值在(4-6)范围内时可以触发代码段C。可以理解,一个代码段可以被具有特定变量取值或特定变量取值范围的特定变量触发执行,即更加精细的,变量对应的变量不同取值与代码段之间也存在对应关系,例如变量a对应的变量取值(1-3)与代码段A存在对应关系,变量a对应的变量取值(4-6)与代码段B存在对应关系。在一些实施例中,具有特定变量取值或特定变量值取值范围的一个变量可以触发对应的一个或多个特定代码段执行,即一个特定变量取值或特定变量值取值范围可以与一个或多个代码段存在对应关系。在一些实施例中,一个代码段可以被一个或多个特定变量取值或特定变量取值范围的变量触发执行,即一个代码段可以与一个或多个特定变量取值或特定变量取值范围的变量存在对应关系。
在一些实施例中,代码段与变量对应关系可以包括粗粒度的对应关系(即反映不同变量与不同代码段的对应关系)和/或细粒度的对应关系(即反映不同变量的不同取值与不同代码段的对应关系)。
在一些实施例中,代码段与变量对应关系可以是预先获取的。在一些实施例中,可以通过读取已经存储的代码段与变量对应关系的相关数据获取,还可以通过对计算机程序(例如智能合约)或计算机程度的代码段进行测试并分析测试数据获取。
在一些实施例中,代码段与变量对应关系可以通过以下步骤获取:获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序(例如智能合约)及其一个或多个测试变量及其取值;对于一个或多个历史测试的计算机程序的每一个:逐一向该计算机程序的各测试变量输入其对应的取值,获得各测试变量能够触发的该计算机程序的代码段;基于触发结果,建立各测试变量与该计算机程序各代码段的对应关系。关于前述步骤的具体内容可以参见图3及其相关说明,此处不再赘述。
在一些实施例中,获取单元测试案例集后,还可以对于一个或多个历史测试的计算机程序(例如智能合约)的每一个进行以下步骤来获取代码段与变量对应关系:对该测试变量的所述取值进行增量变化,向该计算机程序的所述测试变量输入变化后的取值,获得变化后的取值能够触发的该计算机程序的代码段,以此重复,建立该测试变量的不同取值与该计算机程序各代码段的对应关系。关于前述步骤的具体内容可以参见图3及其相关说明,此处不再赘述。
在一些实施例中,基于预先确定的代码段与变量对应关系,确定能够触发所述待测试代码段的测试变量及其取值。如果代码段与变量对应关系是粗粒度的,可以先基于代码段与变量对应关系待测试代码段对应的一个或多个变量,将其作为测试变量,然后给各测试变量确定一个具体的取值,如随机设置,进而得到各测试变量的取值。如果代码段与变量对应关系是细粒度的,则可以基于该代码段与变量对应关系同时找到待测试代码段对应变量及变量取值,将所述变量及变量取值作为待测试代码的测试变量及其取值。
在一些实施例中,可以在所述对应关系中确定与所述待测试代码段相同或功能相同的代码段测试例,将该代码段测试例对应的变量或对应的变量及其取值作为所述待测试代码段的测试变量或测试变量及其取值。
步骤240,向所述智能合约中的所述测试变量输入所述取值,以触发所述待测试代码段并获得所述待测试代码段在所述异常执行场景下的测试结果。
具体的,该步骤340可以由测试模块240执行。
不难理解,当向计算机程序(例如智能合约)中的相应测试变量输入具体数值时,便可触发相应的代码段执行。因此,可以基于前述确定的测试变量及其取值,向智能合约的所述测试变量输入所述取值,便可触发待测试代码段执行,获得测试结果。测试结果是指智能合约或智能合约的代码段执行或处理的情况,可以包括智能合约或智能合约的代码段执行过程数据(例如第一步打开了文件,第二步写入了数据)、执行结果数据(例如打开文件成功、打开文件失败等)、容错能力数据(例如在遇到文件不能正常打开等异常时,是否具有有效的报错、文件校验等容错能力)、应变能力数据(例如在存储空间已满的异常执行环境中,是否具有临时存储、异常上报等应变能力)等各种测试数据。
在一些实施例中,异常场景下的测试结果可以反映智能合约或智能合约的代码段在异常场景下的健壮性。例如,对执行错误的容错能力满足预期或优秀,可以反映智能合约或智能合约的代码段在异常执行场景下的健壮性较好,又例如对异常执行环境的应变能力满足预期或优秀,也可以反映智能合约或智能合约的代码段在异常执行场景下的健壮性较好。
图3是根据本说明书一些实施例所示的一种代码段与变量对应关系的获取方法的示例性流程图。
如图3所示,该区块链智能合约的测试方法300可以包括:
步骤310,获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序及其一个或多个测试变量及其取值。可以理解,单元测试案例集中的计算机程序可以包括智能合约。
具体的,该步骤310可以由对应关系确定模块150执行。
单元测试是针对软件或程序的基本组成单元(代码段、模块或程序单元)来进行正确性检验的测试。例如,存储数据功能对应的计算机程序可以对应包括打开指定文件的模块或程序单元、校验所需存储数据的模块或程序单元、在指定文件中写入所需存储数据的模块或存储单元等。
单元测试案例是指单元测试对应的测试数据,可以包括单元测试的计算机程序或计算机程序的代码段、用于测试的测试变量及其取值、采用测试变量及其取值触发计算机程序或计算机程序的代码段执行的测试结果等数据。
在一些实施例中,单元测试案例可以包括一个或多个历史测试的测试数据,即一个或多个历史测试的计算机程序及其对应的测试变量及其取值。每一个历史测试的计算机程序可以对应一个或多个测试变量及其取值。历史测试是指已经进行过的历史测试的测试数据,例如测试的计算机程序及其一个或多个测试变量及其取值可以通过预先进行的单元测试获得,也可以通过从存储有历史测试的测试数据的数据库或存储设备中读取获取。在一些实施例中,历史测试的计算机程序可以与待测试代码段所述的计算机程序是同一个,也可以不相同。
步骤320,对于一个或多个历史测试的计算机程序的每一个:逐一向该计算机程序的各测试变量输入其对应的取值,获得各测试变量能够触发的该计算机程序的代码段;基于触发结果,建立各测试变量与该计算机程序各代码段的对应关系。
具体的,该步骤320可以由对应关系确定模块150执行。
在一些实施例中,可以基于单元测试案例进行进一步的测试分析,以确定代码段与变量对应关系(包括不同变量与不同代码段的对应关系和/或不同变量的不同取值与不同代码段的对应关系)。
在一些实施例中,逐一向该计算机程序的各测试变量输入其对应的取值,获得各测试变量能够触发的该计算机程序的代码段。例如,单元测试案例中包含了某历史测试的计算机程序的测试变量及其取值包括a=2,a=4,b=3,c=3.2,则可以先将2输入到该计算机程序的变量a中,发现代码段A被触发;再将4输入到该计算机程序的变量a中,发现代码段E被触发。以此类推,逐一将3、3.2输入到计算机程序的变量b、c中,得到代码段触发结果。代码段触发结果可以包括各个不同输入是否成功触发了代码段的执行、各个不同输入对应触发了哪些代码段的执行、各个不同输入触发的代码段占所有代码的占比(即代码覆盖率)等。
在一些实施例中,可以通过对计算机程序代码采取代码插桩技术获取代码触发结果。代码插桩技术是在被测程序中插入探针,然后通过探针的执行来获得程序的控制流和数据流信息,以此来得到计算机程序或计算机程序代码段的触发结果。
根据前述触发结果,即可以确定各个测试变量与各代码段的对应关系。如图4中代码段与变量对应关系的示例性示意图400所示,包括变量a的输入都能够触发代码段A的执行,包括变量b或c的输入不能触发代码段A的执行,即可以确定变量a与代码段A存在对应关系。
在一些实施例中,还可以对历史测试的每一个计算机程序的每一个测试变量的取值进行增量变化(delta debugging)。增量变化可以是在测试变量原有取值(即单元测试案例记录的变量取值)的基础上叠加一定的增量,其中增量可以取0.5、2、-0.1等数值。具体地,可以对各个不同测试变量的取值例如a=2,b=3进行增量变化,得到可以覆盖各个变量的各个可行取值或可行取值范围的测试变量取值。例如对测试变量a的取值a=2进行增量变化得到增量变化后的测试变量值2.5、3、3.5等。
进一步,可以将增量变化后的测试变量的取值输入计算机程序中的对应测试变量中进行测试,得到该变量不同取值对应的代码触发结果。代码触发结果可以包括各个变量的不同取值对应的不同输入是否成功触发了代码段的执行、各个变量的不同取值对应的不同输入对应触发了哪些代码段的执行、各个变量的不同取值对应的不同输入触发的代码段占所有代码的占比(即代码覆盖率)等。
根据前述触发结果,获得变化后的测试变量的取值能够触发的该计算机程序的代码段,以此重复,即可以建立该测试变量的不同取值与该计算机程序各代码段的对应关系。如图5中代码段与变量对应关系的示例性示意图500所示,根据前述方法得到的触发结果可知,包括变量a的输入中,取值为1-3的测试变量a都能够触发代码段A的执行,而取值范围在(1-3)之外的测试变量a都不能触发代码段A的执行,即可以确定变量a的取值(1-3)与代码段A存在对应关系。
当建立起代码段与变量的对应关系后,可以基于待测试代码段快速确定对其有效的测试变量及其取值,然后向计算机程序中的所述测试变量输入该取值,便能准确触发待测试代码段,提高测试效率。对于待测试代码段与其他组件(如其他代码段、函数或计算机程序等)具有交互的场景时,如待测试代码对所述其组件有调用,可以基于所述对应关系确定与这两部分具有对应关系的变量或变量取值,完成合成测试。
本说明书实施例还提供一种计算机程序测试装置,包括至少一个存储介质和至少一个处理器,所述至少一个存储介质用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令以实现如下方法:确定智能合约中的待测试代码段;对所述待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常执行场景;基于预先确定的代码段与变量对应关系,确定能够触发所述待测试代码段的测试变量及其取值;向所智能合约中的所述测试变量输入所述取值,以触发所述待测试代码段并获得所述待测试代码段在所述异常场景下的测试结果。
本说明书实施例可能带来的有益效果包括但不限于:(1)本说明书中,基于输入变量与触发代码段的对应关系得到可以智能合约的待测试代码段的测试变量及其取值,并对待测试代码段进行异常注入,然后用测试变量及其取值触发待测试代码段异常执行,实现测试智能合约在异常环境的处理能力,以及可以有针对性地对智能合约中的某些代码段(例如目标场景的脆弱点)进行精细测试,实现对智能合约的完善和全面测试,有助于改进区块链智能合约以增强其健壮性;(2)本发明中,基于单元测试案例集,建立起各变量和/或对应的变量取值与计算机程序各代码段的对应关系,可以实现针对某些目标代码段构建对应的完善的测试数据集,以实现更加有效和全面地对某些不表代码段进行测试。需要说明的是,不同实施例可能产生的有益效果不同,在不同的实施例里,可能产生的有益效果可以是以上任意一种或几种的组合,也可以是其他任何可能获得的有益效果。
上文已对基本概念做了描述,显然,对于本领域技术人员来说,上述详细披露仅仅作为示例,而并不构成对本说明书的限定。虽然此处并没有明确说明,本领域技术人员可能会对本说明书进行各种修改、改进和修正。该类修改、改进和修正在本说明书中被建议,所以该类修改、改进、修正仍属于本说明书示范实施例的精神和范围。
同时,本说明书使用了特定词语来描述本说明书的实施例。如“一个实施例”、“一实施例”、和/或“一些实施例”意指与本说明书至少一个实施例相关的某一特征、结构或特点。因此,应强调并注意的是,本说明书中在不同位置两次或多次提及的“一实施例”或“一个实施例”或“一个替代性实施例”并不一定是指同一实施例。此外,本说明书的一个或多个实施例中的某些特征、结构或特点可以进行适当的组合。
此外,本领域技术人员可以理解,本说明书的各方面可以通过若干具有可专利性的种类或情况进行说明和描述,包括任何新的和有用的工序、机器、产品或物质的组合,或对他们的任何新的和有用的改进。相应地,本说明书的各个方面可以完全由硬件执行、可以完全由软件(包括固件、常驻软件、微码等)执行、也可以由硬件和软件组合执行。以上硬件或软件均可被称为“数据块”、“模块”、“引擎”、“单元”、“组件”或“系统”。此外,本说明书的各方面可能表现为位于一个或多个计算机可读介质中的计算机产品,该产品包括计算机可读程序编码。
计算机存储介质可能包含一个内含有计算机程序编码的传播数据信号,例如在基带上或作为载波的一部分。该传播信号可能有多种表现形式,包括电磁形式、光形式等,或合适的组合形式。计算机存储介质可以是除计算机可读存储介质之外的任何计算机可读介质,该介质可以通过连接至一个指令执行系统、装置或设备以实现通讯、传播或传输供使用的程序。位于计算机存储介质上的程序编码可以通过任何合适的介质进行传播,包括无线电、电缆、光纤电缆、RF、或类似介质,或任何上述介质的组合。
本说明书各部分操作所需的计算机程序编码可以用任意一种或多种程序语言编写,包括面向对象编程语言如Java、Scala、Smalltalk、Eiffel、JADE、Emerald、C++、C#、VB.NET、Python等,常规程序化编程语言如C语言、Visual Basic、Fortran2003、Perl、COBOL2002、PHP、ABAP,动态编程语言如Python、Ruby和Groovy,或其他编程语言等。该程序编码可以完全在用户计算机上运行、或作为独立的软件包在用户计算机上运行、或部分在用户计算机上运行部分在远程计算机运行、或完全在远程计算机或处理设备上运行。在后种情况下,远程计算机可以通过任何网络形式与用户计算机连接,比如局域网(LAN)或广域网(WAN),或连接至外部计算机(例如通过因特网),或在云计算环境中,或作为服务使用如软件即服务(SaaS)。
此外,除非权利要求中明确说明,本说明书所述处理元素和序列的顺序、数字字母的使用、或其他名称的使用,并非用于限定本说明书流程和方法的顺序。尽管上述披露中通过各种示例讨论了一些目前认为有用的发明实施例,但应当理解的是,该类细节仅起到说明的目的,附加的权利要求并不仅限于披露的实施例,相反,权利要求旨在覆盖所有符合本说明书实施例实质和范围的修正和等价组合。例如,虽然以上所描述的系统组件可以通过硬件设备实现,但是也可以只通过软件的解决方案得以实现,如在现有的处理设备或移动设备上安装所描述的系统。
同理,应当注意的是,为了简化本说明书披露的表述,从而帮助对一个或多个发明实施例的理解,前文对本说明书实施例的描述中,有时会将多种特征归并至一个实施例、附图或对其的描述中。但是,这种披露方法并不意味着本说明书对象所需要的特征比权利要求中提及的特征多。实际上,实施例的特征要少于上述披露的单个实施例的全部特征。
一些实施例中使用了描述成分、属性数量的数字,应当理解的是,此类用于实施例描述的数字,在一些示例中使用了修饰词“大约”、“近似”或“大体上”来修饰。除非另外说明,“大约”、“近似”或“大体上”表明所述数字允许有±20%的变化。相应地,在一些实施例中,说明书和权利要求中使用的数值参数均为近似值,该近似值根据个别实施例所需特点可以发生改变。在一些实施例中,数值参数应考虑规定的有效数位并采用一般位数保留的方法。尽管本说明书一些实施例中用于确认其范围广度的数值域和参数为近似值,在具体实施例中,此类数值的设定在可行范围内尽可能精确。
针对本说明书引用的每个专利、专利申请、专利申请公开物和其他材料,如文章、书籍、说明书、出版物、文档等,特此将其全部内容并入本说明书作为参考。与本说明书内容不一致或产生冲突的申请历史文件除外,对本说明书权利要求最广范围有限制的文件(当前或之后附加于本说明书中的)也除外。需要说明的是,如果本说明书附属材料中的描述、定义、和/或术语的使用与本说明书所述内容有不一致或冲突的地方,以本说明书的描述、定义和/或术语的使用为准。
最后,应当理解的是,本说明书中所述实施例仅用以说明本说明书实施例的原则。其他的变形也可能属于本说明书的范围。因此,作为示例而非限制,本说明书实施例的替代配置可视为与本说明书的教导一致。相应地,本说明书的实施例不仅限于本说明书明确介绍和描述的实施例。
Claims (9)
1.一种区块链智能合约的测试方法,包括:
确定智能合约中的待测试代码段;
对所述待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常场景;
基于预先确定的代码段与变量对应关系,确定能够触发所述待测试代码段的测试变量及其取值;所述代码段与变量对应关系反映不同变量与不同代码段的对应关系,和/或反映不同变量的不同取值与不同代码段的对应关系;其中,代码段能够被其对应的变量或对应的变量取值触发;
向所述智能合约中的所述测试变量输入所述取值,以触发所述待测试代码段并获得所述待测试代码段在所述异常场景下的测试结果。
2.如权利要求1所述的方法,所述代码段与变量对应关系通过以下步骤获取:
获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序及其一个或多个测试变量及其取值;
对于一个或多个历史测试的计算机程序中的任一个计算机程序:
逐一向所述任一个计算机程序的各测试变量输入其对应的取值,获得所述各测试变量能够触发的所述任一个计算机程序的代码段;
基于触发结果,建立所述各测试变量与所述任一个计算机程序各代码段的对应关系。
3.如权利要求1所述的方法,所述代码段与变量对应关系通过以下步骤获取:
获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序及其一个或多个测试变量及其取值;
对于一个或多个历史测试的计算机程序中的任一个计算机程序及其任一个测试变量:
对所述任一个计算机程序的所述任一个测试变量的所述取值进行增量变化,向所述任一个计算机程序的所述任一个测试变量输入变化后的取值,获得变化后的取值能够触发的所述任一个计算机程序的代码段,以此重复,建立所述任一个测试变量的不同取值与所述任一个计算机程序各代码段的对应关系。
4.如权利要求1所述的方法,所述对所述待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常场景,包括:
在所述代码段添加异常触发代码行或修改所述代码段中的部分代码行以进行异常注入。
5.一种区块链智能合约的测试系统,包括:
代码段确定模块:用于确定智能合约中的待测试代码段;
异常注入模块:用于对所述待测试代码段进行异常注入,以使得当该待测试代码段被执行时能够出现预设的异常场景;
测试变量值确定模块:用于基于预先确定的代码段与变量对应关系,确定能够触发所述待测试代码段的测试变量及其取值;所述代码段与变量对应关系反映不同变量与不同代码段的对应关系,和/或反映不同变量的不同取值与不同代码段的对应关系;其中,所述代码段能够被其对应的变量或对应的变量取值触发;
测试模块:用于向所述智能合约中的所述测试变量输入所述取值,以触发所述待测试代码段并获得所述待测试代码段在所述异常场景下的测试结果。
6.如权利要求5所述的系统,还包括对应关系确定模块,用于:
获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序及其一个或多个测试变量及其取值;
对于一个或多个历史测试的计算机程序中的任一个计算机程序:
逐一向所述任一个计算机程序的各测试变量输入其对应的取值,获得所述各测试变量能够触发的所述任一个计算机程序的所述代码段;
基于触发结果,建立所述各测试变量与所述任一个计算机程序各代码段的对应关系。
7.如权利要求5所述的系统,还包括对应关系确定模块,用于:
获取单元测试案例集,所述单元测试案例集至少包括一个或多个历史测试的计算机程序及其一个或多个测试变量及其取值;
对于一个或多个历史测试的计算机程序中的任一个计算机程序及其任一个测试变量:
对所述任一个计算机程序的所述任一个测试变量的所述取值进行增量变化,向所述任一个计算机程序的所述任一个测试变量输入变化后的取值,获得变化后的取值能够触发的所述任一个计算机程序的代码段,以此重复,建立所述任一个测试变量的不同取值与所述任一个计算机程序各代码段的对应关系。
8.如权利要求5所述的系统,所述异常注入模块还用于:
在所述代码段添加异常触发代码行或修改所述代码段中的部分代码行以进行异常注入。
9.一种区块链智能合约的测试装置,包括至少一个存储介质和至少一个处理器,所述至少一个存储介质用于存储计算机指令;所述至少一个处理器用于执行所述计算机指令以实现如权利要求1~4任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011552436.3A CN112286828B (zh) | 2020-12-24 | 2020-12-24 | 一种区块链智能合约的测试方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011552436.3A CN112286828B (zh) | 2020-12-24 | 2020-12-24 | 一种区块链智能合约的测试方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112286828A CN112286828A (zh) | 2021-01-29 |
CN112286828B true CN112286828B (zh) | 2021-07-06 |
Family
ID=74426162
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011552436.3A Active CN112286828B (zh) | 2020-12-24 | 2020-12-24 | 一种区块链智能合约的测试方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112286828B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112785439A (zh) * | 2021-03-19 | 2021-05-11 | 中国工商银行股份有限公司 | 测试被部署在区块链节点上的智能合约的方法及装置 |
CN113204765B (zh) * | 2021-04-27 | 2022-09-30 | 交叉信息核心技术研究院(西安)有限公司 | 一种Hyperledger Fabric链码的测试方法及系统 |
CN112967059A (zh) * | 2021-05-18 | 2021-06-15 | 支付宝(杭州)信息技术有限公司 | 一种测试资损监控系统的变异智能合约生成方法和系统 |
CN116244195B (zh) * | 2023-02-27 | 2023-09-22 | 安芯网盾(北京)科技有限公司 | 一种PHP rasp模块hook稳定性测试方法及装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109446814A (zh) * | 2018-09-30 | 2019-03-08 | 北京金山安全软件有限公司 | 一种漏洞检测方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8943474B1 (en) * | 2011-10-26 | 2015-01-27 | The Mathworks, Inc. | Code generation and execution for dynamic programming languages |
CN108681565B (zh) * | 2018-04-28 | 2020-11-10 | 百度在线网络技术(北京)有限公司 | 区块链数据并行处理方法、装置、设备和存储介质 |
-
2020
- 2020-12-24 CN CN202011552436.3A patent/CN112286828B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109446814A (zh) * | 2018-09-30 | 2019-03-08 | 北京金山安全软件有限公司 | 一种漏洞检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN112286828A (zh) | 2021-01-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112286828B (zh) | 一种区块链智能合约的测试方法和系统 | |
JP7164017B2 (ja) | フォールトツリー分析を使用して機能安全のため制御フローグラフを最適化するシステム及び方法 | |
US7882495B2 (en) | Bounded program failure analysis and correction | |
CN109032825B (zh) | 一种故障注入方法、装置及设备 | |
US9081892B2 (en) | Software verification | |
CN109101815B (zh) | 一种恶意软件检测方法及相关设备 | |
Morgado et al. | Mobile GUI testing | |
CN110704306A (zh) | 测试中的断言处理方法、装置、设备及存储介质 | |
CN111045927A (zh) | 性能测试评估方法、装置、计算机设备及可读存储介质 | |
US9058427B2 (en) | Iterative generation of symbolic test drivers for object-oriented languages | |
US9396097B2 (en) | Methods, circuits, devices, systems and associated computer executable code for testing software code | |
US10069855B1 (en) | Automated security analysis of software libraries | |
CN110851352A (zh) | 一种模糊测试系统及终端设备 | |
Calvagna et al. | Automated conformance testing of Java virtual machines | |
CN113127331B (zh) | 一种基于故障注入的测试方法、装置及计算机设备 | |
EP3765965B1 (en) | Static software analysis tool approach to determining breachable common weakness enumerations violations | |
CN109189671B (zh) | 逐层夹逼式变量定位方法、系统及终端设备 | |
CN112819621B (zh) | 一种智能合约资损测试方法及系统 | |
CN115080426A (zh) | 程序文件的检测方法及装置、存储介质和电子设备 | |
CN115827291A (zh) | 软件的持续监视和/或提供 | |
Marques et al. | Injecting software faults in python applications: The openstack case study | |
US20220164277A1 (en) | Analysis and Testing of Embedded Code | |
CN112967059A (zh) | 一种测试资损监控系统的变异智能合约生成方法和系统 | |
US8639490B2 (en) | Concretization of abstracted traces | |
Kim et al. | An analysis on secure coding using symbolic execution engine |
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: 40045813 Country of ref document: HK |