一种代码覆盖率的获取方法及系统转让专利

申请号 : CN202310753334.5

文献号 : CN116501648B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 冯通

申请人 : 北京云枢创新软件技术有限公司成都融见软件科技有限公司上海合见工业软件集团有限公司

摘要 :

本发明涉及本发明涉及电子设计自动化技术领域,特别是涉及一种代码覆盖率的获取方法及系统,其通过遍历源代码识别所有变量,将构成条件的变量标记为一个变量组,得到源代码中所有的变量和变量组;获取波形数据库,在波形数据库中分别查找每个变量的实际取值,得到每个变量的实际取值序列;根据每个变量组中所有变量的实际取值序列,获取每个变量组的实际取值组合序列;根据每个变量组的实际取值组合序列获取条件的结果,将结果与预设值列表进行匹配,根据匹配结果标记覆盖状态;根据每个变量的实际取值序列,标记覆盖状态;根据标记的覆盖状态统计代码覆盖率。该方法能够保证源代码不被破坏,相对于现有技术提高了编译效率和测试效率。

权利要求 :

1.一种代码覆盖率的获取方法,其特征在于,所述方法包括以下步骤:S100,遍历源代码识别所有变量,将构成条件的变量标记为一个变量组,得到源代码中所有的变量和变量组;

S200,获取波形数据库,所述波形数据库中保存有测试用例在执行过程中每个变量的所有实际取值;

S300,在波形数据库中分别查找每个变量的实际取值,得到每个变量的实际取值序列;

S400,根据每个变量组中所有变量的实际取值序列,获取每个变量组的实际取值组合序列;

S500,根据每个变量组的实际取值组合序列获取条件的结果,将结果与预设值列表进行匹配,根据匹配结果标记覆盖状态;

S600,根据每个变量的实际取值序列,标记覆盖状态;

S700,根据标记的覆盖状态统计代码覆盖率;

其中:S400还包括:每个变量组的实际取值组合序列的获取步骤:S410,获取每个变量的实际取值序列,根据实际取值序列获取每个实际取值的时刻得到每个变量的取值时间范围序列;

S420,根据每个变量的实际取值序列和取值时间范围序列,获取每个变量组中在同一时刻下所有变量的实际取值组合,得到实际取值组合序列,其中实际取值组合序列中的实际取值组合不同。

2.根据权利要求1所述的方法,其特征在于,所述S420中实际取值组合的获取步骤包括:获取取值时间范围序列的交集,得到交集序列;获取每个交集序列的时间范围内对应的实际取值组合。

3.根据权利要求1所述的方法,其特征在于,所述S500还包括:所述变量组的预设值列表为条件的真值表。

4.根据权利要求1所述的方法,其特征在于,所述S600还包括:当变量设有预设值列表时,将变量的实际取值序列中的每个实际取值分别与预设值列表进行匹配,根据匹配结果标记覆盖状态。

5.根据权利要求1所述的方法,其特征在于,所述S600还包括:当变量设有预设转移列表时,根据变量的实际取值序列中的相邻实际取值获取变量的所有实际取值转移序列;将变量的所有实际取值转移序列中的每个实际取值转移组合与预设转移列表进行匹配,根据匹配结果标记覆盖状态。

6.根据权利要求1所述的方法,其特征在于,S600还包括:S610,识别条件中的R个布尔表达式,获取R个布尔表达式的真值表;

S620,根据每个实际取值组合获取每个布尔表达式的实际取值,将布尔表达式的实际取值与布尔表达式的预设真值表进行匹配,匹配成功,则将布尔表达式的预设真值表标记为覆盖,否则标记为未覆盖。

7.一种代码覆盖率的获取系统,所述系统包括处理器和非瞬时性计算机可读存储介质,所述非瞬时性计算机可读存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由处理器加载并执行以实现权利要求1‑6任意一项所述的方法。

说明书 :

一种代码覆盖率的获取方法及系统

技术领域

[0001] 本发明涉及电子设计自动化技术领域,特别是涉及一种代码覆盖率的获取方法及系统。

背景技术

