CN112817846B - 一种并发程序的蜕变测试方法 - Google Patents

一种并发程序的蜕变测试方法 Download PDF

Info

Publication number
CN112817846B
CN112817846B CN202110109436.4A CN202110109436A CN112817846B CN 112817846 B CN112817846 B CN 112817846B CN 202110109436 A CN202110109436 A CN 202110109436A CN 112817846 B CN112817846 B CN 112817846B
Authority
CN
China
Prior art keywords
test case
sequence
execution
program
violated
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
Application number
CN202110109436.4A
Other languages
English (en)
Other versions
CN112817846A (zh
Inventor
孙昌爱
代贺鹏
耿宁
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
University of Science and Technology Beijing USTB
Original Assignee
University of Science and Technology Beijing USTB
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by University of Science and Technology Beijing USTB filed Critical University of Science and Technology Beijing USTB
Priority to CN202110109436.4A priority Critical patent/CN112817846B/zh
Publication of CN112817846A publication Critical patent/CN112817846A/zh
Application granted granted Critical
Publication of CN112817846B publication Critical patent/CN112817846B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3692Test management for test results analysis
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

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)
  • Test And Diagnosis Of Digital Computers (AREA)

Abstract

本发明针对并发程序测试中存在的测试预期问题,公开了一种并发程序的蜕变测试方法,所述蜕变测试方法包括:针对并发程序执行交错的特点,以能够触发数据竞争的交错场景指导蜕变关系模式的识别;将原始测试用例的执行轨迹作为原始执行序列,依据蜕变关系模式生成衍生测试用例,并控制衍生测试用例的执行;通过比较衍生测试用例与原始测试用例的输出结果是否违反当前蜕变关系模式,进行测试结果验证;同时提出了一种并发程序的蜕变关系模式,指导衍生测试用例的生成及测试结果判定。本发明通过缩小并发程序的交错空间,优化了程序的执行过程,能够有效检测出并发程序中的数据竞争故障。

Description

