精华内容
下载资源
问答
  • 测试覆盖率统计工具_使用测试工具和方法进行测试覆盖率
    千次阅读
    2020-05-14 06:35:52

    测试覆盖率统计工具

    概述:

    要定义“测试覆盖率”,我们必须谈论以下主题:

    1. 测试覆盖的目的。
    2. 不同类型的测试覆盖率标准。
    3. 测试覆盖率指标
    4. 单元测试范围
    5. 测试覆盖率工具
    6. 测试覆盖范围的优缺点。

    考试目的

    测试覆盖率是软件测试中使用的估计值。 它提供了有关测试应用程序书面编码级别的详细信息。

    这是一种看起来很直的测试,因此出现在白盒测试的标题中。 当前,在软件工程领域,测试覆盖面的重要性是广泛的,其当前计划方法取决于计算机语言。 测试覆盖率方法是发现的用于有效软件测试的初始方法。

    不同类型的测试覆盖率标准。

    为了计算测试集合已覆盖的代码比例,使用了一个或多个覆盖标准。 这些标准通常作为法规或必要性而有所不同。

    基本覆盖标准

    覆盖标准很多,重要性如下

    • 功能覆盖范围–此处已识别出系统中的每个过程或功能。
    • 语句 覆盖范围 –系统中的每个语句都已执行。
    • 分支机构覆盖范围 –执行每个系统配置的每个部分。
    • 条件覆盖率 –计算出的布尔布尔词组既正确又不正确。

    定制结论范围

    它是功能覆盖率和分支覆盖率的合并,有时也描述结论覆盖率。 该标准要求调用和离开应用程序中的每个位置至少要调用一次,并且应用程序中的每个结论都应至少使用一次所有可能的结果。 在这种情况下,结论是一个布尔术语,表示情况,不包含布尔运算符,也不添加布尔运算符。 但是,此描述与分支覆盖范围不同。 各种各样的人将结论覆盖率作为分支覆盖率的另一个词。

    结论覆盖范围同样需要结论和情况覆盖范围都令人满意。 但是,对于安全至关重要的程序,通常有必要满足定制结论的覆盖范围。 该标准扩展了结论标准,要求每个州都必须影响结论。

    各种州的报道

    该标准要求在每个结论中都经历所有情况的合并。

    约束值覆盖

    约束值覆盖范围要求在接受约束的过程中,必须测量这些约束的整个一般原则。 主动性是要经历约束的所有一般可能原则。

    单元测试范围

    单元测试会通知我们是否按估算执行了源代码,并且测试覆盖率会通知我们还有哪些要测试。

    主要是程序员认识到这种方法并同意其价值建议,并经常客观地全面报道。 尽管完全覆盖是一个很好的目标,但是完全不正确的处理方式可能会导致麻烦。 独特的软件创建尝试过程以任何要测试的语句或分支的数量来处理。 但是,由于具有完整的语句或分支覆盖范围,因此源代码的逻辑中可能会出现严重的错误 ,从而避免了程序员和管理员使用虚假的保护逻辑。

    语句和分支的覆盖范围很好地发现了未实现的源代码中建立的明显问题,但是经常忽略与相同的结论配置和结论连接有关的错误。 另外,路径覆盖是一个更强大且更全面的过程,有助于尽早发现缺陷。

    测试覆盖率指标

    有六种测试覆盖率指标,如下所述。

    线路覆盖

    行覆盖率检查是复制时实现的源代码行。 随函附上将演示适当文件中存在的合理的源代码行数量,以及在复制时实现的合理行数量,以及代表实现的行比例的比例。 如果为语句选择了冗长的形式,则所附内容将说明在整个复制执行过程中未实现的原因。

    切换覆盖

    复制时的切换覆盖率检查是该行或目录的这一位从零的重要性转换为一,然后从一恢复为零。 当它向后和向前关闭至少一次时,应该完全封闭一点。 该度量标准并不向最终用户表示已观察到每一个多位向量的价值。

    内存覆盖率

    内存覆盖率检查与设计中采用的回收或多维集合有关的大量问题,以及以下详细信息:

    从0到1检查每个可访问的记忆组件关闭的所有位。

    • 从1到0检查每个可访问的记忆组件关闭的所有位。
    • 检查是否可以记下每个可访问的记忆组件。
    • 检查每个可理解的记忆组件是否能被理解。

    回收或多维集合可能具有两种范围,即打包的和未打包的。 打包方面的细节特定于集合语句的左侧,而未打包方面的细节特定于集合语句的右侧。

    组合逻辑覆盖

    当功能在整个娱乐课程中进行估算时,这种类型的覆盖范围会检查结果。

    这种组合逻辑覆盖在娱乐时未尝试过的迹象的形成性理性合并中非常有价值,从而揭示了确认方面的可能差距。

    有限状态机覆盖率

    这种覆盖率度量标准检查是否有可能达到每个条件并遍历指定状态机中的每个可能路径。

    有限状态机的覆盖范围包含两种可以处理的覆盖范围详细信息,

    • 条件覆盖率–它在重新创建时检查有限状态机覆盖率命中的所有条件。
    • 条件演化覆盖度–检查娱乐中所有条件之间的有限状态机覆盖度演化。

    断言范围

    这种类型的覆盖率度量会检查可以并入设计中的声明的所有可能的覆盖率问题。

    目前,封闭式能够发现计划中观察到的所有开放式确认语言陈述成分。 在大多数情况下,开放式确认语言声明组件是一个或多个完整的覆盖问题。 尽管最终用户有一个严格的声明示例,以确保出于暴露的原因,但封闭框复制了此声明部分,维护过程中,声明中的处理问题已因娱乐而受到打击,而没有受到影响。 这允许最终用户确保计划中的其他复合治疗情况。

    目前,仅维护开放式验证语言1.6版和新版本。 开放式验证语言的先前版本可能无法正常工作,也不能维护。

    测试覆盖率工具

    代码覆盖率工具

    目前,程序员群体在高级测试覆盖工具的可访问性方面处于相对较好的状态。 我们将对其中的一小部分一目了然,但还有更多更多,多数用于贸易,但各种都是免费的或开源的。

    初步而言,我们首先观察如何正常执行测试覆盖率交易。

    执行方式

    执行方法可以分为两种独立的执行类型:

    • 仪器仪表

    这种类型的方法涉及通过将覆盖代码插入计划的位置来影响源代码。 详细而言,检测方式有两个指示:类检测和源检测。 毫不意外的是,区别在于类工具将覆盖代码直接插入到汇编.class文件中,而源工具生成了资源的中介版本,然后将其组装到最终的,源实现的.class文件中。 几乎所有的测试覆盖率工具都选择了这两种检测方法之一。

    • 自定义JVM

    将覆盖率代码插入字节码的另一种选择是将责任转移到定制JVM本身。 可以通过让基本仪器继续计算要执行的重载类的划分来执行测试覆盖率调查。 不过,在观察中,没有任何公认的工具采用这种类型。

    测试范围的优缺点

    优点

    • 它建立了额外的测试条件以增强曝光度。
    • 它有助于发现不是由一组测试条件实现的应用程序的位置。
    • 它有助于有效地对测试覆盖率进行大量计算,从而最终实现卓越的软件应用程序。

    坏处

    • 测试覆盖能力的一个问题是,它计算已记下的内容的处理方式,即代码无法声明与未记下的应用程序有关的任何内容。
    • 如果尚未执行特定方法或从需求中删除了某个方法,则基于配置的方法无法声明其简单地在先前存在的配置中观察到的任何内容。

    结论

    到目前为止,采用几种测试覆盖率方法是准确跟踪的一个阶段,很容易会误解结果。 尽管语句和分支覆盖率度量标准很容易计算并一起完成,但可能会暴露出未曾暴露的严重错误,从而为程序员和管理员提供了虚假的防御情报。 基础路径覆盖为发现这些被忽略的故障提供了又健康又完整的方法,而这些故障却没有积极地增加必要的测试量。

    翻译自: https://www.javacodegeeks.com/2014/05/test-coverage-using-testing-tools-and-methods.html

    测试覆盖率统计工具

    更多相关内容
  • 那么,今天我们研究的主题是使用cenqua公司的clover框架来分析java程序的单元测试覆盖率!关于clover的更多信息呢,请大家去http://www.cenqua.com/clover去查询。我们这里,将会通过一个实例来演示如何使用junit和...
  •  在DFT设计中,测试覆盖率及其测试效率是最重要的指标。一方面,理想的设计目标当然希望测试能够遍及整个芯片的逻辑,尽管理想值100%是不容易达到的;另一方面,测试效率亦非常重要,设计工程师总希望用最少的测试...
  • 测试覆盖率是评价测试完整性的重要的度量标准之一。EMMA是一个面向Java代码的测试覆盖率收集工具。在测试过程中,使用EMMA能使收集和报告测试覆盖率的过程更加灵活、简单。在    测试覆盖率是评价测试完整性的...
  • 在测试用例设计中如何提交测试覆盖率,在测试用例设计中如何提交测试覆盖率
  • jacoco统计手动测试覆盖率工具文件

    热门讨论 2016-11-25 17:42:12
    配合教程使用http://blog.csdn.net/cxq234843654/article/details/53337935,一个自己写的统计黑盒测试覆盖率的工具
  • 测试覆盖率

    千次阅读 2021-09-13 11:07:45
    覆盖率:用来度量测试完整性的一个手段,大体可划分为逻辑覆盖和功能覆盖 覆盖率 = (至少被执行一次的 item 数)/ item 的总数 二、常用的逻辑覆盖 覆盖率中最常见的是逻辑覆盖率(Logic Coverage),也叫代码覆盖率...

    一、概念

    覆盖率:用来度量测试完整性的一个手段,大体可划分为逻辑覆盖功能覆盖

    覆盖率 = (至少被执行一次的 item 数)/ item 的总数
    

    二、常用的逻辑覆盖

    覆盖率中最常见的是逻辑覆盖率(Logic Coverage),也叫代码覆盖率 (Code Coverage)或结构化覆盖率(Structural Coverage)

    逻辑覆盖属于白盒测试的范畴。常用逻辑覆盖包括:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、路径覆盖等。

    1. 语句覆盖

    测试用例在被测程序在运行时,保证每个可执行语句至少执行一次

    语句覆盖(Statement Coverage)是逻辑覆盖中最简单的覆盖,容易理解,易于维护,比较适合自动化

    语句覆盖率 = (至少被执行一次的语句数量)/ (可执行的语句总数)
    

    举个栗子:

    if CONDITION 
    	DO_SOMETHING 
    ANOTHER_STATEMENT
    

    只要 CONDITION = TRUE 就可以实现语句覆盖。

    2. 判定覆盖

    判定覆盖(Decision Coverage)也叫分支覆盖(Branch Coverage), 测试用例在被测程序运行时,保证程序中每个判断至少取一次 TRUEFALSE 判断
    覆盖率 = (判定结果至少被评价一次的数量)/ (判定结果的总数)

    if A AND B 
    	DO_SOMETHING 
    else
    	DO_SOMETHING_ELSE
    

    判定覆盖的case:

    case1: A = TRUE, B = TRUE 
    case2: A = TRUE, B = FALSE
    

    优点:针对代码,容易理解,可实现 100% 判定覆盖,测试数据易于维护。
    缺点:判定复合条件——代码错误的根源时,可能仅执行特定组合分支被测试 ,完整性高于语句覆盖,低于条件覆盖。

    3. 条件覆盖

    条件覆盖(Condition Coverage)也叫分支覆盖(Branch Coverage) 测试用例在被测程序运行时,保证程序中每个判断中每个条件至少取一次 TRUEFALSE 条件

    覆盖率 = (条件操作数值至少被执行一次的数量)/ (条件操作数值的总数)
    

    举个栗子

    if A > 1 AND B = 0 
    	X = X / A 
    if A = 2 OR X > 1
    	X = X + 1
    

    所有可能的情况:

    条件判断A > 1B = 0A = 2X > 1
    取真A > 1B = 0A = 2X > 1
    取假A <= 1B != 0A != 2X <= 1

    条件覆盖的case:

    case1: A = 2, B = 0, X = 0 	TT
    case2: A = 0, B = 1, X = 2	FT
    

    优点:容易从设计或代码中被确认,有助于自动化,易于理解和维护,比分支覆盖强
    缺点:设计的用例可能不能满足判定覆盖的要求 4. 判定条件覆盖

    4. 判定条件覆盖

    判定条件覆盖(Dicision Condition Coverage),又叫分支条件覆盖(Branch Condition Coverage,B-C Coverage)
    测试用例在被测程序运行时,保证程序中每个判断中每个条件至少取一次 TRUEFALSE ,且么诶个判断本身也至少取一次 TRUEFALSE 判定条件

    覆盖率 = (条件操作数值 或 判定结果 至少被执行一次的数量)/ (条件操作数值的总数 + 判定结果总数) 
    

    eg:

    if A > 1 AND B = 0 
    	X = X / A 
    if A = 2 OR X > 1
    	X = X + 1
    

    所有可能的情况

    判定case
    A > 1 AND B = 01. A > 1 AND B = 0
    A > 1 AND B = 02. A > 1 AND B != 0
    A > 1 AND B = 03. A <= 1 AND B = 0
    A > 1 AND B = 04. A <= 1 AND B != 0
    A = 2 OR X > 11. A = 2 OR X > 1
    A = 2 OR X > 12. A = 2 OR X <= 1
    A = 2 OR X > 13. A != 2 OR X > 1
    A = 2 OR X > 14. A != 2 OR X <= 1

    判定覆盖的case

    case1: A = 2, B = 0, X = 2 TTTT TT
    case2: A = 2, B = 1, X = 0 TFTF FT
    case3: A = 0, B = 0, X = 2 FTFT FT 
    case4: A = 0, B = 1, X = 0 FFFF FF
    

    5. 路径覆盖

    路径覆盖(Path Coverage) 测试用例在被测程序运行时,保证覆盖程序中所有可能的路径

    路径覆盖率 = (至少一次被执行的路径数)/ (总路径数) 
    

    路径覆盖比判定条件覆盖更强,但路径覆盖不能包含判定条件覆盖。
    判定覆盖的case

    case1(TT): A = 2, B = 0, X = 2 
    case2(FT): A = 2, B = 1, X = 0 
    case3(TF): A = 3, B = 0, X = 0 
    case4(FF): A = 3, B = 1, X = 0
    

    实际代码中,一个较为复杂的程序包含的路径数也是相当庞大的,要完全达到路径覆盖是不可行的,实现自动化路径覆盖也是困难的。

    6. 小结

    1. 即使达到 100% 结构化覆盖率,还是无法保证程序的正确性
    2. 测试的目的并不是证明程序的正确性,而是要尽可能找出程序中的错误
    3. 目前,没有十全十美的测试方法,能够发现所有的错误
    4. 软件测试是有局限性的

    三、功能覆盖率

    功能覆盖(Function Coverage)属于黑盒测试的范畴,其中最常见的是需求覆盖。

     需求覆盖率 = (被验证的需求数量)/ (总的需求数量) 
    

    接口覆盖「入口覆盖」:设计可以测试系统每个接口的用例,属于黑盒测试。

    四、面向对象的覆盖率

    面向对象:多态性、继承性、封装性

    1. 继承上下文覆盖

    继承上下文覆盖(Inheritance Context Coverage):不是单个度量,是一种传统结构化覆盖的扩展,以考虑方法被继承时的额外接口。

    • 基类方法在其上下文空间中的执行完全能独立与其继承类的上下文空间
    • 继承类方法在其上下文空间中的执行也独立于其基类的上下文空间
    继承上下文判定覆盖率 = (累加每个上下文执行到的判定分支数)/ (上下文数 * 上下文内的判定分支总数)
    

    2. 基于状态的上下文覆盖

    基于状态的上下文覆盖(State-based Context Coverage):用于改进对带有状态依赖行为的类的测试
    面向对象的系统中存在许多类,将其描述为状态机。这些类的对象可以存在于众多不同状态中的一种,而且每个类的行为在每个可能的状态中其性 质是不同的 —— 类的行为依赖与状态

    2.1 基于状态的类

    eg:有边界的栈 pop() —— 空状态、部分满状态、满状态

    2.2 入口点覆盖

    黑盒测试角度,接口覆盖(Interface Coverage),或者入口点覆盖(Entry-Point Coverage)

    2.3 白盒测试

    影响覆盖率的因素 :

    • 代码中存在不对应于公共接口特性的判定。eg:错误处理代码 or 保护性代码程序
    • 无法确定那些代码被丢失。eg:pop() 方法空状态检查

    2.4 基于状态转移图

    在不了解类内部细节的基础上,基于类当前状态及类行为的变化,绘制 UML 状态迁移图
    测试用例设计目标:执行每个可能状态的每种方法

    2.5 基于状态的上下文覆盖

    对应于被测类对象的潜在状态,把一个状态上下文内的一个例行程序的执行认为是独立于另一个状态内的相同例行程序的执行。
    例行程序必须在每 个适当的上线文(状态)内被执行

     基于状态的上下文入口点覆盖率 = (累加每个状态内执行到的方法数)/ (状态数 * 类内方法总数) 
    

    3. 基于线程的上下文覆盖

    基于线程的上下文覆盖(User-Defined Context Coverage):允许将上下文覆盖方法应用于传统结构化覆盖率无法使用的地方,以维护每个线程独 立的覆盖率信息

    五、其它覆盖率

    1. 函数覆盖

    函数覆盖是针对系统或一个子系统的。 在测试中有哪些函数被测试,其被测试到的频率有多大,这些函数在系统所有函数中占的比例有多大

    函数覆盖率 = (至少被执行一次的函数数量)/ (系统中函数的总数)
    

    函数覆盖,基于代码,属于白盒测试。易于自动化,也易于理解

    2. 指令块覆盖

    指令块覆盖(Instruction Blocks Coverage)是语句覆盖的一个变体
    指令块表示函数内部的一系列语句,在这一系列语句中不存在控制语句

    指令块覆盖率 = (至少被执行一次的指令块数量)/ (系统中指令块的总数)
    

    3. 判定路径覆盖

    判定路径覆盖(Decision-to-Decision Paths Coverage, DDP Coverage)是判定覆盖的一个变体
    判定指一个序列语句,其起始位置是函数入口或一个判定(eg:if,while,switch等)的开始,结束位置是下一个判定的开始。

    DDP覆盖率 = (至少被执行一次的判定路径数量)/ (系统中判定路径的总数)
    

    4. 更改条件判定覆盖

    更改条件覆盖(Modified Condition/Decision Coverage, MC/MD Coverage)是判定条件覆盖的一个变体,主要用于多条件测试的情况。

    • 被测试程序模块的每个入口点和出口点都必须至少被执行一次,且每个程序判断的结果至少被覆盖一次
    • 通过逻辑分解操作,程序的判定被分解为基本的布尔条件表达式,每个条件独立地作用于判定的结果,覆盖所有条件的可能结果

    eg:

    X and (Y or Z)
    

    所有可能的情况

    XYZX and (Y or Z)
    Test1TTTT
    Test2TTFT
    Test3TFTT
    Test4TFFF
    Test5FTTF
    Test6FTFF
    Test7FFTF
    Test8FFFF

    可以组合的case:

    Test2,Test6,Test4,Test3
    

    5. 分支条件组合覆盖

    分支条件组合覆盖(Branch Condition Combination Coverage),比判定条件覆盖更强的覆盖
    测试用例在被测程序运行时,保证每个分支中各操作数值的组织都遍历一次

    分支条件组合覆盖率 = (至少被执行一次的分支条件组合)/ (系统中分支条件组合的总数)
    
    XYX or Y判定条件覆盖分支条件组合覆盖
    Test1TTT
    Test2TFT
    Test3FTT
    Test4FFF

    6. 过程到过程路径覆盖

    过程到过程路径覆盖(Procedure-to-Procedure Path Coverage, PPP Coverage),针对系统或子系统级,用于集成测试 一个PPP对应的是两个函数之前的一个调用关系

    PPP覆盖率 = (至少被执行一次的PPP数量)/ (系统中PPP的总数)
    

    7. Z路径覆盖

    Z路径覆盖是路径覆盖的一个变体(白盒测试),用于解决程序中存在多个判断和多个循环的问题
    程序中存在多个判断和多个循环时,简化循环机制(限制循环次数),以极大程度减少路径的数量,使得覆盖有限的路径成为可能

    8. ESTCA 覆盖

    错误敏感测试用例分析规则(Error Sensitive Test Cases Analysis,ESTCA),程序中的谓词最容易出错的部分【边界测试】

    • 对于 A rel B(rel 可以使 <, = 和 >)型的分支谓词,选择 A 与 B,使得 A < B, A = B, A > B的情况分别出现一次 「检查 rel 的错误」
    • 对于 A rel C(rel 可以使 <, = 和 >,A是变量,C是常量)型的分支谓词:「检查 “差一”之类的错误」
      • 当 rel 为 < 时,取值 A = C - M(M 是距 C 最小的容许正数,若 A 和 C 均为整型,M = 1);
        • 当 rel 为 > 时,取值 A = C + M
    • 对外部输入变量赋值,使其在每一测试用例中均有不同的值与符号,并于同一组测试用例中其他变量的值与符号不一致「检查程序语句中 的错误」

    六、使用覆盖率基本原则

    • 覆盖率不是目的,只是一种手段
    • 不能针对所有覆盖率指标进行测试,也不能只考虑一种覆盖率指标
    • 如果需要付出极大的成员,不要追求绝对 100% 的覆盖率。涉及到生命安全的系统除外
    • 使用最少测试用例来达到覆盖
    展开全文
  • 软件测试用例的设计-提高测试覆盖率[2]测试用例设计(2)、完整业务流程的测试我们都知道测试用例的设计是从点、线、面三个层次去考虑的。完整的一个功能项是线,其中的某个按钮是点,多个相关功能结合成完整业务流...
  • 单元测试覆盖率
  • jacoco单元测试覆盖率+maven DEMO
  • 谷歌研究人员进行了一项分析,这项分析揭示了该公司的工程师如何管理10亿行代码的代码测试覆盖率。 谷歌研究人员进行了一项分析,这项分析揭示了该公司的工程师如何管理10亿行代码的代码测试覆盖率。 该图片来自于...
  • 如何计算增量测试覆盖率

    千次阅读 2021-07-27 05:18:08
    为了保证代码质量,一般会要求提交的源码要有测试用例覆盖,并对测试覆盖率有一定的要求,在实践中不仅会考核存量代码覆盖率(总体覆盖率)还会考核增量代码的覆盖率。或者说增量覆盖率更有实际意义,测试用例要随源码...

    为了保证代码质量,一般会要求提交的源码要有测试用例覆盖,并对测试覆盖率有一定的要求,在实践中不仅会考核存量代码覆盖率(总体覆盖率)还会考核增量代码的覆盖率。

    或者说增量覆盖率更有实际意义,测试用例要随源码一并提交,实时保证源码的质量,而不是代码先行,测试用例后补,这有些应付的意思。

    对于存量代码覆盖率主流的测试工具(框架)都是默认支持的,配置reporter相关参数,执行完测试用例就会生成测试报告。

    对于增量测试覆盖率主流的测试工具一般没有支持,我想计算增量代码貌似不是测试工具该干的事,所以主流测试工具并没有提供这一功能。

    那么如果计算增量覆盖率呢?

    计算增量测试覆盖率,总共需要3步:

    ·计算出增量代码的所有行号

    ·计算出测试未覆盖的代码的所有行号

    ·对比计算增量代码被测试覆盖的比例,得出增量覆盖率

    是不是很简单,有没有一种 “道理我都懂,就是过不好这一生的赶脚”

    一、计算增量代码的所有行号

    代码管理一般都会用到 GIT 这个工具,GIT提供了非常强大的管理增量代码的能力,因此,可以利用GIT这一特性,通过git diff(参考文献1) 这个命令获取增量代码。

    git diff命令可以使用如下格式,用来对比不同commit(或分支)间的增量代码

    git diff []

    其中可以是分支名,对比分支间的差异,则是 git diff [] targetBranchName sourceBranchName。可以简写为 git diff targetBranchName 表示对比当前分支与目标分支间的代码增量差异。

    例如 git diff master 生成当前分支与master分支的增量信息,当有多个文件变化时,会有多个这样的信息块。

    4a8f73840fc6fb7d34553d3df94f0f84.png

    ·第1部分是发生变化的文件名。---表示文件发生了删除行 +++表示文件发生了新增的行,当---和+++后面是文件路径(相对代码根目录的相对路径)。

    ·如果某个文件是新增文件,则---后面是/dev/nul

    ·如果某个文件被删除了,则+++后面是/dev/nul

    ·如果文件发生修改,则---和+++后面都有文件名

    ·先介绍第3部分,因为第2部分的解读需要用第3部分辅助。第3部分是详细的含有上下文的增量信息(增量不是指增加,删除也算增量)

    - 表示这一行被删除

    + 表示这一行是新增

    如果某一行发生修改,则由一条-和一条+表示

    ·第2部分是变化的行号信息,以 @@开头和结尾,中间是删除的行号信息和新增的行号信息,以上图为例

    -1,11表示,文件出现删除,从第1行开始包含上下文信息一共有11行,在第3部分中分别是第6, 8, 9, 10, 12, 13, 14, 15, 16, 17, 25 行,共11行

    +1,18表示,文件出现新增,从第1行是包含上线文信息一共18行,在第3部分中分别是第7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25 行,共18行

    其中,第8, 9, 10, 12, 13, 14, 15, 16, 25 行是上下文信息,真正删除的行是第6, 17 行,共2行; 新增的行是第7, 11, 18, 19, 20, 21, 22, 23, 24 行,共9行。

    不难发现,git diff 默认给出的行号信息,不仅包含真正删除和增加的行,还包含一定的上下文信息(为的是给人看时,能看出到底改了哪些行信息,尤其在一个文件有很多相似或重复的语句的情况下)。并且在计算删除的行的行数时(-1,11中的11)要过滤掉增加的行后再计算,反之亦然(+1,18中的18)。

    通过上面的命令确实能计算出增量代码的实际行号(有开始行号,有行数,有差异信息),但对于第3部分的差异信息的解析存在一定的难度,不仅要过滤掉对向信息,还要过滤掉上下文信息。

    经查阅文档,发现git diff有一个options是--unified=,简写-U。使用此参数来决定diff结果中上下文信息显示n行,而不是默认的3行。

    使用 git diff --unified=0 master 或 git diff -U0 master看运行结果:

    2d09766bfd8b953d95c3dab98647e9c8.png

    数据结构与不带options的结果基本一致,只不过第2部分和第3部分作为一个整体可能会出现1次或多次,还有一点变化是第2部分行号信息的表达出现了三种格式。

    -(+)后面只有一个数字,数字是,表示删除(增加)了1行,行号是。此例中-1, +1, +5, -10分别表示第1行删除1行,第1行增加1行,第5行增加1行,第10行删除一行。

    -(+)后面有两个数字,第一个数字是,第二个数字是0, 表示删除(增加)了0行,即m行没有变化,此例中-4,0表示第4行没有变化

    -(+)后面有两个数字,第一个数字是,第二个数字是,不是0,表示删除(增加了)n行,起始行号是m。此例中+11,7表示从第11行开始,共增加了7行,行号一次递增,即 11, 12, 13, 14, 15, 16, 17 这几行。

    因此,计算增量代码的信息只使用第1部分和第2部分就可以完成,由第1部分计算出增量代码的路径,由第2部分的+后面的数字计算得到增量代码的行号(-后面是删除的行信息,不是增量代码)。本例中a.js文件的增量行号是[1, 5, 11, 12, 13, 14, 15, 16, 17]。

    由于git diff生成的是固定格式纯文本,解析增量信息时可以按行读取字符串后做正则解析即可。对于linux系统,可以通过管道符|将diff文本导给grep命令(参考文献2),使用正则匹配出需要的信息,命令如下:

    git diff -U0 master | grep -Po '^\+\+\+ ./\K.*|^@@ -[0-9]+(,[0-9]+)? \+\K[0-9]+(,[0-9]+)?(?= @@)'

    生成结果如下图,此时,再按行遍历,生成以文件路径为Key,增量行号组成的Array为值的Hash表,用于后续逻辑的索引。

    99e3c453e1f0fb51b364c0a0380d645f.png

    二、计算测试未覆盖的代码的所有行号

    计算未被测试覆盖的行号,需要先在当前分支运行测试脚本生成对应的测试报告。

    测试报告有很多种格式,其中http://lcov.info(参考文献3)是一种描述源码覆盖率的纯文本格式的文件,因此它非常便于计算,可利用此文件计算得到未被覆盖的行号。

    http://lcov.info文件内容如下图:

    222e71e34bffe281ec6aebcc9daf18e9.png

    数据包含以下字段,因工具不同,字段出现的顺序会略有变化

    ·TN: 用例名称,[因工具不同,有的无法生成此字段]

    ·SF: 源文件路径,[因工具不同,有的是绝对路径,有的是相对路径]

    ·FN:, 函数起始行号,函数名称,[因工具不同,有的函数名无法生成]

    ·FNDA:, 函数被执行次数,函数名称,[因工具不同,有的函数名无法生成]

    ·FNF: 识别统计到的函数数量

    ·FNH: 被测试覆盖的函数数量, FNH / FHF即函数覆盖率

    ·BRDA:,,, 条件分支所在行号,块号,分支号,被执行的次数

    ·BRF: 识别统计到的条件分支数量

    ·BRH: 被测试覆盖的条件分支数量 BRH / BRF 即分支覆盖率

    ·DA:,[,] 行号,执行次数, 检验和,[因工具不同,有的有校验和,有的没有]

    ·LH: 被测试覆盖的行数量

    ·LF: 可被执行的行数量, LH / LF 即行覆盖率

    ·end_of_record 统计信息块结束符,一个文件一个块

    由此可见,计算未覆盖代码的行号,只需要提取覆盖率数据中SF和DA字段的值即可

    ·SF是源码文件路径

    ·DA字段有两个数字,第1个是行号,第2个是执行次数,半角逗号分隔,执行次数的值是0的即是未被覆盖的行

    同解析diff增量数据一样,解析覆盖率数据时也可以按行读取字符串后做正则解析即可。对于linux系统,可以通过管道符|连接cat和grep命令(参考文献2),使用正则匹配出需要的信息,命令如下

    cat coverage/lcov.info | grep -Po '^SF:\K.*|^DA:\K[0-9]+(?=,0)'

    生成的结果如下图,得到未被覆盖的行号,再按行遍历,生成以文件路径为Key,增量行号组成的Set为值的Hash表,用于后续逻辑的索引:

    eff142285d725ad814861f7119acca63.png

    三、最后一哆嗦

    得到上面两份数据,就可以计算得出每个文件的增量覆盖率和总体增量覆盖率了。

    但还需要考虑一种情况:由于一些原因(可是配置文件的问题)导致一些源码文件未被统计到测试覆盖率报告中,那么 + 有意为之,则增量文件不用计入增量覆盖率中,此文件的增量覆盖率是 100% + 无意为之,则增加文件需要计入增量覆盖率中,此文件的增量覆盖率是 0

    伪代码如下:

    const incData = {       // 增量代码行号Hash表

    'path/a.js': [1, 2, 3],

    'path/b.js': [2, 3, 4],

    ...

    }

    const notCovData = {    // 未覆盖代码行号的Hash表

    'path/b.js': 'Set(3) {1, 2, 3}',

    'path/c.js': 'Set(3) {1, 2, 3}',

    ...

    }

    let notCovLintCount = 0

    let lineCount = 0

    forEach(incData, (data, file) => {

    const notCovSet = notCovData.get(file)

    const notCovLines = []

    if (notCovSet) {     // 如果增量代码文件中有未覆盖的行数

    forEach(data, lineNum => {

    if (notCovSet.has(lineNum)) {

    notCovLines.push(lineNum)

    }

    })

    } else {    // 增量代码的文件没有被测试覆盖到

    if (!ignore) {  // 如果是无意为之,所有行号均被统计

    notCovLines = notCovLine.concat(data)

    }

    }

    console.log(file, '增量覆盖率:', (1 - notCovLines.length / data.length).toFixed(2) + '%')

    lineCount += data.length

    notCovLineCount += notCovLines.length

    })

    console.log('总体增量覆盖率:', (1 - notCovLintCount / lineCount).toFixed(2) + '%')

    至此,分支间的增量代码的测试覆盖率计算完成。

    详细的实现逻辑可参考 nodejs版本

    实践与应用

    ·一般会用于CI检测中,在test step后添加增量覆盖率检测脚本,增量覆盖率未达标的代码禁止并入代码库

    ·也可用于git hook中做检测(这会增加提交代码的等待时长,不太建议),增量覆盖率未达标的代码禁止提交。

    本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理

    展开全文
  • 基础技术软件测试技术基础学习之测试覆盖率软件测试在测试方法中粗略的介绍了几种测试方法。其中,白盒测试的动态分析方法中提到逻辑覆盖率测试有:语句覆盖、分支覆盖/判定覆盖、条件覆盖、条件—判定覆盖和路径...
  • 测试覆盖率之一——测试覆盖率分类(转) 关于覆盖率,网络上最常见的两个词应该是“测试覆盖率”(Test Coverage)和”代码覆盖率“(Code Coverage)。今天就来探探这两个东西。 在测试里面,一般会将测试覆盖率...

    转一篇,别人写的关于覆盖率的文章,没事常看看琢磨琢磨

    测试覆盖率之一——测试覆盖率分类(转)

    关于覆盖率,网络上最常见的两个词应该是“测试覆盖率”(Test Coverage)和”代码覆盖率“(Code Coverage)。今天就来探探这两个东西。

    在测试里面,一般会将测试覆盖率分为两个部分,即”需求覆盖率“和”代码覆盖率“。可以看到,代码覆盖率其实是测试覆盖率的一部分而已。其中,最常讨论和关心的是”代码覆盖率“,代码覆盖率又分为程序语句和代码行覆盖,分支覆盖和条件覆盖。对于这些概念,我们逐个解释。

    需求覆盖率:如果需求已经定义好,这个时侯我们就需要考虑需求覆盖率了。这个时候需要注意的是,这里的需求不仅仅是指功能需求,还要包括性能需求。衡量需求覆盖率的最直观的方式是我们有多少功能点,我们有多少性能点要求,这些将作为分母;我们写了多少测试用例,覆盖了多少模块,多少功能点,我们的性能测试用例考虑了待测程序多少性能点,这些作为分子。

    代码覆盖率:为了更加全面的覆盖,我们可能还需要测试程序的流程,我们可能会考虑到一个函数的数据的输入与输出,甚至是每一行代码的执行情况,代码的每一条逻辑和分支,这个时候我们的测试执行情况就以代码覆盖率来衡量,这也是我们常在单元测试中念叨的覆盖率覆盖率的问题。

    语句覆盖率:换个名字叫做代码行覆盖率,这就是监视每行代码是否在用例(当然之所有的)中是否被执行到,准确点说是我们的用例里面大概执行了百分之多少的语句/代码行数。需要注意的是,即使所有的语句都被执行到,也不一定执行到了所有的路径。比如有五条语句:ABCDE,如果我们执行了用例覆盖了ABCDE,另外一个用例这个时候我们覆盖了所有语句,但是可能还存在一个路径(如ABC)没有执行,例如:

      public verifyToken(string yourname, string yourtitle)

      {

      A   output(”Hello, my dear friends“);

      B   if(yourname == "uniquestudiowcd")

      {

      C      output("Hello, Aaron");

      }

      D   if(yourtitle == "tester")

      {

      E     output("Hello, my dear tester");

      }

      }  

    这个时候我们输入参数”uniquestudiowcd“和”tester“覆盖到了所有的语句,但是我们漏掉了一个路径:即输入参数”uniquestudiowcd“和”coder“。

    分支覆盖率:我们也给它换个名字即”路径覆盖率“,尽管并不完全对。在上面的例子中,如果我们仅考虑了第一个用例(即输入参数”uniquestudiowcd“和”tester“),我们的语句覆盖率为100%,带式路径覆盖率可就低了,因为它存在ABD,ABCD,ABCDE,ABDE等等很多路径。

    条件覆盖率:这也就是为什么不能说”分支覆盖“不同于”路径覆盖“的原因所在。如果我们在一个IF语句中加入了判断组合,那就要考虑更多的问题了,因为主要出现在条件语句中,所以我们称之为”条件覆盖“。我们更改上述示例代码:

      public verifyToken(string yourname, string yourtitle,string gendar)

      {

      A   output(”Hello, my dear friends“);

      B   if(yourname == "uniquestudiowcd" && gendar == ”man“)

      {

      C      output("Hello, Aaron");

      }

      D   if(yourtitle == "tester")

      {

      E     output("Hello, my dear tester");

      }

      }

    很明显即使我们输入参数”uniquestudiowcd“”tester“,”woman“和”uniquestudiowcd“”tester“”man“,这两个用例的路径走的分支是一样的,但是条件覆盖不一样,实际上两者的”路径“也是不一样的。

    上面主要介绍的测试覆盖率的一些基本知识,在关于测试覆盖率的第二篇文章中,我将介绍归纳一下测试覆盖率的用处,或者说测试覆盖率的意义。

    测试覆盖率之二——测试覆盖率有什么用?

    在上一篇文章里面我们介绍了测试覆盖率的分类,举例揭示了需求覆盖率,语句覆盖率,分支覆盖率很条件覆盖率这些问题,在这篇文章里面,则主要介绍为什么要千方百计来找“测试覆盖率”。(关于上一篇文章,参见测试覆盖率之一——测试覆盖率分类)

    关于测试覆盖率讲的最多的地方应该实在测试停止标准里面。在测试停止标准里面经常出现这样的语句“测试覆盖率达到或超过95%”之类的概念。其实,如果你看了我前一篇文章中提到的测试覆盖率分类的话,就知道这是一个不准确的描述。关于更准确的描述,我认为应该是“性能测试需求覆盖率达到100%,功能需求测试覆盖率达到100%,语句覆盖率达到85%”这样的句子。“测试覆盖率”本来就包含了很多子部分,所以提测试覆盖率是不明智的一种做法。而我所说的语句覆盖率85%相对于性能测试需求覆盖率这个数据来讲似乎更难获得准确数值,不过现在已经有了很多工具用于测试“语句覆盖率”,而不用我们自己去计算已执行的测试用例覆盖到了数万或者更多代码中百分之多少,也有一些工具可以帮助我们得到代码覆盖率中“分支覆盖率”等其它数据。关于覆盖率检测工具,我将在本系列的后续文章中给予介绍。

    测试覆盖率是测试结束标准中的一部分,这显然不是我们今天讨论的重点——测试覆盖率有什么用?直观上讲,我们可以这样理解:

    -> 性能测试覆盖率如果没达到100%,表示我们有些性能测试点没有覆盖到,这在一个对于性能有所要求系统显然是不可取的,这表示我们应该增加用例来覆盖到所需要的性能测试点。

    -> 重要模块的语句覆盖率和条件覆盖率很低,表示我们测试用例过少,我们应当增加用例;如果我们已经写了很多用例(相对于代码行数来讲),但是这两项数据还是很低,那我们得检查一下我们的用例了,是否有重复的用例?是否应该重新设计用例结构?

    对于测试覆盖率,我们有这样一个简单的算式,如果A模块的条件覆盖率为80%,B模块也为80%,C模块也为80%,那么我们的总覆盖率则是 51.2%,而不是我们想当然的80%。至于为什么这样,我就不解释了。因此在我们审查覆盖率报告时候,我们关注的是覆盖率低的模块,我们要检查为什么低,我们要思考怎么提高,对于覆盖率低的地方,是不是有一个等价类被我们忽略了?

    测试覆盖率的意义在瀑布式的开发模式里面可能显得没那么重要,但是如果在螺旋式开发模式中,如果我们没有控制好我们上一个迭代中的测试覆盖率,当一个版本一个版本累加下来后,你就很难确定我们哪些模块在开发过程中没有给予足够的测试;在近些年兴起的持续集成浪潮中,由于要求短迭代(有人建议3-5天一个迭代),如果没有很好的测试覆盖率保证,很难在这么快的代码变迁中保证测试的质量。在持续集成工作中,代码提交频繁,我们可以通过测试覆盖率来了快速对应新写的,没有对应测试的代码。

    总之,测试覆盖率可以提供给我们两个方面的信息:测试覆盖率低的模块 和重要模块的测试覆盖率。这些数据可以帮助我们快速定位需要更多测试的模块,可以帮助我们了解重要模块的测试情况,以此来衡量我们测试用例的质量乃至测试的质量。

    测试覆盖率之三——测试覆盖率100%相关的话题

    上一篇文章中,介绍了测试覆盖率的意义之类的东西。测试覆盖率可以帮助我们检查测试质量,检查测试用例的有效率。如果有兴趣的话,可以阅读测试覆盖率之二——测试覆盖率有什么用?

    关于测试覆盖率,我个人的感觉是说的多,用的少。最近在网络上看到一篇文章,讨论一个问题“测试需要100%的覆盖率吗?”被转载了很多次,有兴趣的同行可以找来看看。的确,一想到测试覆盖率,立马就有完美主义者跳出来说100%。100%的测试覆盖率有什么好处呢?

    1、100%的覆盖率表示我们的测试覆盖到了所有语句,分支,条件

    2、100%的覆盖率表示我们测试考虑的很完全,我们可以回去睡大觉了~~

    测试仿佛在这里变得不那么可怖了,但是我们至少遗漏了两个重要的地方:怎么达到100%的测试覆盖率或者说是否能够达到100%的测试覆盖率,另外一个就是100%的测试覆盖率到底能告诉我们什么信息。

    首先来讲,我们是否可以达到100%的测试覆盖率?如果我们简单的将测试覆盖率理解为需求覆盖率,代码覆盖率,那么我想这是可以达到的,只要拥有足够的时间,我们的测试覆盖到每一个需求点,我们的测试覆盖到每一条语句,每一个条件,每一个分支,看起来的确没有问题。但是我们还要考虑另外一个问题,是否由我们未曾列入到需求分析中的需求呢,这种情况是存在的,如果我们计算需求覆盖率是根据Feature Spec来的(实际上如果我们需要计算的话,一般就是这样计算得来的),那么当我们有需求没有被写入Feature Spec并且我们也没有在测试中考虑相关的测试,那么我们实际的“需求覆盖率”就不是100%了。在实际开发过程中,是不可能在Feature Spec中将需求全部列出来的,所以我们得到的100%的需求覆盖率是存在水分的。

    另外,对于一个应用程序(除了一些极其简单的程序)来讲,要覆盖到所有的语句。条件,分支是极其困难的,甚至可以说是不可能的。笔者在经历的一个项目中花了一整天写一个模块的单元测试,当我忙完一天并运行了所有的用例之后,我发现我的代码覆盖率仅仅增加了2%,而且是从35%到37%,不要说100%,连80%我当时都觉得是奢望。

    对于第二个问题,100%的测试覆盖率能代表什么?我在上面讲到,100%的测试覆盖率表示覆盖到了所有的语句,分支和条件,但是这又说明什么呢?这是否说明了我们做到了完全测试一个软件呢?很抱歉,答案是否定的。给出下面这一段代码:

      private int add(int a,int b)

     {

      return a+b;

      }

    够简单的一段代码了吧,我们可以很轻松的达到100%的覆盖率,比如我们使用用例 add(3,4)就可以覆盖所有的语句,分支,条件(当然这里面是不存在分支和条件的,所以只需要覆盖语句就可以达到代码覆盖率100%了),但是聪明的你一定会发现我们的测试远远不够:如果输入的是add(2147483647,2),这个应用程序是会出现问题的,如果我们仅仅满足于100%的代码覆盖率,是不能保证我们的软件的质量的。

    关于代码覆盖率,由一个很有趣的现象:高覆盖率有时候比低覆盖率还“没用”。注意“没用”是打了引号的,我的意思是高覆盖率不能说明我们做了完全的测试,低覆盖率却可以说明我们测试远远不够,从这一点来讲,低覆盖率似乎更有意义。当然我不是在讲我们不去追求高覆盖率,我的意思是与其把A模块覆盖率从85% 提高到90%,还不如把与其类似的B模块的覆盖率从30%提高到50%更有意义。绕一大圈说回来,在任何时候高覆盖率都比低覆盖率好,但是作为一个软件,我们要顾及软件整体的测试质量,我们还要估计成本,时间等等很多问题。

    上面说了不少,最后总结一下我的观点:

    1、测试覆盖率100%是一个理想的情况,是很难达到的;

    2、测试覆盖率100%不能说明我们做了完全的测试;

    3、较低的测试覆盖率能说明我们的测试还不够,反之是不成立的,参考第二条;

    4、同一模块高覆盖率相对于低覆盖率能说明我们做了更多的测试;

    5、测试覆盖率达到多少要考虑到软件整体的覆盖率情况,以及项目成本,包括人力,时间等等。

    关于测试覆盖率100%的问题的讨论还会继续下去,如果必要的话,笔者将在本系列文章的后期继续总结,根据计划,在下一篇文章中我将介绍自己使用过的相关工具,以及我未使用但是可以从网上找到相关资料的工具,帮助大家总结一下,以备查看。

    测试覆盖率之四——测试覆盖率工具汇总

    在上一篇文章我提到的是关于测试覆盖率100%有关的话题,算是“跟风”谈论了最近关于测试覆盖率最流行的100%问题吧。关于上篇文章的详细内容,参见测试覆盖率之三——测试覆盖率100%相关的话题。

    在上一篇文章中,和大家约定下一篇介绍关于测试覆盖率工具相关的东西,可是这两天一直出差,无暇顾及,希望关注我的朋友不要介意~ _ ~ 废话不说了,直接切入正题。由于本人对于测试覆盖率工具的使用仅限于.NET相关的,所以对于其他语言相关的测试覆盖率工具没有经验,因此也少了发言权,这片文章就只能算作对于各种工具的一种简单的介绍罢了,主要内容都来自于google百度,笔者做简单的整理之后发表出来,希望对大家有所帮助。

    ● Javascrīpt 测试覆盖率工具

    JSCoverage是一个用于度量Javascrīpt程序的代码覆盖率的工具。能显示哪些行被执行过了,哪些行尚未执行,这些信息对于测试覆盖率的分析和测试质量的衡量都很有用。JSCoverage通过度量Web页面使用的Javascrīpt代码,收集被Web浏览器执行的Javascrīpt代码信息来达到测试覆盖率统计的功能。JSCoverage支持IE6、IE7、Firefox2、Firefox3、Opera、Safari等流行的浏览器、支持Windows平台和Linux平台。JSCoverage是开源软件,官方网站:http://siliconforks.com/jscoverage/

    ● Java测试覆盖率工具

    EMMA,开源工具,支持Java 1.2或更高版本的JVM,不依赖于任何第三方类库。EMMA支持maven,ant,报表格式简单。官方网站 http://emma.sourceforge.net/

    Coverlipse,一个Eclipse的Code coverage插件。

    Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通过标记无用的、执行不到的代码来优化代码,还可以提供 API 实际操作的内部信息。

    Clover

    NoUnit

    ● .NET测试覆盖率工具

    Clover.NET http://www.cenqua.com/clover.net/

    Visual Studio的代码覆盖率统计工具

    NCover官方网站:http://ncover.org/

    PartCover

    ● C/C++测试覆盖率工具

    Bullseye Coverage 是Bullseye 公司提供的一款C/C++代码覆盖率测试工具除了支持各种Unix 下的编译器之外,在Windows 下支持VC、Borland C++、Gnu C++、Inter C++。提供的代码覆盖率是分支覆盖率而不是一般代码覆盖率,我个人认为分支覆盖率比代码覆盖率更好。Bullseye Coverage 可以从http://www.bullseye.com/上获取

    ● Ruby代码覆盖率工具

    rcov是一个用于诊断Ruby代码覆盖率的工具,它最主要的用途就是用于确定单元测试是否覆盖到了所有代码,rcov使用一个经过优化的C运行时,因此性能相当惊人,同时它还提供多种格式的输出

    ● 其他

    AutomatedQA公司的AQTime。AQtime运行在windows平台下,它支持.net应用和非.net应用,但不支持JAVA应用。 AQtime除了包含代码覆盖率监测以外,还包括了性能监视等功能。AQTime能够收集服务端C#和VB.net代码的覆盖率,但是不能收集客户端scrīpt脚本的覆盖率。

    DevPartner Studio的Web scrīpt Coverage工具。该工具主要是收集Web客户端scrīpt脚本覆盖率的。 它使用起来也很简单,只要启动此工具,然后在浏览器中输入网址,收集工作就开始了。在形成的测试报告中清楚地反映了每个函数的实行情况,给出了覆盖率数据,同时对于执行到的脚本和未执行到的脚本用不同的颜色表示,十分明了。该工具唯一的缺陷就是不能收集服务端脚本的覆盖率,同时存在中文字符无法正确识别的问题。

    关于测试覆盖率工具,有很多内容,上面提到的只是我平时收集到的一些知识,很大一部分并没有实际验证,因此对于可能出现的纰漏和错误,还望读者原谅。关于测试覆盖率工具,笔者很有兴趣继续学习使用,并会在后期的学习中总结并发表在该系列文章中。在本系列的下一篇文章(测试覆盖率之五——提高测试覆盖率)中,笔者将继续探讨有关提高测试覆盖率的问题。

    测试覆盖率之五——提高测试覆盖率

    在上一篇文章中,简单的而介绍了一些测试覆盖率相关的工具,由于大部分工具笔者并没有使用的经验,因此只是简单地从网络搜索了一下相关资料并将其整理出来,关于上篇文章的详细内容,参见:测试覆盖率之四——测试覆盖率工具汇总。

    这篇文章中,主要讨论的是如何提高测试覆盖率的相关问题。其实,提高测试覆盖率最基本,甚至是唯一的办法就是增加测试用例,但是怎样通过增加测试用例而帮助我们“迅速”提高我们的测试覆盖率呢?

    代码走查 对于代码的不熟悉造成了我们的代码覆盖率迟迟上不去,我们需要了解到代码里面究竟有多少条件分支,多少怎样的循环,分支和循环向来是导致我们代码覆盖率比较低的原因,另外,是不是存在一些过时的代码,没有运行过代码监测工具的代码中很可能存在一些没有被引用的死代码,而代码走查,尤其是对于覆盖率低的模块的代码走查将有助于你增加相关的用例而提高代码覆盖率。

    工具 这里倒不是说有些工具可以帮助你直接提高代码覆盖率,这样的工具至少我还没有就见过。这里提到的工具主要包括两种,一是代码分析工具另外一种就是上篇文章中提到的代码覆盖率工具。代码分析工具可以帮助我们分析代码中的冗余部分,这样可以帮助我们干掉那些总是不可能覆盖到的死函数,有的编译器已经提供了类似的功能。使用代码覆盖率工具则可以帮助我们快速监测代码覆盖率低的地方,这样我们可以快速定位我们测试的薄弱环节,通过代码走查或其他方式可以快速增加用例。一般来讲,某一模块的代码覆盖率从30%提高到50%所需的时间遥远小于从60%提高到80%的时间。

    规则 这里所指的规则其实是指一些基本测试方法,如等价类划分,边界值分析。我们有时候需要通过这些手段来逐一检查我们那些方面的测试用例没有考虑到,从而帮助我们增加相关的测试用例。

    经验 这个看起来有点像废话,因为一般都知道测试经验丰富有助于测试用例的设计,写出别人没有想到的测试用例。我在这里把这句话提出来的主要意图是告诉大家注意平时的积累,某些时候的灵光一现可能成为日后的一个重要用例。以前的失败教训也可以帮助我们从中学到经验,毕竟“经验是人为其错误而找的代名词”。

    注意 有一点我想有必要再次提醒大家:单方面的提高测试覆盖率并不能有效的帮助测试质量的提升,尤其是在代码质量低劣的情况下。就拿一个经典的三角形测试用例来讲,开发人员的代码可能仅仅判断了“两边之和大于第三边”然后就返回“这是三角形”。在测试用例中,我们可能考虑了很多的问题,考虑了输入数据的类型,合法性等等的问题,但是这并无助于增加测试覆盖率。运行这些测试结果是万里江山一片红,记住在你的测试用例没有运行通过的时候考虑测试覆盖率是没有意义的,我目前想到了两条理由:一是这些测试用例可能在代码的中间部分就已经出了问题,所以用例本该覆盖到语句没有覆盖到,这降低了代码覆盖率数据;第二个理由测试用例没有通过可能就如刚才提到的三角形问题中一样,开发人员压根就没有那么多语句给你去覆盖,这时候的代码覆盖率数据显然是没有多大作用的。这也印证了前面文章中提到的“高代码覆盖率比低代码覆盖率更加‘没用’”。

    写到这里,我的观点已经表达完毕了。这一系列文章也差不多可以做个了结了。当然我们还留了一些重要的"尾巴"——测试覆盖率工具。在昨天的文章中提到,笔者将实际学习使用一些工具,并将整理相关的资料,当然我是不会爽约的,不过这些内容恐怕要等一段时间才能开始了。

    展开全文
  • 完全破解,按照我的步骤做,完全可以用,不用多余操作 http://blog.csdn.net/rogerjava/article/details/25117151
  • 覆盖率是用来度量测试完整性的一个手段,现在有越来越多的测试工具能够支持覆盖率测试,但是它们本身并不包含测试技术,只是测试技术有效性的一个度量。白盒测试中经常用到的覆盖率是逻辑覆盖率覆盖率对于软件测试...
  • 代码覆盖率检测正是帮助开发、测试同学提前发现问题,保证代码质量的好帮手。对于开发者而言,代码覆盖率可以反馈两方面信息:自测的充分程度。 代码设计的冗余程度。 尽管代码覆盖率对代码质量有着上述好处,但在...
  • 单元测试覆盖率

    2021-12-15 17:00:06
    测试覆盖率 测试覆盖率是对测试完全程度的评测。测试覆盖率是由测试需求和测试用例的覆盖或已执行代码的覆盖的表示结果。一方面可以衡量测试工作本身的有效性,提升测试效率,一方面可以提升代码质量,减少bug,提升...
  • 在测试用例设计中考虑多方面因素提高测试覆盖率,达到项目要求质量
  • DOM 测试 官方文档:DOM Manipulation 直接操作 DOM 的代码通常被认为难以测试,因为操作 DOM 就要使用浏览器环境的 DOM Api,而 Jest 是运行在 Node 环境中的。 例如: // 操作 DOM 的函数 function renderHtml()...
  • 代码覆盖率和测试覆盖率 测试覆盖率和代码覆盖率是衡量代码有效性的最流行方法。 尽管这些术语有时会互换使用,因为它们的基本原理相同。 但是它们并不像您想象的那样相似。 很多时候,我注意到测试团队和开发团队...
  • 测试覆盖率是什么? 测试覆盖率(test coverage)是2018年公布的计算机科学技术名词,它是测试质量的度量标准之一,告诉我们测试了多少代码。它定义了系统的某些实体,目的是用测试覆盖它们。这是一种用来指示我们...
  • golang 单元测试覆盖率

    千次阅读 2021-01-02 22:26:41
    目录单元测试覆盖率示例代码执行单元测试查看具体的测试覆盖情况参考 单元测试是代码质量的重要保证,测试覆盖率是关键的衡量指标。 在golang 中,通过go test 进行单元测试,并可以分析覆盖率。 单元测试覆盖率 ...
  • 软件测试基础 - 测试覆盖率

    千次阅读 2020-09-26 16:14:21
    覆盖率是用来度量测试完整性的一个手段,是测试技术有效性的一个度量。分为:白盒覆盖、灰盒覆盖和黑盒覆盖;测试用例设计不能一味追求覆盖率,因为测试成本随覆盖率的增加而增加。 覆盖率=(至少被执行一次的item数...
  • 完整统计js代码覆盖率,让你简单方便的了解自己代码单元测试的覆盖度
  • 谈谈测试覆盖率

    千次阅读 2019-10-24 14:06:27
    以前面试的时候,两次被问到同一个问题,“你是如何计算测试覆盖率的?”,但每次回答都不好,直到最近看了一些文章,有所感悟,总结如下: 1 定义 测试覆盖率通常被用来衡量测试的充分性和完整性。从广义角度讲,...
  • 在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。下面我们来学习一下...
  • java单元测试覆盖率统计

    千次阅读 2021-02-12 16:12:35
    很多时候,开发写了单元测试,但是我们并不知道当前的单元测试覆盖率是怎么样的,所以我们需要有技术手段来分析我们的单元测试覆盖率情况。那么,jacoco来了...jacoco介绍:jacoco 是一个开源的覆盖率工具。Jacoco ...
  • 一、软件测试覆盖率 **测试覆盖率:**测试覆盖率是用度量测试完整性的一个手段,同事也是测试活动有效性的一个度量 覆盖率=(至少被执行一次的item数)/item的总数 二、特点: 1、通过覆盖率数据,可以检测我们的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 164,310
精华内容 65,724
关键字:

测试覆盖率

友情链接: 高级流水灯.zip