[0002] 在电子设计自动化(Electronic design automation,EDA)领域中,覆盖率是一个非常关键的数据,覆盖率是度量测试完整性的一个指标,表明验证人员关注的场景是否真的在测试用例执行时被覆盖到,通过覆盖情况可以调整后续测试用例的方向。覆盖率分为功能覆盖率和代码覆盖率,其中,代码覆盖率是从编程的角度分析代码是否被充分验证,能够体现目前的测试用例执行了哪些代码以及没有执行哪些代码,需要确保每个测试点都至少被覆盖过一次,不然就说明测试存在潜在的风险。
[0003] 代码覆盖率包括行覆盖率、条件覆盖率、有限状态机(Finite Sate Machine,FSM)覆盖率和跳转(toggle)覆盖率,目前代码覆盖率的获取方法是:在对源代码进行编译时,在源代码中插入相应的代码段,用于记录监测的对象是否被执行。例如,行覆盖率时是对每行可执行语句中插入相应代码段,用于记录该行是否被执行,被执行则为覆盖,未被执行则为未覆盖。通过相同的手段,在编译时也可以插入相应代码段用于监测参数和表达式等是否被执行。
[0004] 上述现有技术存在以下问题:
[0005] 1.上述方式需要通过破坏源代码的方式插入相应的代码段统计覆盖状态,该方式有可能会破坏源代码原始的逻辑。
[0006] 2.上述方式需要插入相应的代码段,大幅度的增加了代码的大小,并且由于插入的代码段在不断的dump数据,因此会拖慢测试进程,大幅度的降低了测试效率。
[0007] 3.由于在编译的过程中需要插入相应的代码段,该操作还会拖慢编译时间,降低编译效率。

发明内容

[0008] 针对上述技术问题,本发明采用的技术方案为:
[0009] 第一方面,本发明实施例提供了一种代码覆盖率的获取方法,所述方法包括以下步骤:
[0010] S100,遍历源代码识别所有变量,将构成条件的变量标记为一个变量组,得到源代码中所有的变量和变量组。
[0011] S200,获取波形数据库,所述波形数据库中保存有测试用例在执行过程中每个变量的所有实际取值。
[0012] S300,在波形数据库中分别查找每个变量的实际取值,得到每个变量的实际取值序列。
[0013] S400,根据每个变量组中所有变量的实际取值序列,获取每个变量组的实际取值组合序列。
[0014] S500,根据每个变量组的实际取值组合序列获取条件的结果,将结果与预设值列表进行匹配,根据匹配结果标记覆盖状态。
[0015] S600,根据每个变量的实际取值序列,标记覆盖状态。
[0016] S700,根据标记的覆盖状态统计代码覆盖率。
[0017] 第二方面,本发明另一个实施例提供了一种代码覆盖率的获取系统,所述系统包括处理器和非瞬时性计算机可读存储介质,所述非瞬时性计算机可读存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由处理器加载并执行以实现前述代码覆盖率的获取方法。
[0018] 本发明与现有技术相比具有明显的有益效果,借由上述技术方案,本发明提供的一种代码覆盖率的获取方法及系统可达到相当的技术进步性及实用性,并具有产业上的广泛利用价值,其至少具有以下有益效果:
[0019] 本发明提供了一种代码覆盖率的获取方法及系统,其通过后处理的方式,将测试用例在执行过程中所有变量的实际取值都保存在数据库中,识别源代码中变量以及条件,并结合预设值列表,判断覆盖状态,进而计算覆盖率。该方法能够保证源代码不被破坏,相对于现有技术提高了编译效率和测试效率,解决了现有技术中通过破源代码的方式统计覆盖率导致源代码逻辑遭到破坏以及测试效率和编译效率低的问题。

附图说明

[0020] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0021] 图1为本发明实施例提供的一种代码覆盖率的获取方法流程图。

具体实施方式

