一、如何评估测试过程的测试情况?

很多时候完成功能测试后就会发布上线,甚至交叉和回归都没有足够的时间去执行,然后通过线上的补丁对遗漏的问题进行修复。如果可以在发布前了解本次测试过程所覆盖代码执行的比例情况,那么就可以一定程度上反应测试的执行情况和系统的质量情况。

    代码执行覆盖率是一种很好评估测试人员在执行测试过程中,所命中技术编码情况的手段,并可以从侧面评估系统的质量情况。我所在的项目前后端都是用Lua进行逻辑业务开发,这里分享如何使用Lua的debug模块进行代码执行覆盖率统计的实现。

二、Lua代码执行覆盖统计工具

代码覆盖率可以做到行覆盖率,函数覆盖率和分支覆盖率。通过Lua语言debug库的sethook方法可以设置以行或以函数来监控代码的执行行为。

debug.sethook ([thread,] hook, mask [, count]):

可以通过官方文档获得更好的介绍,这里通过设置回调函数和监控的方式,然后在监控的回调函数里面记录当前执行的文件及执行的行数、以及函数记录。最后在停止hook的时候将上面记录数据输出到文本文件,这样就可以知道本次测试在运行过程中所有代码执行的情况记录。

 1 function call_hook_func()
2 local info = debug.getinfo(2, "nlS")
3 if not info then
4 return
5 end
6 local filename = info.short_src
7 local linenum = info.currentline
8 local func = info.name -- 函数名
9 -- 过滤掉C层调用
10 if linenum <= 0 then return end
11 -- 文本函数记录表 g_code 记录文件名,行数,函数名和执行的次数
12 local file_line_tb = g_code[filename]
13 if not file_line_tb then
14 file_line_tb = {}
15 g_code[filename] = file_line_tb
16 end
17 -- 这里是行数
18 local func_info = file_line_tb[linenum]
19 if not func_info then
20 func_info = {[0]=0, [1]=func}
21 file_line_tb[linenum] = func_info
22 end
23 -- 统计执行的次数
24 func_info[0] = (func_info[0] or 0) + 1
25 end
26 debug.sethook(call_hook_func, "c")

 以上是简单的函数执行统计的代码,通过设置hook函数调用,在监控函数里面统计当前执行的文件、所在行、以及函数,并且还记录了这个函数的执行次数。这样就可以得到原始的代码执行情况的数据记录。通过编写一个分析脚本将执行的数据和源代码的数据进行对比,从而就可以计算出行覆盖率,函数覆盖率,以及分支覆盖率。这样每次在测试执行前开启,在测试结束后统计计算,就可以评估本次测试所覆盖的代码量,甚至可以做更深入的分析判断哪些核心的逻辑没有执行到。

三、Lua监控代码执行情况的项目仓库

https://github.com/memolp/LuaCodeCoverage

使用方法:

1. 导入模块

require "CodeCoverage" 

2. 执行Hook,并选择统计的类型(这里提供基于行的统计和基于函数的统计)

-- Jeff_CodeCoverage.LINE_COVERAGE_MODE 行覆盖率统计
-- Jeff_CodeCoverage.FUNC_COVERAGE_MODE 函数覆盖率统计
-- StartHook 第二个参数设置为true将实时输出行或函数覆盖的执行流数据
Jeff_CodeCoverage.StartHook(Jeff_CodeCoverage.FUNC_COVERAGE_MODE)

3. 测试完业务功能后,调用停止Hook,输出本次执行的数据

Jeff_CodeCoverage.StopHook()

4. 通过上面输出的数据,与源码进行对比计算出覆盖率。(这里需要开发一个统计源代码行数和函数的工具)。

