代码覆盖率测试方法及装置与流程

文档序号:12363451阅读:253来源:国知局
代码覆盖率测试方法及装置与流程
本公开涉及代码测试领域,尤其涉及代码覆盖率测试方法及装置。
背景技术
:代码覆盖率测试是衡量软件测试质量的一个重要标准。相关技术中,在分布式多进程环境下进行代码覆盖率测试时,子进程的测试结果很可能会覆盖掉主进程的测试结果,导致主进程的代码覆盖率数据丢失,且各个子进程之间的所述代码覆盖率数据容易相互覆盖,掩盖了代码编写的冗余问题。造成在分布式多进程情况下,测试得到的所述代码覆盖率数据不够准确,也就无法准确反映软件测试质量。技术实现要素:有鉴于此,本公开提供了代码覆盖率测试方法及装置,以解决相关技术中的不足。根据本公开实施例的第一方面,提供一种代码覆盖率测试方法,所述方法包括:测试目标代码中当前进程的代码覆盖率数据;生成包括所述目标代码中所有进程的所述代码覆盖率数据的目标文件;根据所述目标文件确定所述目标代码的整体代码覆盖率数据。可选地,所述测试目标代码中当前进程的代码覆盖率数据,包括:通过代码覆盖率测试工具对所述当前进程进行测试,获得用于表征所述当前进程每一行代码是否被执行的代码执行情况;将所述代码执行情况写入预先分配的执行栈空间,所述执行栈空间是与所述当前进程对应的且用于存放所述代码执行情况的栈空间;对所述执行栈空间中存放的所述代码执行情况进行分析,获取所述当前进程的所述代码覆盖率数据。可选地,所述生成包括所述目标代码中所有进程的所述代码覆盖率数据的目标文件,包括:将所述当前进程的所述代码覆盖率数据写入与所述当前进程对应的用于表征代码覆盖情况的文件;在所述文件中携带所述当前进程的当前进程标识;根据所述文件携带的所述当前进程标识对所述目标代码中所述所有进程对应的所述文件进行合并,得到所述目标文件。可选地,所述在所述文件中携带所述当前进程的当前进程标识,包括:当所述当前进程调用预设函数时,根据调用所述预设函数的执行结果得到所述当前进程的所述当前进程标识;在所述文件的文件数据中携带所述当前进程标识。可选地,所述预设函数为将所述当前进程的所有值复制到另一进程,使得所述另一进程执行与所述当前进程相同动作的函数。根据本公开实施例的第二方面,提供一种代码覆盖率测试装置,所述装置包括:测试模块,被配置为测试目标代码中当前进程的代码覆盖率数据;文件生成模块,被配置为生成包括所述目标代码中所有进程的所述代码覆盖率数据的目标文件;整体覆盖率确定模块,被配置为根据所述目标文件确定所述目标代码的整体代码覆盖率数据。可选地,所述测试模块包括:测试子模块,被配置为通过代码覆盖率测试工具对所述当前进程进行测试,获得用于表征所述当前进程每一行代码是否被执行的代码执行情况;第一写入子模块,被配置为将所述代码执行情况写入预先分配的执行栈空间,所述执行栈空间是与所述当前进程对应的且用于存放所述代码执行情况的栈空间;分析子模块,被配置为对所述执行栈空间中存放的所述代码执行情况进行分析,获取所述当前进程的所述代码覆盖率数据。可选地,所述目标文件生成模块包括:第二写入子模块,被配置为将所述当前进程的所述代码覆盖率数据写入与所述当前进程对应的用于表征代码覆盖情况的文件;携带子模块,被配置为在所述文件中携带所述当前进程的当前进程标识;合并子模块,被配置为根据所述文件携带的所述当前进程标识对所述目标代码中所述所有进程对应的所述文件进行合并,得到所述目标文件。可选地,所述携带子模块包括:获取单元,被配置为当所述当前进程调用预设函数时,根据调用所述预设函数的执行结果得到所述当前进程的所述当前进程标识;携带单元,被配置为在所述文件的文件数据中携带所述当前进程标识。可选地,所述预设函数为将所述当前进程的所有值复制到另一进程,使得所述另一进程执行与所述当前进程相同动作的函数。根据本公开实施例的第三方面,提供一种代码覆盖率测试装置,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器被配置为:测试目标代码中当前进程的代码覆盖率数据;生成包括所述目标代码中所有进程的所述代码覆盖率数据的目标文件;根据所述目标文件确定所述目标代码的整体代码覆盖率数据。本公开的实施例提供的技术方案可以包括以下有益效果:本公开实施例中,可以分别测试目标代码中当前进程的代码覆盖率数据,进而生成包括了所述目标代码中所述所有进程的所述代码覆盖率数据的目标文件,从而确定出所述目标代码的整体代码覆盖率数据。通过上述过程,可以区分出主进程和不同的子进程,使得各个进程的覆盖率数据相互独立,不产生干扰,确保最终整体覆盖率数据的准确性,将代码编写的冗余问题反映出来,准确反映软件测试质量。本公开实施例中,当前进程每一行代码是否被执行的执行情况写入了执行栈空间,可以通过分析所述执行栈空间获取当前进程的代码覆盖率数据,实现简便,可用性高。本公开实施例中,在测试得到当前进程的代码覆盖率数据后,可以将其写入用于表征代码覆盖情况的文件,且所述文件中携带了与当前进程对应的当前进程标识。进一步地,可以对所有不同的所述当前进程标识对应的所述文件进行合并,得到包括所述目标代码中所有所述进程的所述代码覆盖率数据的目标文件。通过不同文件中携带的所述当前进程标识区分出主进程和不同的子进程,在对所述文件进行合并时,同样可以根据所述当前进程标识避免进程之间的代码覆盖率数据相互干扰,确保最终整体覆盖率数据的准确性,将代码编写的冗余问题反映出来,准确反映软件测试质量。本公开实施例中,在当前进程调用预设函数时,可以根据调用所述预设函数的执行结果得到所述当前进程的当前进程标识,从而在与所述当前进程对应的文件中携带所述当前进程标识。可选地,所述预设函数为将所述当前进程的所有值复制到另一进程,使得所述另一进程执行与所述当前进程相同动作的函数。通过上述过程可以快速、准确的确定所述当前进程标识,实现简便,可用性高。本公开实施例中,基于目标代码中所有所述进程的所述代码覆盖率数据的目标文件来确定所述目标代码的整体代码覆盖率数据,可以准确地将代码编写的冗余问题反映出来,且可以准确反映软件测试质量。应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。附图说明此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。图1是本公开根据一示例性实施例示出的一种代码覆盖率测试方法流程图;图2是本公开根据一示例性实施例示出的另一种代码覆盖率测试方法流程图;图3是本公开根据一示例性实施例示出的另一种代码覆盖率测试方法流程图;图4是本公开根据一示例性实施例示出的另一种代码覆盖率测试方法流程图;图5是本公开根据一示例性实施例示出的另一种代码覆盖率测试方法流程图;图6是本公开根据一示例性实施例示出的一种代码覆盖率测试装置框图;图7是本公开根据一示例性实施例示出的另一种代码覆盖率测试装置框图;图8是本公开根据一示例性实施例示出的另一种代码覆盖率测试装置框图;图9是本公开根据一示例性实施例示出的另一种代码覆盖率测试装置框图;图10是本公开根据一示例性实施例示出的一种用于代码覆盖率测试装置的一结构示意图。具体实施方式这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。本公开实施例提供的代码覆盖率测试方法可以用于分布式多进程环境中的代码测试系统。如图1所示,图1是根据一示例性实施例示出的一种代码覆盖率测试方法,包括以下步骤:在步骤101中,测试目标代码中当前进程的代码覆盖率数据。可选地,步骤101如图2所示,图2是在前述图1所示实施例的基础上示出的另一种代码覆盖率测试方法,包括以下步骤:在步骤101-1中,通过代码覆盖率测试工具对所述当前进程进行测试,获得用于表征所述当前进程每一行代码是否被执行的代码执行情况。本步骤中,所述代码测试系统可以启动代码覆盖率测试工具,按照相关技术对所述当前进程进行代码覆盖率测试,从而得到所述代码执行情况。在步骤101-2中,将所述代码执行情况写入预先分配的执行栈空间,所述执行栈空间是与所述当前进程对应的且用于存放所述代码执行情况的栈空间。本公开实施例中,系统按照相关技术为每个进程预先分配了执行栈空间。所述执行栈空间是与所述当前进程对应的且用于存放所述代码执行情况的栈空间。本步骤中,可以在测试出所述代码执行情况后,将所述代码执行情况按照相关技术写入所述执行栈空间。在步骤101-3中,对所述执行栈空间中存放的所述代码执行情况进行分析,获取所述当前进程的所述代码覆盖率数据。本步骤中,可以按照相关技术通过分析所述执行栈空间中存放的所述代码执行情况,得到所述当前进程的所述代码覆盖率数据。例如,所述执行情况为所述当前进程共包括n行代码,其中有m行代码未执行,则所述当前进程的所述代码覆盖率数据为在步骤102中,生成包括所述目标代码中所有进程的所述代码覆盖率数据的目标文件。可选地,步骤102如图3所示,图3是在前述图1所示实施例的基础上示出的另一种代码覆盖率测试方法,包括以下步骤:在步骤102-1中,将当前进程的所述代码覆盖率数据写入与所述当前进程对应的用于表征代码覆盖情况的文件。本步骤中,可以按照相关技术将所述当前进程的所述代码覆盖率数据写入相应的所述文件中。可选地,所述文件可以是coverage.dat文件。在步骤102-2中,在所述文件中携带所述当前进程的当前进程标识。本步骤中,为了避免进程之间的所述代码覆盖率数据相互干扰,需要在与所述当前进程对应的所述文件中携带所述当前进程标识。可选地,所述当前进程标识为所述当前进程的进程号。可选地,步骤102-2如图4所示,图4是在前述图3所示实施例的基础上示出的另一种代码覆盖率测试方法,包括以下步骤:在步骤102-21中,当所述当前进程调用预设函数时,根据调用所述预设函数的执行结果得到所述当前进程的所述当前进程标识。可选地,所述预设函数为将所述当前进程的所有值复制到另一进程,使得所述另一进程执行与所述当前进程相同动作的函数。例如,fork函数。相关技术中,当所述当前进程调用所述预设函数时,执行结果至少包括了所述当前进程的所述当前进程标识。因此,本步骤中,可以根据调用fork函数的执行结果得到所述当前进程标识。在步骤102-22中,在所述文件的文件数据中携带所述当前进程标识。本步骤中,可以按照相关技术在所述文件的文件数据中携带所述当前进程标识。在本公开实施例中,如果所述当前进程的所述代码覆盖率数据写入相应的coverage.dat文件,则在该文件的文件数据中还需要携带所述当前进程标识,即所述当前进程的进程号。最终得到多个与进程号对应的coverage.dat文件,如表1所示。表1用于表征代码覆盖情况的文件进程标识coverage1.datAcoverage2.datBcoverage3.datC在步骤102-3中,根据所述文件携带的所述当前进程标识对所述目标代码中所述所有进程对应的所述文件进行合并,得到所述目标文件。本步骤中,可以按照相关技术对所述目标代码中所有不同的所述当前进程标识对应的所述文件进行合并,从而得到所述目标文件。通过所述文件中携带的所述当前进程标识对进程进行区分,在对所述文件进行合并时,可以根据所述当前进程标识避免进程之间的代码覆盖率数据相互干扰,确保最终整体覆盖率数据的准确性,将代码编写的冗余问题反映出来,准确反映软件测试质量。在步骤103中,根据所述目标文件确定所述目标代码的整体代码覆盖率数据。本步骤中,由于所述目标文件中包括了所述目标代码中所述所有进程的所述代码覆盖率数据,则可以按照相关技术计算所述整体覆盖率数据。可选地,所述整体覆盖率数据可以是每个进程的所述代码覆盖率数据的平均值。例如,目标代码中包括3个进程,对应的所述代码覆盖率数据分别为a、b和c,则所述整体覆盖率数据可以是(a+b+c)/3。进一步地,还可以根据所述目标文件生成代码覆盖率报告。所述代码覆盖率报告中除了可以包括每个进程的所述代码覆盖率数据和所述整体覆盖率数据外,还可以包括用于表征所述目标代码中每个进程的返回值是否是满足预设需求的返回值的第一执行结果,用于表征当前函数是否得到正确返回值的第二执行结果,用于表征所有边界条件是否覆盖到了所有的所述目标代码的第三执行结果,以及用于表征所述目标代码中是否有冗余代码的第四执行结果等。上述实施例中,可以分别测试目标代码中当前进程的代码覆盖率数据,进而生成包括了所述目标代码中所述所有进程的所述代码覆盖率数据的目标文件,从而确定出所述目标代码的整体代码覆盖率数据。通过上述过程,可以区分出主进程和不同的子进程,使得各个进程的覆盖率数据相互独立,不产生干扰,确保最终整体覆盖率数据的准确性,将代码编写的冗余问题反映出来,准确反映软件测试质量。如图5所示,图5是根据一示例性实施例示出的另一种代码覆盖率测试方法流程图,包括以下步骤:在步骤201中,通过代码覆盖率测试工具对所述当前进程进行测试,获得用于表征所述当前进程每一行代码是否被执行的代码执行情况。在步骤202中,将所述代码执行情况写入预先分配的执行栈空间。其中,所述执行栈空间是所述代码测试系统预先分配的与所述当前进程对应的且用于存放所述代码执行情况的栈空间。在步骤203中,对所述执行栈空间中存放的所述代码执行情况进行分析,获取所述当前进程的所述代码覆盖率数据。本步骤中,可以按照相关技术通过分析所述代码执行情况,获取所述当前进程的所述代码覆盖率数据。在步骤204中,将所述当前进程的所述代码覆盖率数据写入与所述当前进程对应的用于表征代码覆盖情况的文件。本步骤中,可以按照相关技术将所述当前进程的所述代码覆盖率数据写入相应的所述文件中。可选地,所述文件可以是coverage.dat文件。在步骤205中,当所述当前进程调用预设函数时,根据调用所述预设函数的执行结果得到所述当前进程的所述当前进程标识。可选地,所述预设函数为将所述当前进程的所有值复制到另一进程,使得所述另一进程执行与所述当前进程相同动作的函数。例如,fork函数。当所述当前进行调用了fork函数时,调用fork函数的执行结果中包括了所述当前进程标识,即所述当前进程的进程号。在步骤206中,在所述文件的文件数据中携带所述当前进程标识。本步骤中,在coverage.dat文件的文件数据中还需要携带所述当前进程的进程号,最终得到多个与进程号对应的coverage.dat文件。在步骤207中,根据所述文件携带的所述当前进程标识对所述目标代码中所有进程对应的所述文件进行合并,得到包括所述目标代码中所述所有进程的所述代码覆盖率数据的目标文件。本步骤中,由于所有的coverage.dat文件中均携带了相应的进程号,在进行合并时,保留不同进程号对应的所述代码覆盖率数据。因此,不会产生进程之间的所述代码覆盖率数据相互干扰或覆盖的情况。在步骤208中,根据所述目标文件确定所述目标代码的整体代码覆盖率数据。本步骤中,由于所述目标文件中包括了所述目标代码中所有进程的所述代码覆盖率数据,则可以按照相关技术计算所述整体覆盖率数据。计算方式与上述实施例提供的计算方式相同,在此不再赘述。上述实施例中,当前进程每一行代码是否被执行的执行情况写入了执行栈空间,可以通过分析所述执行栈空间获取当前进程的代码覆盖率数据。在测试得到当前进程的代码覆盖率数据后,可以将其写入用于表征代码覆盖情况的文件,且所述文件中携带了与当前进程对应的当前进程标识。进一步地,可以对所有不同的所述当前进程标识对应的所述文件进行合并,得到包括所述目标代码中所有所述进程的所述代码覆盖率数据的目标文件。通过不同文件中携带的所述当前进程标识区分出主进程和不同的子进程,在对所述文件进行合并时,同样可以根据所述当前进程标识避免进程之间的代码覆盖率数据相互干扰。基于目标代码中所有所述进程的所述代码覆盖率数据的目标文件来确定所述目标代码的整体代码覆盖率数据,可以确保最终整体覆盖率数据的准确性,将代码编写的冗余问题反映出来,准确反映软件测试质量。与前述方法实施例相对应,本公开还提供了装置的实施例。如图6所示,图6是本公开根据一示例性实施例示出的一种代码覆盖率测试装置框图,包括:测试模块310,被配置为测试目标代码中当前进程的代码覆盖率数据;文件生成模块320,被配置为生成包括所述目标代码中所有进程的所述代码覆盖率数据的目标文件;整体覆盖率确定模块330,被配置为根据所述目标文件确定所述目标代码的整体代码覆盖率数据。如图7所示,图7是本公开根据一示例性实施例示出的另一种代码覆盖率测试装置框图,该实施例在前述图6所示实施例的基础上,所述测试模块310包括:测试子模块311,被配置为通过代码覆盖率测试工具对所述当前进程进行测试,获得用于表征所述当前进程每一行代码是否被执行的代码执行情况;第一写入子模块312,被配置为将所述代码执行情况写入预先分配的执行栈空间,所述执行栈空间是与所述当前进程对应的且用于存放所述代码执行情况的栈空间;分析子模块313,被配置为对所述执行栈空间中存放的所述代码执行情况进行分析,获取所述当前进程的所述代码覆盖率数据。如图8所示,图8是本公开根据一示例性实施例示出的另一种代码覆盖率测试装置框图,该实施例在前述图6所示实施例的基础上,所述文件生成模块320包括:第二写入子模块321,被配置为将所述当前进程的所述代码覆盖率数据写入与所述当前进程对应的用于表征代码覆盖情况的文件;携带子模块322,被配置为在所述文件中携带所述当前进程的当前进程标识;合并子模块323,被配置为根据所述文件携带的所述当前进程标识对所述目标代码中所述所有进程对应的所述文件进行合并,得到所述目标文件。如图9所示,图9是本公开根据一示例性实施例示出的另一种代码覆盖率测试装置框图,该实施例在前述图8所示实施例的基础上,所述携带子模块322包括:获取单元3221,被配置为当所述当前进程调用预设函数时,根据调用所述预设函数的执行结果得到所述当前进程的所述当前进程标识;携带单元3222,被配置为在所述文件的文件数据中携带所述当前进程标识。可选地,所述预设函数为将所述当前进程的所有值复制到另一进程,使得所述另一进程执行与所述当前进程相同动作的函数。对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本公开方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。相应的,本公开还提供一种代码覆盖率测试装置,包括:处理器;用于存储处理器可执行指令的存储器;其中,所述处理器被配置为:测试目标代码中当前进程的代码覆盖率数据;生成包括所述目标代码中所有进程的所述代码覆盖率数据的目标文件;根据所述目标文件确定所述目标代码的整体代码覆盖率数据。如图10所示,图10是根据一示例性实施例示出的一种用于代码覆盖率测试装置1000的一结构示意图。例如,装置1000可以被提供为代码测试系统的服务器。参照图10,装置1000包括处理组件1022,其进一步包括一个或多个处理器,以及由存储器1032所代表的存储器资源,用于存储可由处理组件1022的执行的指令,例如应用程序。存储器1032中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件1022被配置为执行指令,以执行上述代码覆盖率测试方法。装置1000还可以包括一个电源组件1026被配置为执行装置1000的电源管理,一个有线或无线网络接口1050被配置为将装置1000连接到网络,和一个输入输出(I/O)接口1058。装置1000可以操作基于存储在存储器1032的操作系统,例如WindowsServerTM,MacOSXTM,UnixTM,LinuxTM,FreeBSDTM或类似。本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本
技术领域
中的公知常识或者惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。以上所述仅为本公开的较佳实施例而已,并不用以限制本公开,凡在本公开的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本公开保护的范围之内。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1