CN113704094A - 测试用例知识库构建方法、装置、电子设备及存储介质 - Google Patents

测试用例知识库构建方法、装置、电子设备及存储介质 Download PDF

Info

Publication number
CN113704094A
CN113704094A CN202110903393.7A CN202110903393A CN113704094A CN 113704094 A CN113704094 A CN 113704094A CN 202110903393 A CN202110903393 A CN 202110903393A CN 113704094 A CN113704094 A CN 113704094A
Authority
CN
China
Prior art keywords
node
target
test case
code
project
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.)
Pending
Application number
CN202110903393.7A
Other languages
English (en)
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.)
Beijing Urban Network Neighbor Information Technology Co Ltd
Beijing Chengshi Wanglin Information Technology Co Ltd
Original Assignee
Beijing Chengshi Wanglin Information Technology Co Ltd
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 Beijing Chengshi Wanglin Information Technology Co Ltd filed Critical Beijing Chengshi Wanglin Information Technology Co Ltd
Priority to CN202110903393.7A priority Critical patent/CN113704094A/zh
Publication of CN113704094A publication Critical patent/CN113704094A/zh
Pending legal-status Critical Current

Links

Images

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/3676Test management for coverage analysis
    • 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
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N5/00Computing arrangements using knowledge-based models
    • G06N5/02Knowledge representation; Symbolic representation

Abstract

本发明提供了一种测试用例知识库构建方法、装置、电子设备及存储介质。所述方法,包括:针对任一测试用例,基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据,所述目标项目为经过插桩处理的项目,所述代码覆盖率数据中至少包含所述目标项目中至少一个节点的身份标识;解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例的关联关系;其中,每个所述节点的身份标识为在生成代码覆盖率数据之前,基于所述节点的节点类型对所述节点进行重命名得到。

Description