【Lua】实现代码执行覆盖率统计工具的更多相关文章

  1. 使用Jacoco获取 Java 程序的代码执行覆盖率

    Jacoco是Java Code Coverage的缩写,顾名思义,它是获取Java代码执行覆盖率的一个工具,通常用它来获取单元测试覆盖率.它通过分析Java字节码来得到代码执行覆盖率,因此它还可以分 ...

  2. java代码行数统计工具类

    package com.syl.demo.test; import java.io.*; /** * java代码行数统计工具类 * Created by 孙义朗 on 2017/11/17 0017 ...

  3. Python实现代码行数统计工具

    我们经常想要统计项目的代码行数,但是如果想统计功能比较完善可能就不是那么简单了, 今天我们来看一下如何用python来实现一个代码行统计工具. 思路:首先获取所有文件,然后统计每个文件中代码的行数,最 ...

  4. SQLSERVER执行性能统计工具SQLQueryStress

    SQLSERVER执行时间统计工具SQLQueryStress 有时候需要检测一下SQL语句的执行时间,相信大家都会用SET STATISTICS TIME ON开关打开SQLSERVER内置的时间统 ...

  5. svn代码统计工具的金额

    StatSVN介绍 StatSVN是Java写开源统计程序,从statCVS从移植.从能Subversion版本号来获取信息库,该项目开发的叙述性说明,然后生成各种表格和图表.例:时间线.针对每一个开 ...

  6. jacoco-1-java代码测试覆盖率之本地环境初体验

    前言 jacoco是一个开源的覆盖率工具,它针对的开发语言是java,其使用方法很灵活,可以插桩到Ant.Maven中,可以使用其JavaAgent技术监控Java程序等. 那么本次主要使用对java ...

  7. iOS 覆盖率检测原理与增量代码测试覆盖率工具实现

    背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久.如果在开发.测试阶段能够提前暴露问题,就有助于避免线上事故的发生.代码覆盖率检测正是帮助开发.测试同学提前发现 ...

  8. Python实现代码统计工具——终极加速篇

    Python实现代码统计工具--终极加速篇 声明 本文对于先前系列文章中实现的C/Python代码统计工具(CPLineCounter),通过C扩展接口重写核心算法加以优化,并与网上常见的统计工具做对 ...

  9. Python实现C代码统计工具(四)

    目录 Python实现C代码统计工具(四) 标签: Python 计时 持久化 声明 运行测试环境 一. 自定义计时函数 1.1 整个程序计时 1.2 代码片段计时 1.3 单条语句计时 二. 性能优 ...

随机推荐

  1. vector 删除和插入

    删除 #include <iostream> #include <vector> using namespace std; int main() { vector<int ...

  2. PAT (Basic Level) Practice (中文)1007 素数对猜想 (20分)

    1007 素数对猜想 (20分) 让我们定义d​n为:dn = pn+1 − pn,其中p​i是第i个素数.显然有d1 = 1,且对于n > 1有dn是偶数."素数对猜想"认 ...

  3. iNeuOS工业互联网操作系统,智慧用电测控应用案例

    目       录 1.      概述... 2 2.      系统部署结构... 2 3.      用电测控终端... 3 4.      系统应用介绍... 6 1.   概述 通过物联网技 ...

  4. 【二食堂】Beta - Scrum Meeting 11

    Scrum Meeting 11 例会时间:5.26 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 文本导入.保存部分的工作比想象中的难,还需要一些时间完成issue 1. ...

  5. OO第二单元电梯作业总结

    目录 目录一.第一次作业分析设计策略基于度量分析程序结构二.第二次作业分析设计策略基于度量分析程序结构三.第三次作业分析设计策略基于度量分析程序结构四.分析自己程序的bug五.发现别人程序bug所采用 ...

  6. 2021NOI同步赛

    \(NOI\) 网上同步赛 明白了身为菜鸡的自己和普通人的差距 DAY1 \(T1\) 轻重边 [题目描述] 小 W 有一棵 \(n\) 个结点的树,树上的每一条边可能是轻边或者重边.接下来你需要对树 ...

  7. ssh key公钥

    在ubuntu上生成ssh key 首先使用 ls -al ~/.ssh 查看本地是否已经有key 如果没有会显示如下: ~$ ls -al ~/.ssh ls: cannot access '/ho ...

  8. hdu 2190 重建希望小学(数学,递推)

    题意: N*3的教室,有2种砖,2*2.1*1. 问铺设教室的方案有多少种.(要铺满) 思路: 画一下图可以很快发现递推公式 代码: int main(){ int a[35]; mem(a,0); ...

  9. 近期业务大量突增微服务性能优化总结-3.针对 x86 云环境改进异步日志等待策略

    最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问 ...

  10. Linux常用命令和快捷键整理:(2)常用快捷键

    前言: Linux常用快捷键和基本命令整理,先上思维导图: linux常用命令请见:https://www.cnblogs.com/yinzuopu/p/15516499.html 基本快捷键的使用 ...