一种并发程序的蜕变测试方法
技术领域
本发明涉及软件测试技术领域,特别涉及一种并发程序的蜕变测试方法。
背景技术
并发程序存在多个同时执行的流程,流程之间通常显式或隐式地共享一些存储空间,并且它们执行的次序不确定。并发流程之间不确定的相互作用与影响的情形通常简称为执行交错。执行交错不仅易于导致并发程序在设计阶段引入新的缺陷,而且给并发程序的分析与测试带来了挑战。如何有效地检测并发程序中潜藏的缺陷、提高并发程序的可靠性已经成为并发程序开发领域一个亟待解决的重要问题。
软件测试是一种广泛采用的软件质量保证手段,通过运行有限的测试用例,比较测试用例的输出与预期输出是否一致来检测软件中潜藏的故障。
与传统的顺序执行程序相比,并发程序的测试工作更具挑战性。由于流程之间执行的次序不确定,每一种流程执行序列对应一个交错模式。在某些交错模式下指令的执行顺序和开发人员的预期不同或者并发程序输出的结果与预期不同,即并发程序具有不确定的交错模式。因此,并发程序的测试预期问题不仅存在,而且更加突出。研究者将死锁、程序崩溃、违反断言作为测试预期,判断测试结果是否正确。然而,程序执行过程中发生了数据竞争可能不会引起程序死锁或者崩溃,也可能不会违反插入的断言,导致上述方法不适用于揭示数据竞争类型的故障。
发明内容
本发明提供了一种并发程序的蜕变测试方法,以解决并发程序测试中的测试预期问题。
为解决上述技术问题,本发明提供了如下技术方案:
一方面,本发明提供了一种并发程序的蜕变测试方法,包括:
从能够触发数据竞争故障的交错场景中识别出蜕变关系模式;
基于识别出的蜕变关系模式,对待测并发程序执行原始测试用例,获取所述原始测试用例的执行轨迹,并收集所述原始测试用例的执行结果;
基于所述原始测试用例的执行轨迹,获取所述原始测试用例的执行序列,将所述原始测试用例的执行序列与已知的交错场景进行匹配,依据匹配结果选择相应的蜕变关系模式,在相应的蜕变关系模式指导下生成衍生测试用例;
控制待测并发程序执行所述衍生测试用例,得到衍生测试用例的执行结果;
当所述原始测试用例的执行结果与所述衍生测试用例的执行结果之间的关系不符合当前蜕变关系模式指定的关系时,判断并发程序中存在数据竞争故障;
当本次对待测并发程序的测试状态满足预设的终止条件时,停止测试。
进一步地,所述从能够触发数据竞争故障的交错场景中识别出蜕变关系模式,包括:
基于并发程序的蜕变属性,并结合并发程序的执行交错的特点,从能够触发数据竞争故障的交错场景中识别出蜕变关系模式,指定原始测试用例的执行序列和衍生测试用例的执行序列之间的关系,以及执行结果之间的关系。
进一步地,所述基于所述原始测试用例的执行轨迹,获取所述原始测试用例的执行序列,包括:
从所述原始测试用例的执行轨迹中提取与共享变量有关的读写事件,作为所述原始测试用例的执行序列。
进一步地,将原始测试用例的执行序列与已知的交错场景进行匹配,包括:
分析每一交错场景包含的事件类型,将具有完全相同事件类型的交错场景划分为一组,并提取每组交错场景的特征;
将所述原始测试用例的执行序列的特征与各组交错场景的特征依次进行比对,选择与原始测试用例的执行序列具有相同特征的交错场景,得到匹配结果。
进一步地,所述交错场景的特征用三元组F=(L,T,E)表示;其中,L表示共享变量集合,T表示线程集合,E表示读写事件集合。
进一步地,所述在相应的蜕变关系模式指导下生成衍生测试用例,包括:
在所述原始执行序列的基础上,由相应的蜕变关系模式指导生成所述衍生测试用例的执行序列,与所述原始测试用例的测试数据一起组成衍生测试用例。
进一步地,所述控制待测并发程序执行所述衍生测试用例,得到衍生测试用例的执行结果,包括:
通过字节码插桩技术向待测并发程序的字节码文件中插入线程调度器;
通过所述线程调度器读取所述衍生测试用例的执行序列,控制线程按照所述衍生测试用例的执行序列执行,得到所述衍生测试用例的执行结果。
进一步地,所述通过字节码插桩技术向待测并发程序的字节码文件中插入线程调度器,包括:
编译待测并发程序源代码,得到字节码文件;
在所述字节码文件被加载到JVM之前对字节码进行拦截;
向所述字节码文件中插入所述线程调度器的语句,并将插入所述线程调度器的语句后的字节码文件加载到JVM中执行。
进一步地,通过所述线程调度器读取所述衍生测试用例的执行序列,控制线程按照所述衍生测试用例的执行序列执行,得到所述衍生测试用例的执行结果,包括:
采用信号量和可重入锁控制测试用例中线程的状态;
开启一个守护进程循环执行监控程序的状态,并依据所述衍生测试用例的执行序列选择相应线程继续执行,以得到所述衍生测试用例的执行结果。
进一步地,所述预设的测试终止条件为:当前执行的测试用例对应的执行序列覆盖了所述待测并发程序所有适用的可以触发数据竞争故障的交错场景。
另一方面,本发明还提供了一种电子设备,其包括处理器和存储器;其中,存储器中存储有至少一条指令,所述指令由处理器加载并执行以实现上述方法。
再一方面,本发明还提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令,所述指令由处理器加载并执行以实现上述方法。
本发明提供的技术方案带来的有益效果至少包括:
本发明针对并发程序测试过程中的测试预期问题,依据并发程序执行交错的特点,提出了一种并发程序的蜕变测试方法,本发明所提出的并发程序的蜕变测试方法无需测试预期便可有效检测出并发程序中的数据竞争故障,有效提高了并发程序数据竞争故障的检测效率和自动化程度,具有广阔的应用前景。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的并发程序的蜕变测试方法的执行流程示意图;
图2是本发明实施例提供的衍生测试用例生成过程示意图;
图3是本发明实施例提供的字节码插桩过程示意图;
图4是本发明实施例提供的插桩前后字节码文件部分内容示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
第一实施例
首先需要说明的是,蜕变测试是一种缓解测试预期问题的技术。该技术利用待测程序存在的某种内在属性(蜕变属性)生成测试用例(包括原始测试用例和衍生测试用例),然后执行原始测试用例与衍生测试用例获得对应输出,通过验证输出之间是否满足某种关系(蜕变关系)进行测试结果判定。蜕变测试技术无需知道每个测试用例对应的预期输出结果,能够有效缓解测试预期问题。
基于上述,针对并发程序测试过程中的测试预期问题,本实施例提供了一种并发程序的蜕变测试方法,该方法可以由电子设备实现,该电子设备可以是终端或者服务器。该蜕变测试方法的执行流程如图1所示,包括以下步骤:
S1,从能够触发数据竞争故障的交错场景中识别出蜕变关系模式;
需要说明的是,上述步骤是为了实现蜕变关系模式识别,蜕变关系识别是蜕变测试的核心问题。在面对顺序程序的蜕变测试技术中,仅依据程序规格说明中描述的属性来识别蜕变关系不足以识别出良好的蜕变关系,在更复杂的并发程序测试中,识别蜕变关系不仅需要考虑程序的蜕变属性还需要考虑并发程序的执行交错。为此,本实施例的方法在实现蜕变关系模式识别时,结合了并发程序执行交错的特点,从能够触发数据竞争故障的交错场景中识别出蜕变关系模式,定义了原始测试用例和衍生测试用例之间的关系和输出之间的关系。
与传统的测试用例定义不同,并发程序的测试用例用二元组C=(X,S)表示,其中X为并发程序的测试数据,S为测试数据X的一种执行序列。执行序列是程序执行过程中的事件集合,并发程序多个流程之间的交错导致同一个程序执行同一个测试用例有多种执行序列。蜕变关系模式的定义为假设并发程序P是函数f的实现,给定一个测试用例C=(X,S),其中,X表示并发程序的测试数据,S表示并发程序的执行序列,f(X,S)是测试数据X在执行序列为S时的函数结果(P的输出)。如果两次执行序列之间的关系R使得输出之间满足关系Rf(R((X,Ss),(X,Sf))→Rf(f(X,Ss),f(X,Sf))),则MRP(R,Rf)为程序P的蜕变关系模式,其中(X,Ss)为原始测试用例,(X,Sf)为衍生测试用例。
具体地,依据给出的蜕变关系模式定义,本实施例从能够触发数据竞争故障的交错场景中识别14个蜕变关系模式如下:
MRP1:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l)Wu’(l)Wu(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反;否则,蜕变关系模式不被违反。
MRP2:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l)Wu'(l)Ru(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP3:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l)Ru'(l)Wu(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP4:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l)Wu'(l)Ru(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP5:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l)Wu'(l)Wu(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP6:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Wu'(l1)Wu'(l2)Wu(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP7:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Wu'(l2)Wu'(l1)Wu(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP8:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Wu'(l2)Wu(l2)Wu'(l1)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP9:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Ru'(l1)Ru'(l2)Wu(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP10:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Ru'(l2)Ru'(l1)Wu(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP11:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l1)Wu'(l1)Wu'(l2)Ru(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP12:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l1)Wu'(l2)Wu'(l1)Ru(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP13:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l1)Wu'(l2)Ru(l2)Wu'(l1)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
MRP14:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Ru'(l2)Wu(l2)Ru'(l1)场景序列,则该序列作为Sf并与X一起构成衍生测试用例。如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
此处,需要强调的是,本实施例识别的蜕变关系不仅考虑了程序的蜕变属性还考虑到并发程序执行交错的特点。结合程序的执行交错信息,依据能够触发数据竞争故障的交错场景提出了蜕变关系模式,从而指导后续衍生测试用例的生成,并进行测试结果验证。
S2,基于识别出的蜕变关系模式,对待测并发程序执行原始测试用例,获取所述原始测试用例的执行轨迹,并收集所述原始测试用例的执行结果;
需要说明的是,基于上述蜕变关系模式,S2的实现过程具体如下:
首先选择待测并发程序和原始测试用例的测试数据(Junit脚本),然后对该测试用例执行待测并发程序,收集测试用例的执行轨迹和原始测试用例的执行结果。其中,测试用例的执行轨迹为一系列事件组成的有序集合,执行序列是一系列读写事件组成的有序列表,表示为S=<Wt(l)/Rt(l),…,Wt(l)/Rt(l)>,其中Wt(l)表示线程t对共享变量l进行写操作,Rt(l)表示线程t对共享变量l进行读操作。
进一步地,本实施例集成了一个支持Java并发程序记录程序运行时事件序列的工具,将记录的事件序列作为并发程序的蜕变测试过程中原始测试用例的执行轨迹,并收集原始测试用例的输出结果。
S3,基于所述原始测试用例的执行轨迹,获取所述原始测试用例的执行序列,将所述原始测试用例的执行序列与已知的交错场景进行匹配,依据匹配结果选择相应的蜕变关系模式,在相应的蜕变关系模式指导下生成衍生测试用例;
需要说明的是,在本实施例中,运用上述原始测试用例执行轨迹和蜕变关系模式生成衍生测试用例的过程如图2所示,包括以下过程:
首先进行交错场景匹配得到可以应用的交错场景,具体方法为:进行交错场景匹配前,首先分析每个场景包含的事件类型,然后将具有完全相同事件类型的场景分为一组Gi(i=1,2,..,6),然后提取每一组的特征,用三元组F=(L,T,E)表示特征,其中L表示共享变量集合,T表示线程集合,E表示读写事件集合。交错场景匹配的过程为:针对上述记录的原始测试用例执行轨迹进行解析,提取相关的读写事件组成原始测试用例执行序列,然后分析原始执行序列的特征,将原始测试用例执行序列的特征与每组交错场景特征进行匹配,并记录匹配结果,如果相同则认为该组内的所有交错场景均可指导生成衍生测试用例执行序列。接下来依据匹配的到的交错场景,分别选择对应的蜕变关系模式。最后在蜕变关系模式的指导下由原始测试用例的执行序生成衍生测试用例的执行序列,与原始测试用例的测试数据一起组成衍生测试用例。
S4,控制待测并发程序执行衍生测试用例,得到衍生测试用例的执行结果;
需要说明的是,在本实施例中,控制衍生测试用例执行的具体方法如下:
通过字节码插桩技术向待测并发程序的字节码中插入线程调度器,如图3所示,其实现过程为:(1)编译待测并发程序源代码得到字节码文件;(2)在字节码文件被加载到JVM之前对字节码进行拦截;(3)向字节码文件中插入线程调度器的语句,并将新的字节码文件加载到JVM中执行。
借助上述步骤后,程序在执行过程中会执行到新插入的调度函数,调度函数控制程序按照衍生执行序列执行,所述线程调度器会首先暂停程序中所有运行状态的线程,同时开启守护进程循环执行,依据衍生执行序列选择相应的线程继续执行,直到程序执行结束,获得衍生测试用例的执行结果。其具体实现过程为:(1)通过调用可重入锁阻塞当前线程的执行,存储线程信息;(2)开启守护进程循环执行,判断程序当前状态是否可以释放线程执行,如果可以,则读取衍生执行序列,按照该序列从阻塞的线程集合中选择线程释放。
经过上述步骤后,得到程序衍生测试用例的输出结果。
S5,判断原始测试用例的执行结果与衍生测试用例的执行结果间的关系是否符合所选蜕变关系模式指定的关系,若不符合,则程序中存在数据竞争故障;
S6,判断本次对待测并发程序的测试状态是否满足预设的终止条件,如果满足终止条件,则停止测试;否则,继续进行测试。
需要说明的是,并发程序在执行过程中执行交错的数量非常庞大,在测试资源受限的情形下探索所有的执行交错是不可能的。由于只有触发特定交错场景的测试用例才能检测出并发故障,本发明在应用蜕变测试缓解并发程序的测试预期问题时,为了减小程序执行过程中探索交错空间的规模,采用能够触发数据竞争故障的交错场景来指导测试用例执行特定的交错。
基于上述,本实施例所设定的测试终止条件为:执行的测试用例对应的执行序列覆盖了待测并发程序所有适用的可以触发数据竞争故障的交错场景。也即,如果执行的测试用例对应的执行序列覆盖了待测程序所有适用的可以触发数据竞争故障的场景,则认为已充分探索了该并发程序的交错空间,测试停止。
下面,为进一步说明本实施例方法的性能,结合表1所示的并发程序,用一个实例说明应用本实施例的蜕变测试方法来测试并发程序的整个过程。
表1展示了一个支持多线程访问的并发程序的关键代码,包含一个共享变量a和两个函数f1、f2。两个函数均对共享变量a进行操作,由于程序没有使用并发机制对共享变量进行同步保护,导致当有多个线程同时执行该并发程序时会发生数据竞争故障。
表1支持多线程访问的并发程序举例
首先从程序的输入域(所有整型数据域)中随机选择1个数作为原始测试用例的测试数据X(如,a=5),然后开启两个线程t1、t2测试程序功能,其中t1执行方法f1,t2执行方法f2。收集程序的原始输出Os=3和原始执行轨迹ST。从收集到执行轨迹ST中提取对共享变量a的读写事件得到原始执行序列Ss=Rt1(a)Wt1(a)Wt2(a)。经分析F(Ss)=F(G1),则Ss能够匹配到交错场景p1和p4。然后选择对应的蜕变关系模式:
(1)在MRP1指导下生成可达的衍生执行序列Sf=Rt1(a)Wt2(a)Wt1(a),然后与原始测试用例的测试数据X(a=5)组成衍生测试用例(X,Sf)。接下来使用线程调度器控制衍生测试用例的执行:首先获取源程序的字节码文件BF,读取字节码文件的过程中,在对a进行读写操作对应的指令之前插入调度函数SF,插桩前后的字节码文件部分内容如图4所示,BF’被加载到虚拟机执行。在执行过程中,当t1执行到图4的(b)图中的第3行被阻塞,t2执行到图4的(b)中的第9行被阻塞,此时依据Sf选择t1继续执行;当t1执行到第5行由运行状态转为阻塞状态,此时依据Sf选择t2继续执行;最后释放t1继续执行直到程序执行结束获取程序的输出Of=7。验证输出之间的关系发现Os≠Of,即MRP1被违反,说明程序中存在数据竞争故障。
(2)在MRP4指导下生成的衍生的序列Sf’=Wt1(a)Wt2(a)Rt1(a),Sf’违反了程序的线程内串行规则(属于同一个线程所有事件中,事件n一定发生在事件n+1之前),因此,Sf’不能作为衍生测试用例的执行序列。
当前满足测试终止条件,测试停止。
综上,本实施例针对并发程序测试过程中的测试预期问题,提出了一种并发程序的蜕变测试方法,提高了检测数据竞争故障的效率。并发程序不确定的执行交错的特点,导致并发程序测试过程中测试预期问题突出存在。本实施例针对并发程序执行交错的特点,以能够触发数据竞争的交错场景指导蜕变关系模式的识别;将原始测试用例的执行轨迹作为原始执行序列,依据蜕变关系模式生成衍生测试用例,并控制衍生测试用例的执行;通过比较衍生测试用例与原始测试用例的输出结果是否违反蜕变关系模式进行结果验证;此外,本实施例还提出了一种并发程序的蜕变关系模式,用来指导衍生测试用例的生成并进行测试结果判定。本实施例的测试方法无需测试预期即可有效检测并发程序数据竞争故障,有效提高了并发程序数据竞争故障的检测效率和自动化程度。
第二实施例
本实施例提供一种电子设备,其包括处理器和存储器;其中,存储器中存储有至少一条指令,所述指令由处理器加载并执行,以实现第一实施例的方法。
该电子设备可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(central processing units,CPU)和一个或一个以上的存储器,其中,存储器中存储有至少一条指令,所述指令由处理器加载并执行上述方法。
第三实施例
本实施例提供一种计算机可读存储介质,该存储介质中存储有至少一条指令,所述指令由处理器加载并执行,以实现上述第一实施例的方法。其中,该计算机可读存储介质可以是ROM、随机存取存储器、CD-ROM、磁带、软盘和光数据存储设备等。其内存储的指令可由终端中的处理器加载并执行上述方法。
此外,需要说明的是,本发明可提供为方法、装置或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
还需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
最后需要说明的是,以上所述是本发明优选实施方式,应当指出,尽管已描述了本发明优选实施例,但对于本技术领域的技术人员来说,一旦得知了本发明的基本创造性概念,在不脱离本发明所述原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。

Claims (10)

1.一种并发程序的蜕变测试方法,其特征在于,包括:
从能够触发数据竞争故障的交错场景中识别出蜕变关系模式;
基于识别出的蜕变关系模式,对待测并发程序执行原始测试用例,获取所述原始测试用例的执行轨迹,并收集所述原始测试用例的执行结果;
基于所述原始测试用例的执行轨迹,获取所述原始测试用例的执行序列,将所述原始测试用例的执行序列与已知的交错场景进行匹配,依据匹配结果选择相应的蜕变关系模式,在相应的蜕变关系模式指导下生成衍生测试用例;
控制待测并发程序执行所述衍生测试用例,得到衍生测试用例的执行结果;
当所述原始测试用例的执行结果与所述衍生测试用例的执行结果之间的关系不符合当前蜕变关系模式指定的关系时,判断并发程序中存在数据竞争故障;
当本次对待测并发程序的测试状态满足预设的终止条件时,停止测试;
所述蜕变关系模式的定义为假设并发程序P是函数f的实现,给定一个测试用例C=(X,S),其中,X表示并发程序的测试数据,S表示并发程序的执行序列,f(X,S)是测试数据X在执行序列为S时的函数结果,也即P的输出;如果两次执行序列之间的关系R使得输出之间满足关系Rf(R((X,Ss),(X,Sf))→Rf(f(X,Ss),f(X,Sf))),则MRP(R,Rf)为程序P的蜕变关系模式,其中,(X,Ss)为原始测试用例,(X,Sf)为衍生测试用例;
依据给出的蜕变关系模式定义,从能够触发数据竞争故障的交错场景中识别14个蜕变关系模式如下:
MRP1:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l)Wu’(l)Wu(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反;否则,蜕变关系模式不被违反;
MRP2:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l)Wu'(l)Ru(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP3:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l)Ru'(l)Wu(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP4:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l)Wu'(l)Ru(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP5:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l)Wu'(l)Wu(l)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP6:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Wu'(l1)Wu'(l2)Wu(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP7:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Wu'(l2)Wu'(l1)Wu(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP8:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Wu'(l2)Wu(l2)Wu'(l1)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP9:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Ru'(l1)Ru'(l2)Wu(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP10:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Ru'(l2)Ru'(l1)Wu(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP11:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l1)Wu'(l1)Wu'(l2)Ru(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP12:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l1)Wu'(l2)Wu'(l1)Ru(l2)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP13:在待测程序上执行X,获得Ss,如果Ss能够匹配Ru(l1)Wu'(l2)Ru(l2)Wu'(l1)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反;
MRP14:在待测程序上执行X,获得Ss,如果Ss能够匹配Wu(l1)Ru'(l2)Wu(l2)Ru'(l1)场景序列,则该序列作为Sf并与X一起构成衍生测试用例;如果Os与Of不同,那么该蜕变关系模式被违反,揭示故障;否则,蜕变关系模式不被违反。
2.如权利要求1所述的并发程序的蜕变测试方法,其特征在于,所述从能够触发数据竞争故障的交错场景中识别出蜕变关系模式,包括:
基于并发程序的蜕变属性,并结合并发程序的执行交错的特点,从能够触发数据竞争故障的交错场景中识别出蜕变关系模式,指定原始测试用例的执行序列和衍生测试用例的执行序列之间的关系,以及执行结果之间的关系。
3.如权利要求1所述的并发程序的蜕变测试方法,其特征在于,所述基于所述原始测试用例的执行轨迹,获取所述原始测试用例的执行序列,包括:
从所述原始测试用例的执行轨迹中提取与共享变量有关的读写事件,作为所述原始测试用例的执行序列。
4.如权利要求1所述的并发程序的蜕变测试方法,其特征在于,将所述原始测试用例的执行序列与已知的交错场景进行匹配,包括:
分析每一交错场景包含的事件类型,将具有完全相同事件类型的交错场景划分为一组,并提取每组交错场景的特征;
将所述原始测试用例的执行序列的特征与各组交错场景的特征依次进行比对,选择与原始测试用例的执行序列具有相同特征的交错场景,得到匹配结果。
5.如权利要求4所述的并发程序的蜕变测试方法,其特征在于,所述交错场景的特征用三元组F=(L,T,E)表示;其中,L表示共享变量集合,T表示线程集合,E表示读写事件集合。
6.如权利要求1所述的并发程序的蜕变测试方法,其特征在于,所述在相应的蜕变关系模式指导下生成衍生测试用例,包括:
在所述原始测试用例的执行序列的基础上,由相应的蜕变关系模式指导生成所述衍生测试用例的执行序列,与所述原始测试用例的测试数据一起组成衍生测试用例。
7.如权利要求1所述的并发程序的蜕变测试方法,其特征在于,所述控制待测并发程序执行所述衍生测试用例,得到衍生测试用例的执行结果,包括:
通过字节码插桩技术向待测并发程序的字节码文件中插入线程调度器;
通过所述线程调度器读取所述衍生测试用例的执行序列,控制线程按照所述衍生测试用例的执行序列执行,得到所述衍生测试用例的执行结果。
8.如权利要求7所述的并发程序的蜕变测试方法,其特征在于,所述通过字节码插桩技术向待测并发程序的字节码文件中插入线程调度器,包括:
编译待测并发程序源代码,得到字节码文件;
在所述字节码文件被加载到JVM之前对字节码进行拦截;
向所述字节码文件中插入所述线程调度器的语句,并将插入所述线程调度器的语句后的字节码文件加载到JVM中执行。
9.如权利要求7所述的并发程序的蜕变测试方法,其特征在于,通过所述线程调度器读取所述衍生测试用例的执行序列,控制线程按照所述衍生测试用例的执行序列执行,得到所述衍生测试用例的执行结果,包括:
采用信号量和可重入锁控制测试用例中线程的状态;
开启一个守护进程循环执行监控程序的状态,并依据所述衍生测试用例的执行序列选择相应线程继续执行,以得到所述衍生测试用例的执行结果。
10.如权利要求1~9任一项所述的并发程序的蜕变测试方法,其特征在于,所述预设的测试终止条件为:当前执行的测试用例对应的执行序列覆盖了所述待测并发程序所有适用的可以触发数据竞争故障的交错场景。
CN202110109436.4A 2021-01-27 2021-01-27 一种并发程序的蜕变测试方法 Active CN112817846B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110109436.4A CN112817846B (zh) 2021-01-27 2021-01-27 一种并发程序的蜕变测试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110109436.4A CN112817846B (zh) 2021-01-27 2021-01-27 一种并发程序的蜕变测试方法

Publications (2)

Publication Number Publication Date
CN112817846A CN112817846A (zh) 2021-05-18
CN112817846B true CN112817846B (zh) 2023-08-08

Family

ID=75859650

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110109436.4A Active CN112817846B (zh) 2021-01-27 2021-01-27 一种并发程序的蜕变测试方法

Country Status (1)

Country Link
CN (1) CN112817846B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103365776A (zh) * 2013-06-28 2013-10-23 中国科学院计算技术研究所 基于确定性重放的并行系统弱一致性的验证方法和系统
CN104699595A (zh) * 2013-12-06 2015-06-10 北京大学 一种面向软件升级的软件测试方法
CN105843744A (zh) * 2016-04-22 2016-08-10 中国矿业大学 用于并行程序蜕变测试的蜕变关系优先级排序方法
CN111679978A (zh) * 2020-05-29 2020-09-18 腾讯科技(深圳)有限公司 一种程序测试方法、程序测试装置、电子设备及存储介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8510604B2 (en) * 2011-03-02 2013-08-13 Microsoft Corporation Static data race detection and analysis

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103365776A (zh) * 2013-06-28 2013-10-23 中国科学院计算技术研究所 基于确定性重放的并行系统弱一致性的验证方法和系统
CN104699595A (zh) * 2013-12-06 2015-06-10 北京大学 一种面向软件升级的软件测试方法
CN105843744A (zh) * 2016-04-22 2016-08-10 中国矿业大学 用于并行程序蜕变测试的蜕变关系优先级排序方法
CN111679978A (zh) * 2020-05-29 2020-09-18 腾讯科技(深圳)有限公司 一种程序测试方法、程序测试装置、电子设备及存储介质

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
基于路径相似度的消息传递并行程序多路径覆盖测试;潘峰;中国优秀硕士学位论文全文数据库 信息科技辑(第1期);I138-292 *

Also Published As

Publication number Publication date
CN112817846A (zh) 2021-05-18

Similar Documents

Publication Publication Date Title
Lam et al. Understanding reproducibility and characteristics of flaky tests through test reruns in Java projects
Sen Effective random testing of concurrent programs
Dean et al. Perfscope: Practical online server performance bug inference in production cloud computing infrastructures
Yu et al. Maple: A coverage-driven testing tool for multithreaded programs
US6851075B2 (en) Race detection for parallel software
US7844953B2 (en) Program, apparatus and method for verifying program
US7861118B2 (en) Machine instruction level race condition detection
Yang et al. Dynamically inferring temporal properties
Bouajjani et al. Verifying concurrent programs against sequential specifications
KR20110114432A (ko) 멀티스레드 프로그램에서 교착을 감지하기 위한 방법 및 시스템
CN109635568B (zh) 一种基于静态分析和模糊测试相结合的并发漏洞检测方法
KR101519450B1 (ko) 멀티스레드 프로그램에 대한 테스트 커버리지 정보를 이용한 자동 테스트 생성 장치, 방법 및 기록매체
Lin et al. A divergence-oriented approach to adaptive random testing of Java programs
CN106844215B (zh) 一种基于约束求解的原子违背探测方法
CN109918207A (zh) 一种非侵入的c程序死锁定位方法
CN109522207B (zh) 一种基于约束求解的原子集合序列化违背探测方法
Schimmel et al. Automatic generation of parallel unit tests
Leesatapornwongsa et al. FlakeRepro: Automated and efficient reproduction of concurrency-related flaky tests
CN112817846B (zh) 一种并发程序的蜕变测试方法
Tzoref et al. Instrumenting where it hurts: an automatic concurrent debugging technique
Jannesari et al. Automatic generation of unit tests for correlated variables in parallel programs
CN115080374B (zh) 一种基于偏序关系的通用并发缺陷检测方法及系统
Okech et al. Inherent diversity in replicated architectures
Wang et al. Detecting data races in interrupt-driven programs based on static analysis and dynamic simulation
Long et al. Checking linearizability with fine-grained traces

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