测试用例知识库构建方法、装置、电子设备及存储介质
技术领域
本发明涉及计算机技术领域,尤其涉及一种测试用例知识库构建方法、装置、电子设备及存储介质。
背景技术
在软件工程中,测试者通过测试用例来测试应用软件或软件系统是否正确工作。其中,精准测试是一种通用的测试分析系统,其内部算法实现与具体业务无关,对于各种类型的应用软件都可以采用同一套方法进行确认。其最底层的方法是建立测试用例与代码的关系,任何类型表现形式的软件都会存在测试用例与代码的双向关联关系,因此精准测试的应用范围是广泛的。
业界针对移动端精准测试实践的主要目的是支持单元测试或手工测试的代码覆盖率分析,通过代码插桩和覆盖率工具获得测试执行后的单版本覆盖率和增量覆盖率,达到验证测试执行效果的目的。由此可见,覆盖率数据的准确性影响测试用例与代码的双向关联关系的准确性,进而影响精准测试时测试用例的推荐结果的准确性。
相关技术中,不同程序语言项目的覆盖率数据中对于函数或方法名称的处理方式不同,尤其是针对大量应用的匿名函数命名基本只做基础的处理,比如在RN类型项目中,覆盖率数据中的函数名称会采用匿名后缀一个序号的表达方式,例如“anonymous_x”,而且同一个函数每次执行后在覆盖率数据中的名字可能不同,无法与代码块进行关联。从而容易影响测试用例与代码的双向关联关系的准确性,进而影响精准测试的准确性。
发明内容
本发明实施例提供一种测试用例知识库构建方法、装置、电子设备及存储介质,以解决现有的测试用例与代码的双向关联关系准确性不佳,进而影响精准测试准确性的问题。
为了解决上述技术问题,本发明是这样实现的:
第一方面,本发明实施例提供了一种测试用例知识库构建方法,包括:
针对任一测试用例,基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据,所述目标项目为经过插桩处理的项目,所述代码覆盖率数据中至少包含所述目标项目中至少一个节点的身份标识;
解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例的关联关系;
其中,每个所述节点的身份标识为在生成代码覆盖率数据之前,基于所述节点的节点类型对所述节点进行重命名得到。
可选地,所述解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例之间的关联关系的步骤,包括:
以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
在所述测试用例知识库中建立所述目标代码模块、所述目标代码模块的执行次数与所述测试用例之间的关联关系,以根据任一代码模块在与其关联的各个测试用例下的执行次数,确定各个测试用例的优先级。
可选地,所述解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例之间的关联关系的步骤,包括:
以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点;
针对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息与所述测试用例之间的关联关系,以在进行测试用例推荐时,当多个被推荐的测试用例关联同一代码模块,且各个测试用例在所述同一代码模块中覆盖的代码行相同时,对所述被推荐的测试用例进行去重处理。
可选地,所述解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例之间的关联关系的步骤,包括:
以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
针对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息、所述目标代码模块的执行次数与所述测试用例之间的关联关系。
可选地,所述获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息的步骤,包括:
获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的目标代码行,并过滤掉所述目标代码行中的非逻辑性信息,得到有效代码行;所述非逻辑性信息包括空白字符、单独占据一行的大括号、单独占据一行的小括号中的至少一种;
基于所述有效代码行生成摘要信息,作为所述代码行的标识信息。
可选地,在所述以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点的步骤之后,还包括:
针对任一所述目标节点,响应于所述目标节点的身份标识包含指定字符串,以所述目标节点所在源文件的文件名替换所述身份标识中的指定字符串,得到所述目标节点更新后的身份标识;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
可选地,在所述以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点的步骤之后,还包括:
针对任一所述目标节点,检测所述目标节点是否与所述目标节点所在源文件中的其他目标节点的身份标识相同;
响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,分别在所述目标节点以及所述至少一个其他目标节点中的每个节点的身份标识中设置一个互不相同的标记符,以区分所述目标节点以及所述至少一个其他目标节中的每个节点;
或者,响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,将身份标识相同的各个目标节点合并为一个目标节点;
所述其他目标节点为除所述目标节点之外,被任一测试用例覆盖的其他节点。
可选地,在所述生成所述测试用例针对所述目标项目的代码覆盖率数据的步骤之前,还包括:
针对所述目标项目的抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名,以在生成所述代码覆盖率数据时,以重命名后的节点名称作为所述节点的身份标识。
可选地,在所述目标项目为React Native项目的情况下,所述针对所述抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名的步骤,包括:
针对所述抽象语法树中的任一节点,响应于所述节点的目标属性为空,且所述节点的节点类型为一般类的类方法,以所述类方法的类名和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为导出默认类的类方法,以export_default_class和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为对象方法,以所述对象方法的对象名和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为函数声明、函数表达式、箭头函数表达式中的任意一种,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
响应于所述节点的目标属性不完全为空,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
所述目标属性包括节点的id.name属性、name属性中的至少一种。
可选地,在所述针对所述抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名的步骤之后,还包括:
针对任一重命名后的节点,响应于重命名后的节点名称包含指定字符串,以所述节点所在源文件的文件名替换所述节点名称中的指定字符串,得到所述目标节点最终的节点名称;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
可选地,所述代码覆盖率数据中至少包含所述目标项目中满足所述指定条件的至少一个节点的身份标识。
可选地,所述目标项目包括基于JavaScript/TypeScript构建的项目、基于Android支持的程序语言构建的项目、基于iOS支持的程序语言构建的项目中的至少一种,所述基于JavaScript构建的项目至少包括React Native项目。
可选地,所述方法还包括:
清除当前测试用例的代码覆盖率数据,并针对另一测试用例,进入基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据的步骤,直至全部测试用例执行结束。
第二方面,本发明实施例提供了一种测试用例知识库构建装置,包括:
覆盖率数据获取模块,用于针对任一测试用例,基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据,所述目标项目为经过插桩处理的项目,所述代码覆盖率数据中至少包含所述目标项目中至少一个节点的身份标识;
覆盖率数据解析模块,用于解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例的关联关系;
其中,每个所述节点的身份标识为在生成代码覆盖率数据之前,基于所述节点的节点类型对所述节点进行重命名得到。
可选地,所述覆盖率数据解析模块,包括:
第一覆盖率数据解析子模块,用于以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
第一关系建立子模块,用于在所述测试用例知识库中建立所述目标代码模块、所述目标代码模块的执行次数与所述测试用例之间的关联关系,以根据任一代码模块在与其关联的各个测试用例下的执行次数,确定各个所述测试用例的优先级。
可选地,所述覆盖率数据解析模块,包括:
第二覆盖率数据解析子模块,用于以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点;
覆盖代码行识别子模块,用于对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
第二关系建立子模块,用于在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息与所述测试用例之间的关联关系,以在进行测试用例推荐时,当多个被推荐的测试用例关联同一代码模块,且各个测试用例在所述同一代码模块中覆盖的代码行相同时,对所述被推荐的测试用例进行去重处理。
可选地,所述覆盖率数据解析模块,包括:
第一覆盖率数据解析子模块,用于以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
覆盖代码行识别子模块,用于针对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
第三关系建立子模块,用于在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息、所述目标代码模块的执行次数与所述测试用例之间的关联关系。
可选地,所述覆盖代码行识别子模块,具体用于:
获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的目标代码行,并过滤掉所述目标代码行中的非逻辑性信息,得到有效代码行;所述非逻辑性信息包括空白字符、单独占据一行的大括号、单独占据一行的小括号中的至少一种;
基于所述有效代码行生成摘要信息,作为所述代码行的标识信息。
可选地,所述覆盖率数据解析模块,还包括:
节点身份标识更新子模块,用于针对任一所述目标节点,响应于所述目标节点的身份标识包含指定字符串,以所述目标节点所在源文件的文件名替换所述身份标识中的指定字符串,得到所述目标节点更新后的身份标识;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
可选地,所述覆盖率数据解析模块,还包括:
身份标识过滤子模块,用于针对任一所述目标节点,检测所述目标节点是否与所述目标节点所在源文件中的其他目标节点的身份标识相同;
身份标识处理子模块,用于响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,分别在所述目标节点以及所述至少一个其他目标节点中的每个节点的身份标识中设置一个互不相同的标记符,以区分所述目标节点以及所述至少一个其他目标节中的每个节点;或者,响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,将身份标识相同的各个目标节点合并为一个目标节点;
所述其他目标节点为除所述目标节点之外,被任一测试用例覆盖的其他节点。
可选地,所述装置,还包括:
节点重命名模块,用于针对所述目标项目的抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名,以在生成所述代码覆盖率数据时,以重命名后的节点名称作为所述节点的身份标识。
可选地,在所述目标项目为React Native项目的情况下,所述节点重命名模块,具体用于:
针对所述抽象语法树中的任一节点,响应于所述节点的目标属性为空,且所述节点的节点类型为一般类的类方法,以所述类方法的类名和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为导出默认类的类方法,以export_default_class和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为对象方法,以所述对象方法的对象名和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为函数声明、函数表达式、箭头函数表达式中的任意一种,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
响应于所述节点的目标属性不完全为空,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
所述目标属性包括节点的id.name属性、name属性中的至少一种。
可选地,所述装置还包括:
节点名称调整模块,用于针对任一重命名后的节点,响应于重命名后的节点名称包含指定字符串,以所述节点所在源文件的文件名替换所述节点名称中的指定字符串,得到所述目标节点最终的节点名称;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
可选地,所述代码覆盖率数据中至少包含所述目标项目中满足所述指定条件的至少一个节点的身份标识。
可选地,所述目标项目包括基于JavaScript/TypeScript构建的项目、基于Android支持的程序语言构建的项目、基于iOS支持的程序语言构建的项目中的至少一种,所述基于JavaScript构建的项目至少包括React Native项目。
可选地,所述装置还包括:
代码覆盖率数据清除模块,用于清除当前测试用例的代码覆盖率数据,并针对另一测试用例,返回覆盖率数据获取模块,直至全部测试用例执行结束。
第三方面,本发明实施例另外提供了一种电子设备,包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如第一方面所述的测试用例知识库构建方法的步骤。
第四方面,本发明实施例另外提供了一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述的测试用例知识库构建方法的步骤。
在本发明实施例中,对目标项目进行模块化,并对其中至少一个代码模块对应的节点进行重命名,使得节点与相应代码模块固定一一对应,并且测试用例执行时,通过实时收集并解析针对目标项目的测试覆盖率数据,从而建立测试用例和代码模块的关联关系并添加至测试用例执行时,提高测试用例与代码模块之间关联关系的准确性,使基于测试用例执行时的精准推荐测试用例成为可能。
附图说明
图1是本发明实施例中的测试用例知识库构建方法的步骤流程图之一;
图2是本发明实施例中的测试用例知识库构建方法的步骤流程图之二;
图3是本发明实施例中的测试用例知识库构建方法的步骤流程图之三;
图4是本发明实施例中的测试用例知识库构建方法的步骤流程图之四;
图5A是本发明实施例中的一种原始的代码覆盖率数据示例;
图5B是本发明实施例中的一种将节点重命名后的代码覆盖率数据示例;
图6是本发明实施例中的一种在移动测试端针对目标项目创建精准测试的测试用例知识库的流程示意图。
图7是本发明实施例中的一种对节点重命名的具体方式示例。
图8是本发明实施例中的测试用例知识库构建装置的结构示意图之一;
图9是本发明实施例中的测试用例知识库构建装置的结构示意图之二;
图10是本发明实施例中的测试用例知识库构建装置的结构示意图之三;
图11是本发明实施例中的测试用例知识库构建装置的结构示意图之四。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参照图1,示出了本发明实施例中一种测试用例知识库构建方法的步骤流程图。
步骤110,针对任一测试用例,基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据,所述目标项目为经过插桩处理的项目,所述代码覆盖率数据中至少包含所述目标项目中至少一个节点的身份标识;
步骤120,解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例之间的关联关系;
其中,每个所述节点的身份标识为在生成代码覆盖率数据之前,基于所述节点的节点类型对所述节点进行重命名得到。
如图5A所示为一种现有技术中,RN项目原始的代码覆盖率数据示例。其中function map(fnMap)记录了函数的名称、位置和行数等信息,其名称部分采用的都是匿名后缀一个序号的表达方式“anonymous_x”,同一个函数每次执行后在覆盖率数据中的名字可能不同,无法与代码块进行关联,从而影响后续测试用例知识库中代码模块与测试用例之间的关联关系准确性。
因此,在本发明实施例中,为了避免上述问题,可以预先对目标项目的源代码进行模块化处理,并重新确定每个代码模块对应的身份标识,从而实现在代码覆盖率数据中通过身份标识对应每个代码块,实现身份标识与代码块之间的关联,进而在测试用例知识库中实现测试用例与代码模块之间精准且稳定的关联关系。
具体地,为了构建测试用例和待测代码的关联关系,一般首先可以通过任何可用的技术手段将业务代码划分为合适的代码模块并标记,之后通过录制的方式构建测试用例和对应的一组或多组代码模块的关联关系。这样当代码变更时通过匹配测试用例知识库中保存的测试用例和代码模块之间的关联关系,可以为测试人员推荐出需要执行的测试用例。
例如,可以基于目标项目的抽象语法树中包含的各个节点或者指定类型(例如函数类型、方法类型等)的节点,对目标项目的源代码进行划分,以获取相应节点对应的代码模块,且一个节点可以对应一个代码模块。那么通过对相应节点进行重命名,进而在代码覆盖率数据中,以重命名后的节点名称,作为相应节点对应的代码模块对应的身份标识。
为了统计每个测试用例在执行后对目标项目的代码覆盖情况,可以对待测的目标项目代码进行自动插桩操作,进而可以通过覆盖率工具,基于自动插桩工具插入目标项目代码中的探针,获取针对目标项目执行某一测试用例后的代码覆盖率数据。此时,由于获取的代码覆盖率数据中各个节点的身份标识为经过重命名的节点名称,各个节点的身份标识也可以与代码模块固定地一一对应,从而可以准确确定当前测试用例所覆盖的代码模块。
其中,对节点进行重命名的具体方式可以根据需求进行自定义设置,对此本发明实施例不加以限定。此外,在本发明实施例中,可以通过任何可用方式对目标项目的代码进行模块化处理,以及生成目标项目的抽象语法树,此时在抽象语法树中的每个节点可以对应于一个代码模块,对此本发明实施例也不加以限定。而且,在划分代码模块时,可以仅从目标项目的源代码中划分出代码覆盖率数据中所包含的节点对应的代码模块,也可以仅针对代码覆盖率中包含的节点进行重命名,当然根据需求也可以对全部节点对应的代码模块进行划分,或者对全部节点进行重命名,对此本发明实施例不加以限定。
具体地,可以根据节点的节点类型,确定相应节点的重命名方式,进而通过相应重命名方式对该节点进行重命名。其中,不同节点类型的重命名方式可以根据需求进行自定义设置,对此本发明实施例不加以限定。
例如,在实际应用中,目标项目的代码中可以包括多个源文件,那么则可以针对每个源文件中的代码进行模块化处理,而且代码中可以包含类、方法、函数、表达式等多种不同的代码对象,那么抽象语法树中的节点可能为任意一种代码对象。因此,在本发明实施例中,可以基于节点的节点类型,分别设置不同的重命名方式,并且可以将重命名方式以代码形式注入项目中,例如置入插桩工具中等,从而在通过插桩工具进行插桩时,即可以基于目标项目的抽象语法树中每个节点的节点类型,重命名得到相应每个节点的节点名称,进而在代码覆盖率数据中以每个节点重命名后的节点名称作为相应各个节点的身份标识。而且,在重命名方式相对固定的情况下,针对同一目标项目,在执行多个测试用例时,目标项目中经模块化后的每个代码模块对应节点的节点名称可以一直沿用,也即同一个节点每次执行后在覆盖率数据中的身份标识是相同的,因此可以与代码模块进行一一关联。
在本发明实施例中,可以通过任何可用方式解析代码覆盖率数据,获取当前的测试用例执行后目标项目中被覆盖的目标代码模块,对此本发明实施例不加以限定。
如图5B所示为一种将节点重命名后的代码覆盖率数据示例。如上述,其中的fnMap记录了函数(也即节点)的名称(也即重命名的节点名称)、位置和行数等信息。此外,在代码覆盖率数据中,还包含一f数组,其中记录有每个节点对应的代码模块在本次测试时的执行次数。进而可以根据f数组中记录的执行次数确定其中被覆盖的节点,进而获取被覆盖的每个节点对应的代码模块,即为本次测试用例覆盖的目标代码模块。
例如,某一节点对应的代码模块在本次测试时的执行次数大于等于1,则表明该节点对应的代码模块被本次测试的测试用例所覆盖。
参照图2,在本发明实施例中,所述步骤120进一步可以包括:
步骤A121,以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
步骤A122,在所述测试用例知识库中建立所述目标代码模块、所述目标代码模块的执行次数与所述测试用例之间的关联关系,以根据任一代码模块在与其关联的各个测试用例下的执行次数,确定各个所述测试用例的优先级。
代码覆盖率数据的解析主要将覆盖率数据中的function map数据和被覆盖的函数,也即节点进行关联。其中,由于项目中一般包含多个源文件,而且在针对目标项目进行模块化处理,一般也是以源文件为单位进行处理,分别针对每个源文件中的代码进行划分并模块化处理。因此,在解析代码覆盖率数据时,也可以源文件为单位,解析所述代码覆盖率数据。当然,根据需求也可以采用其他方式解析代码覆盖率数据,对此本发明实施例不加以限定。
其中,筛选被覆盖的节点主要通过遍历代码覆盖率数据中的fnMap和f数组的信息获取得到。此外,还可以通过从代码覆盖率数据中获取节点对应代码模块的具体执行次数并绑定在测试用例知识库中,在之后推荐测试用例时,就可以做到不仅能够根据代码变更推荐出相关的测试用例,而且可以根据待测试代码模块对应在其关联的各个测试用例中测试时的执行次数,标记相应各个测试用例的推荐执行优先级(例如,可以设置代码模块的执行次数越高,优先级越高,相应测试用例的执行优先级和/或推荐优先级越高)。
如果在代码覆盖率数据中,某一节点身份标识对应的执行次数大于等于1,则可以认为该节点对应的代码模块被当前测试用例覆盖。
此时,在测试用例知识库中,在记录测试用例与代码模块之间的关联关系的同时,还可以记录相应代码模块在相应测试用例条件下的执行次数,也即建立测试用例、代码模块、相应代码模块在相应测试用例条件下的执行次数三者之间的彼此关联关系,从而方便在测试用例知识库中获取任一代码模块在其关联的任一测试用例下测试时的执行次数。
需要说明的是,在本发明实施例中,在测试用例知识库中,可以各个代码模型对应节点经重命名后的节点名称作为其身份标识与测试用例的身份标识建立关联关系,也可以根据重命名时得到的重命名前后的节点名称之间的对应关系,在测试用例知识库中,将每个代码模块的身份标识还原为其对应节点在重命名之前的原始节点名称,对此本发明实施例不加以限定。
参照图3,在本发明实施例中,所述步骤120进一步可以包括:
步骤B121,以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点;
步骤B122,针对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
步骤B123,在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息与所述测试用例之间的关联关系,以在进行测试用例推荐时,当多个被推荐的测试用例关联同一代码模块,且各个测试用例在所述同一代码模块中覆盖的代码行相同时,对所述被推荐的测试用例进行去重处理。
在实际应用中,同一代码模块中一般包含多行代码,而对于测试用例而言,在用其测试目标项目时,其可能覆盖目标项目的代码中的多个代码模块,但是在每个代码模块中具体覆盖的代码行可能相同,也可能不同。
而对于某一代码变更的代码模块而言,在为其推荐测试用例时,当多个被推荐的测试用例关联该同一代码模块,且各个测试用例在该代码模块中覆盖的具体代码行相同时,容易导致最终选择的测试用例较大概率为针对相同代码行的测试用例,那么会导致通过多个测试用例对代码模块中的相同代码行进行多次重复测试,而对于其他代码行则并未测试的情况,还会影响代码测试结果的全面性。
因此,在本发明实施例中,为了避免上述问题,针对任一被当前测试用例覆盖的目标节点,可以读取相应代码模块中具体被覆盖的代码行的标识信息(例如代码行在代码模块中的位置、代码行的行数、代码行的内容等)并将其加入测试用例知识库中。
具体地,可以在测试用例知识库中建立所述目标代码模块、所述代码行的标识信息、所述测试用例之间的关联关系,从而可以在测试用例知识库中获取任一测试用例在其关联的任一代码模块中具体覆盖的代码行的标识信息。以便于在后续进行测试用例的推荐时追加判断,当多个被推荐的测试用例关联相同的代码模块,且各个测试用例在相同代码模块中覆盖的具体代码行相同时,可以合理地过滤掉推荐用例中一部分测试用例,达到精简去重推荐结果的同时提高测试效率的目的。
参照图4,在本发明实施例中,所述步骤120进一步可以包括:
步骤C121,以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
步骤C122,针对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
步骤C123,在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息、所述目标代码模块的执行次数与所述测试用例之间的关联关系。
在本发明实施例中,也可以在测试用例知识库中同时记录在任一测试用例的执行过程中,与之关联的每个所述目标节点对应目标代码模块的执行次数,以及任一节点对应的代码模块中被其所关联的测试用例覆盖的代码行的标识信息。具体的可以分别参照上述的A121-122、B121-123,在此不加以赘述。
可选地,在本发明实施例中,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息的过程,具体可以包括:
步骤S1,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的目标代码行,并过滤掉所述目标代码行中的非逻辑性信息,得到有效代码行;所述非逻辑性信息包括空白字符、单独占据一行的大括号、单独占据一行的小括号中的至少一种;
步骤S2,基于所述有效代码行生成摘要信息,作为所述代码行的标识信息。
在实际应用中,代码模块中一般会包含空白字符、单独占据一行的大小括号等特殊符号(例如“(”、“)”、“{”、“}”、“[”、“]”、“//”等)。而上述内容属于非逻辑信息,在获取测试用例具体覆盖的代码行时,上述非逻辑信息的作用很小,并无实质逻辑含义,因此可以忽略,如果两个代码模块中被同一测试用例覆盖的代码行仅仅偏差上述的非逻辑信息,可以认定为覆盖相同的代码行。
因此,在本发明实施例中,为了提高具体覆盖代码行的准确性,可以获取目标节点对应的目标代码模块中被当前测试用例覆盖的目标代码行,并过滤掉目标代码行中的非逻辑性信息,进而得到最终的得到有效代码行。
而且为了方便记录同时降低测试用例知识库的数据量,可以对有效代码行的信息进行进一步处理,例如可以基于所述有效代码行的信息生成摘要信息(例如MD5摘要),作为最终所覆盖代码行的标识信息并记录至测试用例知识库中。
当然,在本发明实施例中,也可以通过其他任何可用方式生成代码模块中被测试用例覆盖代码行的标识信息,对此本发明实施例不加以限定。
可选地,在本发明实施例中,在步骤A121/B121/C121之后,还可以包括:
步骤124,针对任一所述目标节点,响应于所述目标节点的身份标识包含指定字符串,以所述目标节点所在源文件的文件名替换所述身份标识中的指定字符串,得到所述目标节点更新后的身份标识;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
当重命名后的节点的命名,也即身份标识中包含export_default_class或export_default_function等指定字符串时,为了避免该节点和其它源文件中的同名方法冲突,混淆测试用例知识库中的绑定结果,可以采用源代码文件名(也即该节点所在源文件的文件名)替换相应身份标识中指定字符串(例如上述的export_default_class、export_default_function)部分,从而得到更新后的身份标识,作为相应节点最终的身份标识,也即节点名称,从而达到兼容这两种语法的目的。
此时,相应地在测试用例知识库中建立测试用例与代码模块之间的映射关系时,如果以代码模块对应节点的身份标识建立与测试用例标识之间的映射关系,此时则可以节点更新后的身份标识,作为相应节点对应的代码模块在测试用例知识库中的身份标识。
可选地,在本发明实施例中,在步骤A121/B121/C121之后,还可以包括:
步骤125,针对任一所述目标节点,检测所述目标节点是否与所述目标节点所在源文件中的其他目标节点的身份标识相同;
步骤126,响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,分别在所述目标节点以及所述至少一个其他目标节点中的每个节点的身份标识中设置一个互不相同的标记符,以区分所述目标节点以及所述至少一个其他目标节中的每个节点;或者,响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,将身份标识相同的各个目标节点合并为一个目标节点。所述其他目标节点为除所述目标节点之外,被任一测试用例覆盖的其他节点。
此外,由于在重命名过程中,针对抽象语法树中某些节点的身份标识(也即节点名称)采用了追溯至其上级节点的方式,可能会产生一定的重名情况出现,为了避免引起异常,需要对这部分节点名做去重处理。
此时,去重处理的一种方式可以为将身份标识相同的多个被相同或不同测试用例覆盖的目标节点合并为一个目标节点,并保留该身份标识为合并后目标节点的身份标识,同时将相应各个目标节点对应代码模块合并为一个代码模块,且对应于相应合并后的目标节点,并且可以将合并前的相应各个目标节点对应的代码模块所关联的测试用例关联至合并后的代码模块;去重处理的另一种方式则可以为分别在身份标识相同的多个节点的身份标识中设置一互不相同的标记符(例如不同的数字、字母等),从而将个节点的身份标识调整为互不相同的身份标识,此时无需调整测试用例与各个节点对应的代码模块之间的关联关系。
需要说明的是,上述步骤125-126的去重处理操作,可以仅针对属于同一源文件内的各个目标节点进行处理,也可以针对整个目标项目全局范围内的目标节点进行处理,对此本发明实施例不加以限定。
而且,上述去重处理方式二也可以在对目标项目的抽象语法树中各个节点进行重命名时,针对初始重命名得到的多个相同的节点名称设置一互不相同的标记符,进而保证后续代码覆盖率中相应每个节点的身份标识不会重名,对此本发明实施例不加以限定。
参照图2,在本发明实施例中,在步骤110之前还可以包括:
步骤210,针对所述抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名,以在生成代码覆盖率数据时,以重命名后的节点名称作为所述节点的身份标识。
可选地,所述代码覆盖率数据中至少包含所述目标项目中满足所述指定条件的至少一个节点的身份标识。
其中的指定条件可以根据需求进行自定义设置,对此本发明实施例不加以限定。例如,在实际应用中,对于id.name属性和name属性均为空的节点,容易采用上述的匿名后缀一个序号的表达方式进行命名,容易影响关联关系准确性,因此可以针对id.name属性和name属性均为空的节点进行重命名。那么此时则可以设置指定条件包括id.name属性和name属性均为空。
此外,在针对节点进行重命名时,可以仅考虑部分占比较大的节点,那么此时则可以预设一节点类型集合,其中包含至少一个需要进行重命名的指定节点类型,进而可以设置指定条件包括节点类型为节点类型集合中任意一种指定节点类型等等。
或者,也可以将上述两种情况结合,例如设置指定条件为id.name属性和name属性均为空,且节点类型为节点类型集合中任意一种指定节点类型等等,对此本发明实施例不加以限定。
其中的指定节点类型可以根据需求进行自定义设置,对此本发明实施例不加以限定。例如可以设置指定节点类型包括类方法、对象方法、函数声明、函数表达式、箭头函数表达式、嵌套函数、方法调用表达式、赋值表达式中的一种或多种。
而且,代码覆盖率数据中可以包含全部满足上述指定条件的节点的身份标识,也可以包含部分满足上述指定条件的节点的身份标识,例如上述部分指定节点类型下的一个或多个或全部节点的身份标识,或者全部指定节点类型下的部分节点的身份标识,等等。
可选地,在本发明实施例中,还可以包括:
步骤130,清除当前测试用例的代码覆盖率数据,并针对另一测试用例,返回步骤110,直至全部测试用例执行结束。
在本发明实施例中,为了获取代码覆盖率数据,可以对待测的目标项目的代码进行自动插桩操作,同时将目标项目中的.js(javascript)、.ts(typescript)、.tsx等类型的源文件中的源代码按照一定的规则模块化并为每一代码模块赋予唯一命名,用于后续构造测试用例知识库时关联测试用例。
为了便于收集代码覆盖率数据,还可以部署并启动JS覆盖率收集服务,主要功能是实时接收上传的代码覆盖率数据和解析代码覆盖率数据,生成测试用例知识库。例如,可以在目标项目代码中注入实时覆盖率上传功能模块并启动目标项目。
在移动端等电子设备进入目标项目测试入口页面执行具体的测试用例,在每一测试用例执行结束后触发测试用例知识库生成功能,该功能会解析上传到覆盖率收集服务的代码覆盖率数据并生成本次测试用例执行后被覆盖到的代码模块。此过程称为知识库的录制。
当结束一个测试用例的知识库录制后,可以自动清空JS覆盖率收集服务的代码覆盖率数据,为下一条测试用例的录制做准备。针对每条测试用例均进行一次上述的知识库的录制过程,即可以得到最终的测试用例知识库,其中包含每条测试用例与目标项目中各个代码模块之间的关联关系。其中,可以按照约定的测试用例知识库结构以Json等任何可用的格式输出最终的测试用例知识库。测试用例知识库结构可以根据需求进行自定义设置,对此本发明实施例不加以限定。
如图6所示为一种在移动测试端针对目标项目创建精准测试的测试用例知识库的流程示意图。
其中,可以参照抽象语法树,利用Babel工具等任何可用方式解析目标项目中的JavaScript和TypeScript等源码,以函数(function)为主并兼顾语句(Statement)、类(class)等信息作为代码模块的划分标准,保证各模块命名的唯一性。代码模块的划分和命名由Babel解析后的代码模块所对应的节点在抽象语法树中的节点类型决定。
可选地,在本发明实施例中,所述目标项目可以包括但不限于基于JavaScript/TypeScript构建的项目、基于Android(例如Java/Kotlin)支持的程序语言构建的项目、基于iOS支持的程序语言(例如Object C/Swift)构建的项目中的至少一种,所述基于JavaScript/TypeScript构建的项目至少包括React Native项目,也即RN项目。
其中,针对不同程序语言构建的项目,可以参考程序语言的需求,在不同时机对项目源代码的各代码模块对应的节点进行重命名,而且在不同程序语言下,所需重命名的节点所需满足的条件也可以相应有所不同,对此可以根据具体需求进行自定义设置,对此本发明实施例不加以限定。
例如,针对Android支持的程序语言创建的项目而言,由于其提供接口(例如ClassCoverage、MethodCoverage等)进行代码覆盖率相关参数的分析读取,因此可以通过调用相应接口对代码覆盖率文件进行解析,以获取覆盖率结果。此外,Android支持的程序语言创建的项目源代码的抽象语法树中个节点匿名的情况相对较少,因此也可以不将重命名的相关方式插入插桩工具中,也即无需改造插桩工具。而可以在后续对其中个别的匿名类、内部类等进行处理(例如将内部类转化为对应的外部类等)。
而对于RN项目而言,其中匿名类的情况比较突出,则可以通过对插桩工具进行改造,在其中注入具体的重命名方式,从而实现在插桩过程中对RN项目源代码的抽象语法树中的匿名节点进行重命名。
可选地,在本发明实施例中,在所述目标项目为RN项目的情况下,所述步骤210进一步可以包括:
步骤211,针对所述抽象语法树中的任一节点,响应于所述节点的目标属性为空,且所述节点的节点类型为一般类的类方法,以所述类方法的类名和方法名的组合对所述节点进行重命名;
步骤212,响应于所述节点的目标属性为空,且所述节点的节点类型为导出默认类的类方法,以export_default_class和方法名的组合对所述节点进行重命名;
步骤213,响应于所述节点的目标属性为空,且所述节点的节点类型为对象方法,以所述对象方法的对象名和方法名的组合对所述节点进行重命名;
步骤214,响应于所述节点的目标属性为空,且所述节点的节点类型为函数声明、函数表达式、箭头函数表达式中的任意一种,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
步骤215,响应于所述节点的目标属性不完全为空,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
其中,所述目标属性包括节点的id.name属性、name属性中的至少一种。
在本发明实施例中,在对节点进行重命名时,可以主要考虑类方法(ClassMethod)、对象方法(ObjectMethod)、函数声明(FunctionDeclaration)、函数表达式(FunctionExpression)、箭头函数表达式(ArrowFunctionExpression)以及嵌套函数场景和方法调用表达式(CallExpression)、赋值表达式(AssignmentExpression)等容易出现匿名节点的应用场景。
尤其是某一节点的的属性中与名称相关的属性(也即上的目标属性)均为空,那么此时该节点更容易采用匿名后缀一个序号的命名方式,因此针对相应形式的节点可以基于节点类型进行重命名,以避免匿名形式的节点名称。具体地可以考虑不同节点类型采用不同的重命名方式。
此外,对于目标属性不完全为空的节点而言,虽然其可以获取一真实名称,但是由于在同一项目中的不同源文件中可能存在目标属性的取值相同的节点,那么此时如果直接基于目标属性确定节点名称,则容易出现不同源文件中的节点重名的情况,导致后续构建测试用例知识库时容易出现关联关系混乱的异常情况。因此,也可以针对目标属性不完全为空的节点进行重命名。
如图7所示为一种优选地对节点重命名的具体方式示例。其中的函数节点可以包括图示中的类方法、箭头函数表达式、对象方法、函数声明、函数表达式,等等。
其中,假设某一节点的id.name或者name属性为空,且该节点为箭头函数表达式(ArrowFunctionExpression),则可以进一步判断其父节点的类型,而如果该节点的父节点为函数调用表达式(CallExpression),则可以进一步判断父节点的调用形式,如果调用方类型为identifier,则可以直接以调用方变量名作为该节点重命名后的节点名称;而如果为链式调用,则可以拼接调用方变量名,具体地可以循环入栈调用方变量名,直至调用方类型为identifier或者调用方类型为NewExpression则停止入栈。
假设另一节点的id.name或者name属性不为空,且该节点的父节点为类方法(ClassMethod),则可以进一步判断该父节点是一般类还是导出默认类(ExportDefaultClass),如果是一般类则可以直接以类名和该父节点方法名的组合作为相应节点重命名后的节点名称。
假设某一节点的id.name或者name属性为空,且该节点为函数表达式(FunctionExpression),则可以进一步判断其父节点类型,如果其父节点为表达式语句(ExpressionStatement),且具体为函数调用表达式(CallExpression),则可以表达式外层父节点函数名,也即该父节点的表达式外层的函数名作为相应节点重命名后的节点名称;而如果其父节点为表达式语句,且具体为赋值表达式(AssignmentExpression),则可以直接以父节点的赋值对象名,也即父节点所赋值的对象的对象名称作为相应节点重命名后的节点名称;等等。
此外,图7中所示的其他各种情况下的重命名方式可以参考上述逻辑,基于图7所示的流程分支分别确定,在此不加以赘述。
可选地,在本发明实施例中,在步骤210之后,进一步还可以包括:
步骤220,针对任一重命名后的节点,响应于所述节点重命名后的节点名称包含指定字符串,以所述节点所在源文件的文件名替换所述节点名称中的指定字符串,得到所述目标节点最终的节点名称;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
也即,在对每个节点进行初始的重命名之后,还需要通过上述的步骤220对重命名的节点名称进行进一步处理,以使得最终的节点名称中不包含指定字符串。
在本发明实施例中,也可以在对节点重命名时,对重命名后的节点名称进行export default class、export default function等特殊JavaScript/TypeScript语法的兼容处理。具体的兼容处理方式可以参考上述的步骤124,在此不加以赘述。
在本发明实施例中,对目标项目进行模块化,并对其中至少一个代码模块对应的节点进行重命名,使得节点与相应代码模块固定一一对应,并且测试用例执行时,通过实时收集并解析针对目标项目的测试覆盖率数据,从而建立测试用例和代码模块的关联关系并添加至测试用例执行时,提高测试用例与代码模块之间关联关系的准确性,使基于测试用例执行时的精准推荐测试用例成为可能。
而且,在本发明实施例中,公开了一种自定义的根据节点类型重命名节点的处理思路,而且可以针对重命名后的节点名称进行进一步去重、特殊语法兼容等处理,提高重命名后的节点名称的唯一性,使得节点名称可以与代码模块一一对应,从而进一步提高测试用例和代码模块之间的关联关系的准确性。
参照图8,示出了本发明实施例中一种测试用例知识库构建装置的结构示意图。
本发明实施例的测试用例知识库构建装置包括:覆盖率数据获取模块310和覆盖率数据解析模块320。
下面分别详细介绍各模块的功能以及各模块之间的交互关系。
覆盖率数据获取模块310,用于针对任一测试用例,基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据,所述目标项目为经过插桩处理的项目,所述代码覆盖率数据中至少包含所述目标项目中至少一个节点的身份标识;
覆盖率数据解析模块320,用于解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例的关联关系;
其中,每个所述节点的身份标识为在生成代码覆盖率数据之前,基于所述节点的节点类型对所述节点进行重命名得到。
参照图9,在本发明实施例中,所述覆盖率数据解析模块320,可以包括:
第一覆盖率数据解析子模块321,用于以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
第一关系建立子模块322,用于在所述测试用例知识库中建立所述目标代码模块、所述目标代码模块的执行次数与所述测试用例之间的关联关系,以根据任一代码模块在与其关联的各个测试用例下的执行次数,确定各个所述测试用例的优先级。
参照图10,在本发明实施例中,所述覆盖率数据解析模块320,可以包括:
第二覆盖率数据解析子模块323,用于以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点;
覆盖代码行识别子模块324,用于对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
第二关系建立子模块325,用于在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息与所述测试用例之间的关联关系,以在进行测试用例推荐时,当多个被推荐的测试用例关联同一代码模块,且各个测试用例在所述同一代码模块中覆盖的代码行相同时,对所述被推荐的测试用例进行去重处理。
参照图11,在本发明实施例中,所述覆盖率数据解析模块320,可以包括:
第一覆盖率数据解析子模块326,用于以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
覆盖代码行识别子模块327,用于针对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
第三关系建立子模块328,用于在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息、所述目标代码模块的执行次数与所述测试用例之间的关联关系。
可选地,在本发明实施例中,所述覆盖代码行识别子模块,具体可以用于:
获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的目标代码行,并过滤掉所述目标代码行中的非逻辑性信息,得到有效代码行;所述非逻辑性信息包括空白字符、单独占据一行的大括号、单独占据一行的小括号中的至少一种;
基于所述有效代码行生成摘要信息,作为所述代码行的标识信息。
可选地,在本发明实施例中,所述覆盖率数据解析模块,还可以包括:
节点身份标识更新子模块,用于针对任一所述目标节点,响应于所述目标节点的身份标识包含指定字符串,以所述目标节点所在源文件的文件名替换所述身份标识中的指定字符串,得到所述目标节点更新后的身份标识;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
可选地,在本发明实施例中,所述覆盖率数据解析模块,还可以包括:
身份标识过滤子模块,用于针对任一所述目标节点,检测所述目标节点是否与所述目标节点所在源文件中的其他目标节点的身份标识相同;
身份标识处理子模块,用于响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,分别在所述目标节点以及所述至少一个其他目标节点中的每个节点的身份标识中设置一个互不相同的标记符,以区分所述目标节点以及所述至少一个其他目标节中的每个节点;或者,响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,将身份标识相同的各个目标节点合并为一个目标节点;所述其他目标节点为除所述目标节点之外,被任一测试用例覆盖的其他节点。
参照图8,所述装置,还可以包括:
节点重命名模块410,用于针对所述目标项目的抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名,以在生成所述代码覆盖率数据时,以重命名后的节点名称作为所述节点的身份标识。
可选地,在所述目标项目为React Native项目的情况下,所述节点重命名模块410,具体可以用于:
针对所述抽象语法树中的任一节点,响应于所述节点的目标属性为空,且所述节点的节点类型为一般类的类方法,以所述类方法的类名和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为导出默认类的类方法,以export_default_class和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为对象方法,以所述对象方法的对象名和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为函数声明、函数表达式、箭头函数表达式中的任意一种,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
响应于所述节点的目标属性不完全为空,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
所述目标属性包括节点的id.name属性、name属性中的至少一种。
可选地,所述装置还可以包括:
节点名称调整模块,用于针对任一重命名后的节点,响应于重命名后的节点名称包含指定字符串,以所述节点所在源文件的文件名替换所述节点名称中的指定字符串,得到所述目标节点最终的节点名称;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
可选地,所述代码覆盖率数据中至少包含所述目标项目中满足所述指定条件的至少一个节点的身份标识。
可选地,所述目标项目包括基于JavaScript/TypeScript构建的项目、基于Android支持的程序语言构建的项目、基于iOS支持的程序语言构建的项目中的至少一种,所述基于JavaScript构建的项目至少包括React Native项目。
可选地,所述装置还可以包括:
代码覆盖率数据清除模块,用于清除当前测试用例的代码覆盖率数据,并针对另一测试用例,返回覆盖率数据获取模块,直至全部测试用例执行结束。
本发明实施例提供的测试用例知识库构建装置能够实现图1至图7的方法实施例中实现的各个过程,为避免重复,这里不再赘述。
优选的,本发明实施例还提供了一种电子设备,包括:处理器,存储器,存储在存储器上并可在处理器上运行的计算机程序,该计算机程序被处理器执行时实现上述测试用例知识库构建方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。
本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述测试用例知识库构建方法实施例的各个过程,且能达到相同的技术效果,为避免重复,这里不再赘述。其中,所述的计算机可读存储介质,如只读存储器(Read-Only Memory,简称ROM)、随机存取存储器(Random AccessMemory,简称RAM)、磁碟或者光盘等。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
上面结合附图对本发明的实施例进行了描述,但是本发明并不局限于上述的具体实施方式,上述的具体实施方式仅仅是示意性的,而不是限制性的,本领域的普通技术人员在本发明的启示下,在不脱离本发明宗旨和权利要求所保护的范围情况下,还可做出很多形式,均属于本发明的保护之内。
本领域普通技术人员可以意识到,结合本发明实施例中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

Claims (16)

1.一种测试用例知识库构建方法,其特征在于,包括:
针对任一测试用例,基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据,所述目标项目为经过插桩处理的项目,所述代码覆盖率数据中至少包含所述目标项目中至少一个节点的身份标识;
解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例的关联关系;
其中,所述节点的身份标识为在生成代码覆盖率数据之前,基于所述节点的节点类型对所述节点进行重命名得到。
2.根据权利要求1所述的方法,其特征在于,所述解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例之间的关联关系的步骤,包括:
以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
在所述测试用例知识库中建立所述目标代码模块、所述目标代码模块的执行次数与所述测试用例之间的关联关系,以根据任一代码模块在与其关联的各个测试用例下的执行次数,确定各个测试用例的优先级。
3.根据权利要求1所述的方法,其特征在于,所述解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例之间的关联关系的步骤,包括:
以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点;
针对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息与所述测试用例之间的关联关系,以在进行测试用例推荐时,当多个被推荐的测试用例关联同一代码模块,且各个测试用例在所述同一代码模块中覆盖的代码行相同时,对所述被推荐的测试用例进行去重处理。
4.根据权利要求1所述的方法,其特征在于,所述解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例之间的关联关系的步骤,包括:
以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点,以及在所述测试用例的执行过程中,每个所述目标节点对应目标代码模块的执行次数;
针对任一所述目标节点,获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息;
在所述测试用例知识库中建立所述目标代码模块、所述代码行的标识信息、所述目标代码模块的执行次数与所述测试用例之间的关联关系。
5.根据权利要求3或4所述的方法,其特征在于,所述获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的代码行的标识信息的步骤,包括:
获取所述目标节点对应的目标代码模块中被所述测试用例覆盖的目标代码行,并过滤掉所述目标代码行中的非逻辑性信息,得到有效代码行;所述非逻辑性信息包括空白字符、单独占据一行的大括号、单独占据一行的小括号中的至少一种;
基于所述有效代码行生成摘要信息,作为所述代码行的标识信息。
6.根据权利要求2-4中任一项所述的方法,其特征在于,在所述以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点的步骤之后,还包括:
针对任一所述目标节点,响应于所述目标节点的身份标识包含指定字符串,以所述目标节点所在源文件的文件名替换所述身份标识中的指定字符串,得到所述目标节点更新后的身份标识;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
7.根据权利要求2-4中任一项所述的方法,其特征在于,在所述以所述目标项目包含的每个源文件为单位,解析所述代码覆盖率数据,并获取每个所述源文件中被所述测试用例覆盖的目标节点的步骤之后,还包括:
针对任一所述目标节点,检测所述目标节点是否与所述目标节点所在源文件中的其他目标节点的身份标识相同;
响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,分别在所述目标节点以及所述至少一个其他目标节点中的每个节点的身份标识中设置一个互不相同的标记符,以区分所述目标节点以及所述至少一个其他目标节中的每个节点;
或者,响应于所述目标节点与所述目标节点所在源文件中的至少一个其他目标节点的身份标识相同,将身份标识相同的各个目标节点合并为一个目标节点;
所述其他目标节点为除所述目标节点之外,被任一测试用例覆盖的其他节点。
8.根据权利要求1-4中任一项所述的方法,其特征在于,在所述生成所述测试用例针对所述目标项目的代码覆盖率数据的步骤之前,还包括:
针对所述目标项目的抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名,以在生成所述代码覆盖率数据时,以重命名后的节点名称作为所述节点的身份标识。
9.根据权利要求8所述的方法,其特征在于,在所述目标项目为React Native项目的情况下,所述针对所述抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名的步骤,包括:
针对所述抽象语法树中的任一节点,响应于所述节点的目标属性为空,且所述节点的节点类型为一般类的类方法,以所述类方法的类名和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为导出默认类的类方法,以export_default_class和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为对象方法,以所述对象方法的对象名和方法名的组合对所述节点进行重命名;
响应于所述节点的目标属性为空,且所述节点的节点类型为函数声明、函数表达式、箭头函数表达式中的任意一种,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
响应于所述节点的目标属性不完全为空,根据所述节点的父节点的节点类型,确定所述节点的重命名方式并对所述节点进行重命名;
所述目标属性包括节点的id.name属性、name属性中的至少一种。
10.根据权利要求8所述的方法,其特征在于,在所述针对所述抽象语法树中的任一节点,响应于所述节点满足指定条件,根据所述节点的节点类型对所述节点进行重命名的步骤之后,还包括:
针对任一重命名后的节点,响应于重命名后的节点名称包含指定字符串,以所述节点所在源文件的文件名替换所述节点名称中的指定字符串,得到所述目标节点最终的节点名称;
其中,所述指定字符串包括export_default_class、export_default_function中的至少一种。
11.根据权利要求8所述的方法,其特征在于,所述代码覆盖率数据中至少包含所述目标项目中满足所述指定条件的至少一个节点的身份标识。
12.根据权利要求1-4中任一项所述的方法,其特征在于,所述目标项目包括基于JavaScript/TypeScript构建的项目、基于Android支持的程序语言构建的项目、基于iOS支持的程序语言构建的项目中的至少一种,所述基于JavaScript构建的项目至少包括ReactNative项目。
13.根据权利要求1所述的方法,其特征在于,还包括:
清除当前测试用例的代码覆盖率数据,并针对另一测试用例,进入基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据的步骤,直至全部测试用例执行结束。
14.一种测试用例知识库构建装置,其特征在于,包括:
覆盖率数据获取模块,用于针对任一测试用例,基于目标项目执行所述测试用例,并生成所述测试用例针对所述目标项目的代码覆盖率数据,所述目标项目为经过插桩处理的项目,所述代码覆盖率数据中至少包含所述目标项目中至少一个节点的身份标识;
覆盖率数据解析模块,用于解析所述代码覆盖率数据,获取所述测试用例执行后所述目标项目中被覆盖的目标代码模块,并在测试用例知识库中建立所述目标代码模块与所述测试用例的关联关系;
其中,每个所述节点的身份标识为在生成代码覆盖率数据之前,基于所述节点的节点类型对所述节点进行重命名得到。
15.一种电子设备,其特征在于,包括:处理器、存储器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如权利要求1至13中任一项所述的测试用例知识库构建方法的步骤。
16.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至13中任一项所述的测试用例知识库构建方法的步骤。
CN202110903393.7A 2021-08-06 2021-08-06 测试用例知识库构建方法、装置、电子设备及存储介质 Pending CN113704094A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110903393.7A CN113704094A (zh) 2021-08-06 2021-08-06 测试用例知识库构建方法、装置、电子设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110903393.7A CN113704094A (zh) 2021-08-06 2021-08-06 测试用例知识库构建方法、装置、电子设备及存储介质

Publications (1)

Publication Number Publication Date
CN113704094A true CN113704094A (zh) 2021-11-26

Family

ID=78651898

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110903393.7A Pending CN113704094A (zh) 2021-08-06 2021-08-06 测试用例知识库构建方法、装置、电子设备及存储介质

Country Status (1)

Country Link
CN (1) CN113704094A (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114090464A (zh) * 2022-01-24 2022-02-25 中国民航信息网络股份有限公司 Json格式的测试用例更新方法及相关装置
CN115168873A (zh) * 2022-09-09 2022-10-11 南京国睿信维软件有限公司 基于c++语言的软件防破解方法
CN116610577A (zh) * 2023-05-25 2023-08-18 成都融见软件科技有限公司 一种覆盖率获取方法
CN116627974A (zh) * 2023-05-25 2023-08-22 成都融见软件科技有限公司 一种覆盖率存储系统
CN116627973A (zh) * 2023-05-25 2023-08-22 成都融见软件科技有限公司 一种数据定位系统

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114090464A (zh) * 2022-01-24 2022-02-25 中国民航信息网络股份有限公司 Json格式的测试用例更新方法及相关装置
CN114090464B (zh) * 2022-01-24 2022-04-26 中国民航信息网络股份有限公司 Json格式的测试用例更新方法及相关装置
CN115168873A (zh) * 2022-09-09 2022-10-11 南京国睿信维软件有限公司 基于c++语言的软件防破解方法
CN115168873B (zh) * 2022-09-09 2022-11-29 南京国睿信维软件有限公司 基于c++语言的软件防破解方法
CN116610577A (zh) * 2023-05-25 2023-08-18 成都融见软件科技有限公司 一种覆盖率获取方法
CN116627974A (zh) * 2023-05-25 2023-08-22 成都融见软件科技有限公司 一种覆盖率存储系统
CN116627973A (zh) * 2023-05-25 2023-08-22 成都融见软件科技有限公司 一种数据定位系统
CN116610577B (zh) * 2023-05-25 2024-01-26 成都融见软件科技有限公司 一种覆盖率获取方法
CN116627973B (zh) * 2023-05-25 2024-02-09 成都融见软件科技有限公司 一种数据定位系统
CN116627974B (zh) * 2023-05-25 2024-02-09 成都融见软件科技有限公司 一种覆盖率存储系统

Similar Documents

Publication Publication Date Title
CN113704094A (zh) 测试用例知识库构建方法、装置、电子设备及存储介质
CN109388566B (zh) 一种代码覆盖率分析方法、装置、设备及存储介质
CN107665171B (zh) 自动回归测试方法及装置
CN108509658B (zh) 一种xml文件的解析方法和装置
CN110968509B (zh) 一种批量化自定义变量的方法和系统
CN109298855B (zh) 一种网络靶场管理系统及其实现方法、装置、存储介质
CN110888756A (zh) 一种诊断日志生成方法及装置
CN111190807A (zh) 一种埋点测试方法及设备
CN111324781A (zh) 一种数据分析方法、装置及设备
CN108897678B (zh) 静态代码检测方法和静态代码检测系统、存储设备
CN103095698A (zh) 客户端软件的修复方法、装置和通信系统
CN110765196A (zh) 生成并执行etl任务的方法及设备
CN113031995B (zh) 一种更新规则的方法、装置、存储介质以及电子设备
CN115757174A (zh) 一种数据库的差异检测方法及装置
CN111459817B (zh) 一种程序执行码的检验方法及装置
CN112463596B (zh) 测试用例数据的处理方法、装置、设备以及处理设备
CN115098362A (zh) 页面测试方法、装置、电子设备以及存储介质
CN113342647A (zh) 一种测试数据的生成方法及装置
CN112433943A (zh) 基于抽象语法树的环境变量检测方法、装置、设备及介质
CN107196789B (zh) 一种校验基站参数的方法和装置
CN111400245A (zh) 美术资源迁移方法及装置
CN113568662B (zh) 一种基于调用关系的代码变更影响范围分析方法及系统
CN113138936B (zh) 数据处理方法、装置、存储介质及处理器
CN114448851B (zh) 一种数据自动化测试方法及系统
CN117194501B (zh) Dcs趋势测点跳转逻辑组态的方法、系统、设备及介质

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