精华内容
下载资源
问答
  • C++代码覆盖率计算

    2018-11-22 19:50:27
    Windows下一般用opencppcoverage计算C++代码覆盖率。 可以直接在Visual Studio上安装 也可以在cmd上运行OpenCppCoverage.exe来实现。 OpenCppCoverage.exe --optimized_build --plugin --sources D:\...

    Windows下一般用opencppcoverage计算C++代码覆盖率。
    可以直接在Visual Studio上安装
    VS上之间安装
    也可以在cmd上运行OpenCppCoverage.exe来实现。
    在这里插入图片描述

    OpenCppCoverage.exe --optimized_build --plugin 
    --sources D:\TALLivePlatform\TALLivePlatform\
    -- D:\TALLivePlatform\TALLivePlatform\build\x64\Release\TALLivePlatform.exe
    

    可以直接生成html,包含数值和饼状图,以及代码覆盖颜色标注。
    在这里插入图片描述
    Linux下可以使用命令
    gcov lcov 覆盖c/c++项目入门

    cd /data/workspace/C++Coverage/code/ooo;
    g++ -c /data/workspace/C++Coverage/code/ooo/oo.cpp -ftest-coverage -fprofile-arcs;
    g++ /data/workspace/C++Coverage/code/ooo/oo.o -o /data/workspace/C++Coverage/code/ooo/oo --coverage;
    /data/workspace/C++Coverage/code/ooo/./oo;
    gcov /data/workspace/C++Coverage/code/ooo/oo.cpp;
    lcov -c -o /data/workspace/C++Coverage/code/ooo/oo.info -d .;
    genhtml /data/workspace/C++Coverage/code/ooo/oo.info -o /data/workspace/C++Coverage/code/ooo/oo_result"
    

    Jenkins上结果展示
    可以看到语句被覆盖的次数在行头有标注。

    展开全文
  • 代码覆盖率

    千次阅读 2018-02-11 13:06:47
    用途:测试覆盖率评价的是测试代码的质量,并不是产品代码的质量代码覆盖率是一种白盒测试,因为测试覆盖率是评价产品代码类内部的指标,而不是评价系统接口或规约。测试覆盖率尤其用于评价测试代码是否已经覆盖了...

    用途

    测试覆盖率评价的是测试代码的质量,并不是产品代码的质量

    代码覆盖率是一种白盒测试,因为测试覆盖率是评价产品代码类内部的指标,而不是评价系统接口或规约。测试覆盖率尤其用于评价测试代码是否已经覆盖了产品代码所有的路径。

    分类

    类的覆盖率:类覆盖描熟了项目中多少类已被测试套件访问。  
    方法覆盖率:方法覆盖率是被访问的方法的百分比。 
    语句覆盖率:语句覆盖率追踪单条源代码语句的调用。 
    语句块覆盖率:语句快覆盖率将语句块作为基本的覆盖律单元。 
    分支覆盖率:分支覆盖率也被称为判断覆盖率。指标计算哪些代码分支被执行。

    代码的覆盖深度:从覆盖源程序语句的详尽程度分析,逻辑覆盖标准包括以下不同的覆盖
    标准:语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖和修正判定条件覆
    盖。 参考:
    http://bbs.51testing.com/thread-74208-1-1.html

    ·语句覆盖为了暴露程序中的错误,程序中的每条语句至少应该执行一次。因此语句覆
    盖(Statement Coverage)的含义是:选择足够多的测试数据,使被测程序中每条语句至少执
    行一次。语句覆盖是很弱的逻辑覆盖。

    ·判定覆盖 比语句覆盖稍强的覆盖标准是判定覆盖(Decision Coverage)。判定覆盖的
    含义是:设计足够的测试用例,使得程序中的每个判定至少都获得一次真值假值
    或者说使得程序中的每一个取分支和取分支至少经历一次,因此判定覆盖又称为
    分支覆盖。
    ·条件覆盖在设计程序中,一个判定语句是由多个条件组合而成的复合判定。为了更彻
    底地实现逻辑覆盖,可以采用条件覆盖(Condition Coverage)的标准。条件覆盖的含义是:
    构造一组测试用例,使得每一判定语句中每个逻辑条件的可能值至少满足一次。
    ·多条件覆盖多条件覆盖也称条件组合覆盖,它的含义是:设计足够的测试用例,使得
    每个判定中条件的各种可能组合都至少出现一次。显然满足多条件覆盖的测试用例是一定满足
    判定覆盖、条件覆盖和条件判定组合覆盖的。
    ·修正条件判定覆盖修正条件判定覆盖是由欧美的航空/航天制造厂商和使用单位联合制
    定的航空运输和装备系统软件认证标准,目前在国外的国防、航空航天领域应用广泛。这
    个覆盖度量需要足够的测试用例来确定各个条件能够影响到包含的判定的结果。它要求满足两
    个条件:首先,每一个程序模块的入口和出口点都要考虑至少要被调用一次,每个程序的判定
    到所有可能的结果值要至少转换一次;其次,程序的判定被分解为通过逻辑操作符(andor)连接的布尔条件,每个条件对于判定的结果值是独立的。

    覆盖率工具 

    Clover(商用)、EMMACobertura  JaCoCo

    特点/工具

    Cobertura

    Emma

    jacoco

    http://rensanning.iteye.com/blog/2002371
    http://blog.csdn.net/smile0102/article/details/48688763

    集成

    一个与Junit集成的代码覆盖率测量工具

    可以与AntMaven集成,也可以通过命令行调用

    可以统计几种覆盖率:classmethodblock, line。支持版本迭代的覆盖率统计

    免费且开源的Java代码覆盖率测试工具,100%Java编写,不依赖与任何第三方库

    Java Code Coverage)是开源的Java代码覆盖率测试library
    可以集成到ANTMavenbuild工具中。它采用标准的JVM Tool Interface。把JaCoCo agent 加入到JVM后启动,加载到JVM中的class具体被执行了哪些代码行将会被记录下来,JaCoCo搜集这些执行信息直到JVM结束后生成静态报告。

    开源

    免费、开源的

    免费、开源的

    免费、开源的

    报告形式

    可以生成HTMLXML格式的报告

    可以按照不同的标准对HTML结果进行排序

    提供了多种格式的报告,包括纯文本,HTMLXML,所有的报告都可以进行详细设置以获得定制报告

     

    覆盖率统计

    为每个类、包以及整个项目计算所覆盖的代码行与代码分支的百分比例

    支持对类,方法,代码行和基本的分支语句的覆盖率测试

    使用EMMA时,不需要获得源代码就可进行覆盖率测试,此外,EMMA还支持对整个jar文件测试。

     

     

     

     

     

     

     

     

     

    注释:

    Java测试覆盖率工具上,还有一个更加简单的工具:EclEmma(推荐,EclEmma是一个基于EMMAJava代码覆盖工具) ,它可以很方便的与Eclipse集成,然后可以直接run,显示出代码覆盖率,其地址是:http://www.eclemma.org/

     

    错误认识

    为覆盖率而设计是错误得的,有一点:有覆盖率统计,好过没有 

    功能测试代码覆盖率统计工具-EMMA

    原理:

    原理:
    http://qa.blog.163.com/blog/static/190147002201111151057365/
    http://www.tuicool.com/articles/3YJRfuU

    局限: 

     仅仅支持JDK7,如果JDK8,需要选择如jacoco等工具。
    脚本的编写:
    http://tianya23.blog.51cto.com/1081650/364094

    EMMA 所使用的字节码插装不仅保证 EMMA 不会给源代码带来脏代码,还确保 EMMA 摆脱了源代码的束缚,这一特点使 EMMA 应用于功能测试成为了可能。

    大多数功能测试中,测试人员一般不能直接得到被测源代码,源代码也不是测试人员关心的重点。在具体的测试过程中,功能测试人员一般以一个有意义的功能模块作为测试关心的重点,而能够反映一定功能含义的类和方法的覆盖率在功能测试中更有价值。因此,在功能测试中,类覆盖率和方法覆盖率是测试人员关心的重点,行和块覆盖率则作为测试的参考。

    测试覆盖率报告中包含了两个方面的内容,测试覆盖的部分和未被测试覆盖的部分。尽管百分之百的测试覆盖率不能代表被测对象完全没有问题,但是测试覆盖的部分以及覆盖比率可以增加测试者对测试工作的信心,指导测试执行以及测试的方向。另一方面,当测试用例执行出现异常时,针对每个测试用例的测试报告还可以提供可疑代码的范围,为代码纠错提供帮助。

    测试覆盖率报告中未覆盖的部分也同样有价值:

    · 表明测试可能不完整,有些功能、代码没有被测试覆盖到。

    · 为测试用例的设计提供指导建议。在覆盖率报告的指导下,测试人员有目的地与开发人员进行讨论,确定未覆盖部分是测试的空白还是不需要测试的部分。

    · 帮助开发人员发现无用代码,为修改,完善代码提供依据。

    在使用 EMMA 获得测试覆盖率过程中,类、方法等覆盖的百分比报告,可以方便测试人员更好的评估测试。测试人员通过对照覆盖率报告与测试用例设计文档,需求文档可以迅速找到测试的不足。通过与开发人员进行讨论,可以更好的评估测试力度,并指导进一步的测试。因此在功能测试中引入覆盖率信息,能够完善测试结果报告,确保测试质量和力度,保证测试按质、按量地完成。

     

    EMMA 使用

    EMMA基本是四步曲:插桩(instr),运行,收集(ctl),报告(report

    版本0http://www.ibm.com/developerworks/cn/opensource/os-cn-emma/

    插装被测组件

    EMMA 通过对被测组件进行插装来跟踪被测组件的执行过程。测试人员应首先和开发人员讨论,确定哪一部分包含了符合插装要求的文件( Java 文件),哪一部分需要考虑覆盖率信息,然后选择合适的方式进行插装。

    · 插装准备

    在执行插装操作之前,首先应该扩展 Java 虚拟机,即将 emma.jar 放到被测组件运行使用的JRE 目录下面作为 JRE 的扩展,以便 EMMA 能够被调用。 emma.jar 包含了 EMMA 核心功能模块的实现和 EMMA 运行时所需的类文件,这些文件是使用 EMMA 所必需的。

    由于示例被测组件运行在 Websphere Portal Server 中,并使用默认的 JRE 运行,因此将emma.jar 放到 “/opt/WebSphere/PortalServer/java/jre/lib/ext” 下面。在实际的测试中,将该路径进行相应的替换。

    · 插装

    EMMA 中提供了 “instr” 命令完成插装操作。插装操作可以面向 JAR 包、 WAR 包、 WAR 包、类文件和目录,选择合适的命令进行插装可以使插装过程变得简便。

    清单 1. 对类文件插装命令

    /opt/WebSphere/PortalServer/java/jre/bin/java emma instr -m overwrite -ip

    /opt/WebSphere/PortalServer/installedApps/NumberQuizWEB_10yggsru.ear/NumberQuizWEB.war/WEB

    -INF/classes -Dmetadata.out.file=/root/emma/Number_coverage.em

    · 合并元数据

    完成插装操作以后,在指定的路径下会产生一些名为 “*coverage.em” 的文件,这些文件保存了插装的元信息,这些信息主要是记录插装过程中的插装点在被测代码中的位置。如果在插装过程中,指定这些文件到同一文件的话, EMMA 默认将元数据进行合并。如果测试人员未指定路径,或者希望得到独立的元文件,这些文件将分别产生在默认或指定的目录下。测试人员还可以通过使用 “merge” 命令手动将这些元文件进行合并,保证生成的覆盖率报表的全面性。注意:合并操作不支持逆向操作。

    清单 5. 合并元数据命令

    /opt/WebSphere/PortalServer/java/jre/bin/java emma merge

    -input <path1>/coverage1.em,<path2>/coverage.em -out <path>/coverage2.em

     

    完成上面的操作以后,就已经完成了收集覆盖率信息的准备工作。接下来测试人员可以进行正常的测试工作,在运行测试的过程中, EMMA 将跟踪并记录执行轨迹,得到覆盖率信息。

    运行测试用例,得到覆盖率报告

    完成插装工作以后,测试人员可以按照测试计划运行测试用例。 EMMA 将在测试执行的过程中记录代码执行信息并将结果记录在内存中。每次当 JVM 停止时,内存中记录的执行信息将被清除并被保存到 “*.ec” 的文件中。但是在实际测试的过程中, JVM 的停止很难控制,因此测试人员可以定时手动将内存中执行信息写出。在这种情况下,内存中的记录被输出,但是内存中的内容不被清除。

    从本地收集覆盖率信息

    /opt/WebSphere/PortalServer/java/jre/bin/java -cp emma.jar emma ctl -connect

    auscsdpfvtvm15.bto.ibm.com:47653 -command coverage.get,/root/emma/Number_coverage.ec

     

    EMMA: processing control command sequence

    EMMA: executing [coverage.get (/root/emma/Number_coverage.ec,true,true)]

    EMMA: coverage.get: local copy of coverage data merged into

              [/root/emma/Number_coverage.ec] {in 39 ms}

    EMMA: coverage.get: command completed in 79 ms

    EMMA: control command sequence complete

    这样收集到的信息被保存在 “coverage.ec” 中, “coverage.ec” 是二进制格式的文件,因此很难被用来查看覆盖率结果。

    生成覆盖率报告

    /opt/WebSphere/PortalServer/java/jre/bin/java -cp emma.jar emma report -r html -in

     /root/emma/Number_coverage.em,/root/emma/Number_coverage.ec -

    Dreport.html.out.file=/root/emma/Number_coverage.html -Dreport.metrics=class:80

    (,method:75)

    在生成覆盖率报告的过程中,测试人员可以根据测试要求通过 “Dreport.metrics” 参数设定满意的覆盖率标准。在示例命令中设定了类覆盖率的满意度为80%

    测试报告可以以 HTML ,文本和 XML 三种格式输出。

    合并覆盖率结果

    完成所用的测试用例后,测试覆盖信息可以被合并在一起,得到整个测试的覆盖报告。覆盖率结果文件通过 “merge” 命令合并 “*.ec” 文件实现的。

    另外,由于 EMMA 中测试覆盖率是通过与 “*.em” 文件关联获得代码信息的,因此当代码发生变化时,已经运行过的测试不必完全重复,只需将得到的 “*.ec” 文件合并(新得到的 “*.ec” 文件放在后面),然后关联最新的 “*.em” 文件即可得到代码变化后的覆盖率信息,这方便了 EMMA 支持版本变化的测试。在生成新的测试报告的时候,需要注意 “*.ec” 的时间一定要晚于 “*.em” 文件。

    清单 9. 合并覆盖率结果命令

    /opt/WebSphere/PortalServer/java/jre/bin/java emma merge

    –input coverage1.ec,coverage2.ec,coverage3.ec –output coverage.ec

    如果在生成测试报告的时候,如果出现 “com.vladium.emma.EMMARuntimeException: [CLASS_STAMP_MISMATCH] runtime version of class in the coverage data is not consistent with the version of this class in the metadata, possibly because stale metadata is being used for report generation” 错误,说明在生成新的 “*.em” 前后代码曾经被修改过,并且被修改的代码所在的类文件在新的测试中没有被覆盖到,这就需要重新执行这部分测试,保证修改过的部分被重新执行。

     

    展开全文
  • 代码覆盖率检测正是帮助开发、测试同学提前发现问题,保证代码质量的好帮手。对于开发者而言,代码覆盖率可以反馈两方面信息:自测的充分程度。代码设计的冗余程度。尽管代码覆盖率对代码质量有着上述好处,但在iOS...
  • 在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。用代码覆盖率来衡量...
  • 这篇来学习一个单元测试领域中很重要的一个概念,代码覆盖率,这个术语,早起是在航空航天方面的软件里提出来的一个测试方法,100%代码覆盖率是一个不可能完成的任务,只是一个理想的目标。本篇先来学习代码覆盖率和...

    这篇来学习一个单元测试领域中很重要的一个概念,代码覆盖率,这个术语,早起是在航空航天方面的软件里提出来的一个测试方法,100%代码覆盖率是一个不可能完成的任务,只是一个理想的目标。本篇先来学习代码覆盖率和周边几个名词,然后介绍一款能够给出代码覆盖率的插件,简单来学习和使用下这个插件。代码覆盖率是一个很容易在面试中被问到的问题,通过本篇学习,你起码有一个普,不会乱扯,不懂装懂。

     

    1.代码覆盖率

    在设计测试用例的时候,需要参考不同覆盖率准则进行设计测试数据,以下是常见的覆盖率准则。

    函数/方法覆盖率(Function coverage):代码中覆盖测试调用每一个方法/函数。
    指令/语句覆盖率(Statement coverage): 程序中每一行代码都覆盖,其实就是全路径覆盖。
    判断覆盖率(Decision coverage):(和分支覆盖率不同)覆盖到各种分支可能
    条件覆盖率(Condition coverage):也称为谓词覆盖(predicate coverage),每一个逻辑运算式中的每一个条件(无法再分解的逻辑运算式)都覆盖
    条件/判断覆盖率(Condition/decision coverage):需同时满足判断覆盖率和条件覆盖率。
    

    起码要保证针对一个方法的单元测试用例,要保证覆盖这个方法里面的不同行代码,参考我在前面文章中,对于二分查找算法设计的单元测试用例方法。 https://blog.csdn.net/u011541946/article/details/93631967

     

    2.EclEmma插件

    我们在写好单元测试用例之后,然后执行完单元测试,我们并不知道覆盖了多少代码,还好有一些免费的工具可以帮助我们实现,跑完单元测试就得到代码覆盖率的简单报告,接下来介绍一个Eclipse上插件 eclemma

    2.1在eclipse市场上搜索并安装

    2.2 运行得到覆盖率报告

    安装完之后,菜单栏有以下这个图标

    我们打开测试类:TrackingServiceTests.java,然后根据上图,选择Coverage as - Junit Test

    上面红色表示没有被覆盖,绿色表示覆盖,Instructions是指令的意思,也就是语句覆盖。这里根据这张图来解读下我们这个被测的项目覆盖情况:语句覆盖率是80.6%, 已经覆盖了100行代码,还有24行代码没有覆盖到。下面我们来看看24行代码是只哪些,所以我们需要打开被测项目。

    红色没有覆盖,说明我们还需要补充这两个方法的单元测试用例。当然,我看了被测项目全部3个java文件,没有数出来24个语句没有覆盖,这个24怎么来的却是不清楚,只能找到方法中标红的就是未覆盖的语句。

    以后在写某一个class文件中方法的单元测试用例的时候,利用这个插件,可以帮我们提高覆盖率,写出更好覆盖率的单元测试用例。很好用,红色表示没有被覆盖,绿色表示覆盖,连分支和判断覆盖都给你指出来没有覆盖到,特别方便的一个工具。

    展开全文
  • 代码覆盖率简介

    2020-12-12 16:36:57
    本文在模糊测试中应用了代码覆盖率,发现随着测试次数的增加,覆盖率逐渐趋于一个最大值。这个覆盖率最大值和白盒测试的最覆盖率值接近,从而证明在本例中使用模糊测试可以取得和白盒测试等价的结果。

    0. 前言

    来源:Code Coverage

    建议阅读原文,我这里仅仅整理下思路。我敲的相关代码见:fuzzing仓库

    背景要求:软件测试简介 | 模糊测试简介

    在前一章中,我们介绍了基本的模糊——即生成测试程序的随机输入。我们如何衡量这些测试的有效性?一种方法是检查发现的错误的数量(和严重性);但是如果bug很少,我们需要一个代理来检测发现bug的可能性。在本章中,我们将介绍代码覆盖率的概念,以度量在测试运行期间实际执行程序的哪些部分。对于试图覆盖尽可能多的代码的测试生成器来说,度量这样的覆盖率也是至关重要的。


    1. 摘要

    黑盒测试是功能性测试。白盒测试是结构测试。为了查看白盒测试过程中,哪些代码被测试(哪些代码没有被测试),在执行代码的时候进行跟踪。通过跟踪,我们可以知道代码的覆盖率详情。为此,本文实现了一个Coverage class 来记录代码执行过程中的覆盖率。本文在模糊测试中应用了代码覆盖率,发现随着测试次数的增加,覆盖率逐渐趋于一个最大值。这个覆盖率最大值和白盒测试的最覆盖率值接近,从而证明在本例中使用模糊测试可以取得和白盒测试等价的结果。


    2. 被测试程序

    我们首先介绍一个简单的Python函数,它对一个cgi编码的字符串进行解码。CGI编码用于URL(即网址),对URL中无效的字符进行编码,如空格和某些标点符号。(我不知道这里的CGI是什么|我在google中没找见)

    • 空格被替换成+
    • 其他无效字符被’%xx’(%ASSIC)替换,其中xx是等效的两位数十六进制字符。

    比如Hello%2c+world%21对应的是 Hello, world!

    def cgi_decode(s):
        # 对使用cgi的url解码
        hex_vaule = {
            '0': 0, '1': 1, '2': 2, '3': 3, '4': 4,
            '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
            'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15,
            'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15,
        }
    
        exchange_value = {'+':' '}
    
        i = 0
        t = ''
        while i < len(s):
            # 如果是交换表中的内容直接替换
            # 如果是%的形式,计算转换
            # 其他情况直接赋值
            if s[i] in exchange_value.keys():
                t += exchange_value[s[i]]
                i = i+1
            elif s[i] == '%':
                high_value,low_value = s[i+1],s[i+2]
                if high_value in hex_vaule and low_value in hex_vaule:
                    t += chr(hex_vaule[high_value]*16+hex_vaule[low_value])
                    i += 3
                else:
                    raise ValueError("Invalid encoding")
            else :
                t += s[i]
                i += 1
        
        return t
    

    3. 黑盒测试与白盒测试

    参考内容: 黑盒测试 – wiki | 白盒测试

    黑盒测试,软件测试的主要方法之一,也可以称为功能测试、数据驱动测试或基于规格说明的测试。测试者不了解程序的内部情况,不需具备应用程序的代码、内部结构和编程语言的专门知识。只知道程序的输入、输出和系统的功能,这是从用户的角度针对软件界面、功能及外部结构进行测试,而不考虑程序内部逻辑结构。测试案例是依应用系统应该做的功能,照规范、规格或要求等设计。测试者选择有效输入和无效输入来验证是否正确的输出。

    # 使用黑盒测试,测试上面cgi_decode函数
    assert cgi_decode("a+b") == "a b"
    assert cgi_decode("a%21b") == "a!b"
    assert cgi_decode("abc") == "abc"
    
    try:
        cgi_decode("%?")
        raise False
    except:
        pass
    

    白盒测试(white-box testing)又称透明盒测试(glass box testing)、结构测试(structural testing)等,软件测试的主要方法之一,也称结构测试、逻辑驱动测试或基于程序本身的测试。测试应用程序的内部结构或运作,而不是测试应用程序的功能(即黑盒测试)。在白盒测试时,以编程语言的角度来设计测试案例。测试者输入资料验证资料流在程序中的流动路径,并确定适当的输出,类似测试电路中的节点。测试者了解待测试程序的内部结构、算法等信息,这是从程序设计者的角度对程序进行的测试。

    很好的是,上面的测试也符合白盒测试的定义。


    4. 执行的轨迹

    参考内容:sys.settrace(tracefunc)

    白盒测试的一个不错的功能是,它实际上可以自动评估是否涵盖了某些程序功能。 为此,人们需要一个特殊的功能来记录哪些代码执行了,哪些代码没有执行,即跟踪代码的轨迹。 测试之后,这些信息可以传递给程序员,然后程序员可以专注于编写涵盖尚未发现的代码的测试。

    下面代码是跟踪执行上面的cgi_decode函数。最后输出结果:当相应行的代码没有执行,前面加上#;如果相应行的代码已执行,前面加上空格。

    # 存储覆盖率情况
    coverage = []
    
    # 保存执行代码的行号
    def traceit(frame,event,arg):
        if event == "line":
            global coverage
            function_name = frame.f_code.co_name
            lineno = frame.f_lineno
            coverage.append(lineno)
        return traceit
    
    import sys
    def cgi_decode_traced(s):
        global coverage
        coverage = [] # 原来内容清空
        sys.settrace(traceit) # 打开
        t = cgi_decode(s)
        sys.settrace(None) # 关闭
        return t
    
    # 获取object源码的txt
    import inspect
    cgi_decode_code = inspect.getsource(cgi_decode)
    
    # 是自定义的内容,让输出更好看;详细代码见附录
    # 如果相应行的代码没有执行,前面加上#
    # 如果相应行的代码已执行,前面加上空格
    cgi_decode_lines = [""] + cgi_decode_code.splitlines()
    coverage = set(coverage)
    for lineno in range(1,len(cgi_decode_lines)):
        if lineno not in coverage:
            print('# ', end="")
        else:
            print('  ', end="")
        print(f"{lineno} ",end="")
        syntax_highlighting.print_content(cgi_decode_lines[lineno],'.py')
    

    在这里插入图片描述


    5. 一个覆盖率类

    上面将covergae作为全局变量不好处理;咋办呢?放在对象里面就好;

    class Coverage(object):
        # 代码写的很好:
        # 如果原来的代码已经settrace,在原来trace函数的基础上,添加获取覆盖率的代码;退出之后,仍然使用原来的trace函数
        # 如果原来的代码没有settrace,我们设置的trace仅获取代码覆盖率;退出之后,trace函数的位置设置为None
        def traceit(self,frame,event,arg):
            if self.origin_trace_function is not None:
                self.origin_trace_function(frame,event,arg)
            if event == "line":
                function_name = frame.f_code.co_name
                lineno = frame.f_lineno
                self._trace.append((function_name, lineno))
            return self.traceit
        
        def __init__(self):
            self._trace = []
    
        def __enter__(self):
            self.origin_trace_function = sys.gettrace()
            sys.settrace(self.traceit)
            return self
        
        def __exit__(self,exc_type, exc_value, tb):
            sys.settrace(self.origin_trace_function)
        
        def trace(self):
            return self._trace
        
        def coverage(self):
            return set(self.trace())
    

    我们的base line 是最大的代码覆盖率。其他的测试结果和最大覆盖率比较,观察有哪些代码没有测试到。

    # cgi_decode的最大覆盖率
    with Coverage() as cov_max:
        cgi_decode('+')
        cgi_decode('%20')
        cgi_decode('abc')
        try:
            cgi_decode('%?a')
        except:
            pass
    
    # 测试下上面的Coverage class
    with Coverage() as cov:
        cgi_decode("Hello%2c+world%21")
    print(cov.coverage())
    
    # 比较下最大覆盖率和上面的cov对象的覆盖率
    cov_max.coverage() - cov.coverage()
    
    {('cgi_decode', 27)}
    

    6. 基于模糊测试的代码覆盖率

    使用模糊的方式生成随机输入,不断的测试代码,观察代码覆盖率的变化。

    from fuzzingbook.fuzzingbook_utils import Fuzzer
    
    # 生成trails个随机字符串
    def hundred_inputs(trails):
        population = []
        for i in range(trails):
            population.append(Fuzzer.fuzzer())
        return population
    
    # 使用popolation中的字符串作为输入,对function进行测试测试,返回覆盖率相关信息
    def population_coverage(population, function):
        cumulative_coverage = []
        all_coverage = set()
    
        for s in population:
            with Coverage() as cov:
                try:
                    function(s)
                except:
                    pass
            all_coverage |= cov.coverage()
            cumulative_coverage.append(len(all_coverage))
        
        return all_coverage,cumulative_coverage
    
    all_coverage, cumulative_coverage = population_coverage(hundred_inputs(100), cgi_decode)
    

    如果对python画图不了解,可以参考:python画图

    # 通过折线图查看基于模糊测试的覆盖率变化情况
    import matplotlib.pyplot as plt 
    
    plt.plot(cumulative_coverage)
    plt.title("Coverage of cgi_decode() with random input")
    plt.xlabel("# of input")
    plt.ylabel("lines covered")
    
    plt.show()
    

    在这里插入图片描述

    上面的仅仅跑一轮;多跑几轮,求平均值。可以看到,大概测试90次之后,覆盖率不再增加。

    runs = 100 # 跑100轮
    trails = 100 # 没轮跑100次
    
    sum_coverage = [0]*trails
    
    for run in range(runs):
        all_coverage, cumulative_coverage = population_coverage(hundred_inputs(trails), cgi_decode)
        assert len(cumulative_coverage) == trails
        for i in range(len(cumulative_coverage)):
            sum_coverage[i] += cumulative_coverage[i]
    
    for i in range(trails):
        sum_coverage[i] /= runs
    
    plt.plot(sum_coverage)
    plt.title("Coverage of cgi_decode() with random input")
    plt.xlabel("# of input")
    plt.ylabel("lines covered")
    
    plt.show()
    

    在这里插入图片描述


    7. 其他

    7.1 被测试代码中的错误

    很明显的是,上面fuzz的过程中,如果出现error,直接pass,并没有对错误的处理方式,比如保存错误输入。

    但是很明显这个代码是有问题的。

    比如输入这样的输入:‘82 202*&<1&($34’"/’.<5/!8"‘5:!4))%;’

    7.2 语句覆盖与分支覆盖

    上面使用的是语句覆盖;分支覆盖和它有有区别的。比如下面这样的语句。对于语句覆盖而言,当条件为真的时候,执行覆盖了所有语句。
    但是对于分支覆盖而言,还需要条件为假的情况;实现过程,可以在上面Coverage class的过程中,将记录语句改成记录分支。

    if CONDITION:
        do_a()
    something_else()
    

    7.3 语法高亮

    为了让输出更加好看。

    # syntax_highlighting.py
    # Jupyter notebook里面的语法高亮模块
    # 难道python终端没有语法高亮?
    
    # 参考:
    # [ipython](https://ipython.org/)
    # [pygments](https://pygments.org/docs/)
    
    # [How can I check if code is executed in the IPython notebook?]
    # (https://stackoverflow.com/questions/15411967/how-can-i-check-if-code-is-executed-in-the-ipython-notebook/54967911#54967911)
    
    from IPython import get_ipython
    
    def __isnotebook():
        try:
            shell = get_ipython().__class__.__name__
            if shell == 'ZMQInteractiveShell':
                return True   # Jupyter notebook or qtconsole
            elif shell == 'TerminalInteractiveShell':
                return False  # Terminal running IPython
            else:
                return False  # Other type (?)
        except NameError:
            return False      # Probably standard Python interpreter
    
    
    # check for rich output
    def __rich_output():
        __rich_output = __isnotebook()
        return __rich_output
    
    # print file with syntax highlighing
    def print_file(filename,lexer=None):
        content = open(filename,"rb").read().decode('utf-8')
        print_content(content,filename,lexer)
    
    def print_content(content,filename=None,lexer=None):
        from pygments import highlight,lexers,formatters,styles
        if __rich_output():
            if lexer is None:
                if filename is None:
                    lexer = lexers.guess_lexer(content)
                else:
                    lexer = lexers.get_lexer_for_filename(filename)
            # colorful_content = highlight(content,lexer,formatters.TerminalFormatter(bg="dark",linenos=True))
            colorful_content = highlight(content,lexer,formatters.TerminalFormatter())
            print(colorful_content,end="")
        else:
            print(content,end="")
    

    附录

    代码覆盖类的UML图。

    @startuml 3_code_coverage
    class Coverage{
        _trace[]
        origin_trace_function
        __init__self
        __enter__(self)
        traceit(self,frame,event,arg)
        __exit__(self,exc_type, exc_value, tb)
        trace(self)
        coverage(self)
    }
    note right of Coverage
        这个类写的很好
        _trace[]用来存储代码运行过程中的函数名和行号
        _trace[]属性在__init__方法中添加
        __enter__方法,获取当前trace函数存入origin_trace_function
                      settrace为traceit
        traceit方法,在原来trace函数的基础上,添加记录函数名和行号到_trace[]
        __exit__方法,还原使用原来的trace函数
        <b>trace方法</b>,返回_trace[]
        <b>coverage方法</b>,返回set(_trace[])
    end note
    @enduml
    

    在这里插入图片描述

    展开全文
  • AFL插桩及覆盖率计算实现分析

    千次阅读 2020-09-16 22:18:50
    这样就相当于在每个插桩点调用__afl_maybe_log函数,这样就让AFL有了计算程序覆盖率的能力。__afl_maybe_log在main_payload中插入,main_payload大约是200行左右的汇编代码,包含申请共享内存,记录覆盖率等逻辑功能...
  • Diff coverage是JaCoCo扩展,它基于提供的计算新/修改后代码的代码覆盖率。 diff内容可以通过补丁文件的路径,URL或使用嵌入式git(请参阅)提供。 我为什么要使用它? 强制每个开发人员对其自己的代码质量负责...
  • gcov代码覆盖率测试-原理和实践总结

    万次阅读 多人点赞 2018-07-10 17:50:12
    四、gcov检测代码覆盖率的原理 五、服务程序覆盖率统计 六、内核和模块的gcov代码覆盖率测试 七、lcov工具使用 八、info文件格式信息 九、例子 FAQ 参考 感谢 一、gcov简介 gcov是什么 gcov是一个测试代码...
  • NULL 博文链接:https://rensanning.iteye.com/blog/2002371
  • 代码覆盖率原理简介

    千次阅读 2021-02-08 16:42:26
    随着项目迭代的不断深入,工程逻辑与用户场景日益复杂,传统的白盒测试体系已经无法适应苛刻的工程质量要求,质量评估也不再单纯的依赖bug率和性能指标,而需要精准的数据来量化代码质量,代码覆盖率就是其中的一项...
  • 因为某项目的白盒单元测试做的不是很好,而QA又提出了非常高的代码覆盖率移行标准,不得以开始调研能覆盖手工测试(Mannual Test)的覆盖率工具,加上一些最基础的条件,该工具必须满足如下三点: 1:能计算白盒...
  • 代码覆盖率和测试覆盖率 测试覆盖率和代码覆盖率是衡量代码有效性的最流行方法。 尽管这些术语有时会互换使用,因为它们的基本原理相同。 但是它们并不像您想象的那样相似。 很多时候,我注意到测试团队和开发团队...
  • @unclebobmartin 100%的代码覆盖率无济于事,可以使您更安全,而事实并非如此。 @nicolas_frankel 100%的代码覆盖率不是成就,而是最低要求。 如果编写一行代码,则最好对其进行测试。 ...
  • (Android)代码覆盖率统计

    千次阅读 2016-02-23 09:37:55
    使用JaCoCo进行代码覆盖率
  • 覆盖率验证——代码覆盖率+功能覆盖率

    万次阅读 多人点赞 2020-04-25 14:52:32
    文章目录一、基于覆盖率驱动的验证技术二、代码覆盖率功能覆盖率三、功能覆盖率建模3.1.功能覆盖率模型——covergroup3.2.覆盖点——coverpoint3.3.覆盖点的——bins四、代码code 一、基于覆盖率驱动的验证技术 采用...
  • 由于目前的代码覆盖率分析工具都是基于,而...使用测试结果表明,这种计算在特定上运行的卡代码覆盖率的方 法是可行的,通过这种方法可以准确的得到关于卡代码的语句覆盖率的详细 信息,用来指导完善我们的测试工作。
  • 使用gcov进行C语言代码覆盖率统计

    千次阅读 2021-03-02 19:49:07
    gcov是一个测试代码覆盖率的工具。它必须与GCC一起使用来分析程序,以帮助并发现程序的未测试部分,还可以结合lcov工具生成html格式的统计报告,可以方便的查看代码覆盖率的情况,甚至可以查看每一行代码的执行次数...
  • Jacoco增量代码覆盖率

    千次阅读 2020-10-27 18:56:18
    jacoco增量代码覆盖率 作者:兰绿,荣荣 文章结构 背景 Jacoco简介 Jacoco 增量代码覆盖率设计方案 Jacoco增量代码覆盖率+持续交付 总结 一、背景 需求测试过程中,测试主要依靠需求及一些测试经验来主观保证质量...
  • nodejs代码覆盖率

    千次阅读 2016-12-28 16:19:07
    总结最近做node.js代码覆盖率,主要使用Istanbul包,没有其他语言的覆盖率工具功能多。 1 安装: $ npm install -g istanbul 2 覆盖率测试:  nodejs文件test.js内容: var a = 1; var b = 1; if ((a + b) > 2...
  • PHP代码覆盖率测试

    千次阅读 热门讨论 2018-09-20 18:43:10
    简介:最近研究了PHP代码覆盖率的测试,后面发现了github一个开源项目(https://github.com/sebastianbergmann/php-code-coverage) ,对PHP代码覆盖率测试已经做得很好了,所以拿来直接用,这里总结怎么用这个开源...
  • jacoco统计自动化代码覆盖率

    万次阅读 热门讨论 2018-07-10 13:40:07
    jacoco统计自动化代码覆盖率 1. 简介 1.1. 什么是Jacoco Jacoco是一个开源的代码覆盖率工具,可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具...
  • 增量代码覆盖率工具

    千次阅读 2019-02-26 15:48:24
    有赞的业务发展非常快,当存量代码较多时,新项目功能测试的整体覆盖率偏低是正常现象,另外开发提测时,并不能依据已有的全量覆盖率来判断对新增代码的自测完成度,基于这个背景,我们研发了增量代码覆盖率工具,...
  • 基于黑盒测试的代码覆盖率的实现

    千次阅读 2017-08-10 15:06:18
    那如何对黑盒测试进行代码覆盖率的统计 呢?下面我们step by step来看黑盒测试的覆盖率实现。 1. 首先我们选择cobertura工具来做覆盖率,可以使用命令行,也可以结合maven来实现。由于测试往往没有对开发代码的修改...
  • 使用gcov和lcov测试代码覆盖率

    千次阅读 2017-08-06 19:41:42
    gcov与 lcov简介gcovgcov是Linux下GCC自带的一个C/C++代码覆盖率分析工具,因此只要安装了gcc,就不需要再次安装了lcovlcov介绍gcov能够生成代码覆盖信息,但是不够直观,因此需要借助lcov直观展示覆盖率,主要特点有...
  • 如何使用JaCoco统计代码覆盖率

    千次阅读 2020-05-26 18:56:30
    通过Jenkins插件,能够通过pipline的方式同时显示构建的流程及代码覆盖率视图 即:通过在Jenkinsfile文件中定义stage和shell脚本,来显示覆盖率 背景 Jenkins服务器+jacoco插件 编译环境:maven 项目结构:...
  • 如何分析 Python 测试代码覆盖率

    千次阅读 2020-05-02 11:40:00
    点击上方“编程派”,选择设为“设为星标”优质文章,第一时间送达!在测试中,为了度量产品质量,代码覆盖率被作为一种测试结果的评判依据,在Python代码中用来分析代码覆盖率的工具当属Cov...
  • CM = -cm line+cond+fsm_branch+tgl //表示要收集的代码覆盖率类型 CM_NAME = -cn_name $(OUTPUT) //表示覆盖率的文件名 CM_DIR = -cm_dir ./$(OUTPUT).vdb //表示覆盖率要存放到哪个目录下 -cm_nocasedef /

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,475
精华内容 38,590
关键字:

代码覆盖率计算