[0022] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0023] 请参阅图1,图1示出了一种代码覆盖率的获取方法流程图,所述方法包括以下步骤:
[0024] S100,遍历源代码识别所有变量,将构成条件的变量标记为一个变量组,得到源代码中所有的变量和变量组。
[0025] 可选的,遍历源代码识别每行中的所有变量,统计所有行中的所有变量。需要说明的是,一个变量可能会出现在源代码的不同行中,在执行源代码时同一个变量可能会出现多次取值,将同一个变量的所有取值都记录到波形数据库中,在统计变量时需要去重,只统计一个变量。
[0026] 可选的,构成条件的变量的获取步骤包括:判断每行中多个变量之间或者变量与常量之间是否符合条件表达式,若是,则将构成条件的所有变量标记为一个变量组。
[0027] 其中,当满足条件表达式时,则可执行条件块中的相应语句。可选的,条件块包括if条件块和多分支条件块。
[0028] S200获取波形数据库,所述波形数据库中保存有测试用例在执行过程中每个变量的所有实际取值。
[0029] 需要说明的是,波形数据库保存每个变量的所有实际取值,同时也保存每个实际取值对应的时刻。
[0030] S300,在波形数据库中分别查找每个变量的实际取值,得到每个变量的实际取值序列。需要说明的是,以S100中所获取到的变量为索引能够查到每个变量对应的实际取值序列。
[0031] S400,根据每个变量组中所有变量的实际取值序列,获取每个变量组的实际取值组合序列。
[0032] 可选的,每个变量组的实际取值组合序列的获取步骤包括:
[0033] S410,获取每个变量的实际取值序列,根据实际取值序列获取每个实际取值的时刻得到每个变量的取值时间范围序列。需要说明的是,在波形数据库中记载了数据发生变化时的时刻和变化的差异值,通过解析能够得到发生变化的时刻和变化之后的值。例如解析之后得到在第5ns时实际取值变化为a,第10ns时实际取值变化为b,则实际取值a的取值时间范围为5‑10ns,以此类推,得到所有实际取值的取值时间范围。
[0034] S420,根据每个变量的实际取值序列和取值时间范围序列,获取每个变量组中在同一时刻下所有变量的实际取值组合,得到实际取值组合序列,其中实际取值组合序列中的实际取值组合不同。其中,实际取值组合序列中每一个取值组合对应条件的一个解,限定实际取值组合不同的目的在于限定条件的解不同。
[0035] 进一步,实际取值组合的获取步骤包括:获取取值时间范围序列的交集,得到交集序列;获取每个交集序列的时间范围内对应的实际取值组合。
[0036] 例如,对于变量组中的两个变量R和T,R的实际取值为{a,b,c,a}且取值时间范围为{(5,10),(10,30),(30,35),(35,50)},T的实际取值{f,g,f}且取值时间范围为{(5,20),(20,40),(40,55)},则在同一时刻下变量R和T的实际取值组合为{(a,f),(b,f),(b,g),(c,g),(a,g),(a,f)},其相应的时间范围序列为{(5,10),(10,20),(20,30),(30,35),(35,40),(40,50)},在时间范围(5,10)和(40,50)均对应实际取值组合(a,f),由于(a,f)对应同一覆盖结果,因此保留其中任意一个(a,f)即可。
[0037] S500,根据每个变量组的实际取值组合序列获取条件的结果序列,将结果序列与预设值列表进行匹配,根据匹配结果标记覆盖状态。
[0038] 其中,将实际取值组合序列中的每个实际取值组合代入条件中计算结果,得到与实际取值组合序列对应的结果序列。
[0039] 其中,预设值列表为用户提前设定的期望值列表。
[0040] 可选的,变量组的预设值列表为真值表。将结果序列中的每个结果与预设值列表进行匹配,当在预设值列表中存在与结果对应的预设值时,将覆盖状态标记为覆盖。通过将条件中的变量划分为变量组的方式,获取变量组内每个变量的实际取值组合序列,将其并与变量组的预设值列表进行匹配,能够在波形数据库中快速匹配得到条件的覆盖状态。
[0041] S600,根据每个变量的实际取值序列,标记覆盖状态。
[0042] 可选的,获取每个变量的实际取值序列对应的二进制数序列,获取判断相应位的翻转状态,根据翻转状态标记覆盖状态。通过该方式能够获取每个变量的翻转覆盖状态。
[0043] 作为一个优选实施例,当变量设有预设值列表时,将变量的实际取值序列中的每个实际取值分别与预设值列表进行匹配,根据匹配结果标记变量状态的覆盖状态。通过对独立变量设置预设值列表,能够在波形数据库中快速匹配得到覆盖状态。例如对于有限状态中每个状态变量的覆盖状态、或者其他语句中的独立变量的覆盖状态等。
[0044] 作为一个优选实施例,当变量设有预设转移列表时,根据变量的实际取值序列中的相邻实际取值获取变量的所有实际取值转移序列;将变量的所有实际取值转移序列中的每个实际取值转移组合与预设转移列表进行匹配,根据匹配结果标记覆盖状态。通过该方法能够得到变量状态转换的覆盖状态。
[0045] 将匹配成功的标记为覆盖,否则标记为未覆盖。
[0046] 作为一个优选实施例,S600还包括:
[0047] S610,识别条件中的R个布尔表达式,获取R个布尔表达式的真值表。其中,每个布尔表达式有0和1两种取值,R个布尔表达式的真值表包括所有取值组合。
[0048] S620,根据每个实际取值组合获取每个布尔表达式的实际取值,将布尔表达式的实际取值与布尔表达式的预设真值表进行匹配,匹配成功,则将布尔表达式的预设真值表标记为覆盖,否则标记为未覆盖。通过识别条件中布尔表达式的方式,能够进一步统计表达式中布尔表达式的覆盖情况,使覆盖率统计结果的更加精准。
[0049] S700,根据标记的覆盖状态统计代码覆盖率。
[0050] 可选的,按照类型统计代码覆盖率,分别统计条件的覆盖率和变量的翻转覆盖率。例如,将获取条件对应的预设值列表,统计预设值列表中被标记为覆盖的数量以及被标记为未覆盖的数量,用覆盖的数量除以覆盖和未覆盖的总数量得到覆盖率。每个变量的翻转覆盖率包括变量中每一位的翻转覆盖率,若每一位都具有0到1和1到0的翻转状态,则该位的翻转覆盖率为100%;若只有0到1的翻转或者只有1到0的翻转,则翻转覆盖率为50%;若该位的数值始终没有变化,则翻转覆盖率为0%。
[0051] 进一步,还可以根据翻转覆盖状态统计翻转覆盖率,或者根据变量状态的覆盖状态和变量状态转换的覆盖状态统计有限状态机的覆盖率。还可以根据统计得到的不同类型的覆盖率计算综合覆盖率。现有技术中能够实现统计有限状态机的覆盖率的计算方法落入本发明的保护范围之内。
[0052] 本发明所提供的代码覆盖率可以直接用于计算相应的覆盖率,也可以作为辅助对比的结果。
[0053] 本发明通过后处理的方式,将测试用例在执行过程中所有变量的实际取值都保存在数据库中,识别源代码中变量以及条件,并结合预设值列表,判断覆盖状态,进而计算覆盖率。该方法能够保证源代码不被破坏,相对于现有技术提高了编译效率和测试效率,解决了现有技术中通过破源代码的方式统计覆盖率导致源代码逻辑遭到破坏以及测试效率和编译效率低的问题。
[0054] 基于与上述方法实施例相同的发明构思,本发明实施例提供了一种代码覆盖率的获取系统,所述系统包括处理器和非瞬时性计算机可读存储介质,所述非瞬时性计算机可读存储介质中存储有至少一条指令或至少一段程序,所述至少一条指令或所述至少一段程序由处理器加载并执行以实现上述任意一个实施例提供的一种代码覆盖率的获取方法,其中一种代码覆盖率的获取方法在上述实施例已经详细说明,不再赘述。
[0055] 虽然已经通过示例对本发明的一些特定实施例进行了详细说明,但是本领域的技术人员应该理解,以上示例仅是为了进行说明,而不是为了限制本发明的范围。本领域的技术人员还应理解,可以对实施例进行多种修改而不脱离本发明的范围和精神。本发明公开的范围由所附权利要求来限定。