【Lua】实现代码执行覆盖率统计工具
一、如何评估测试过程的测试情况?
很多时候完成功能测试后就会发布上线,甚至交叉和回归都没有足够的时间去执行,然后通过线上的补丁对遗漏的问题进行修复。如果可以在发布前了解本次测试过程所覆盖代码执行的比例情况,那么就可以一定程度上反应测试的执行情况和系统的质量情况。
代码执行覆盖率是一种很好评估测试人员在执行测试过程中,所命中技术编码情况的手段,并可以从侧面评估系统的质量情况。我所在的项目前后端都是用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】实现代码执行覆盖率统计工具的更多相关文章
- 使用Jacoco获取 Java 程序的代码执行覆盖率
Jacoco是Java Code Coverage的缩写,顾名思义,它是获取Java代码执行覆盖率的一个工具,通常用它来获取单元测试覆盖率.它通过分析Java字节码来得到代码执行覆盖率,因此它还可以分 ...
- java代码行数统计工具类
package com.syl.demo.test; import java.io.*; /** * java代码行数统计工具类 * Created by 孙义朗 on 2017/11/17 0017 ...
- Python实现代码行数统计工具
我们经常想要统计项目的代码行数,但是如果想统计功能比较完善可能就不是那么简单了, 今天我们来看一下如何用python来实现一个代码行统计工具. 思路:首先获取所有文件,然后统计每个文件中代码的行数,最 ...
- SQLSERVER执行性能统计工具SQLQueryStress
SQLSERVER执行时间统计工具SQLQueryStress 有时候需要检测一下SQL语句的执行时间,相信大家都会用SET STATISTICS TIME ON开关打开SQLSERVER内置的时间统 ...
- svn代码统计工具的金额
StatSVN介绍 StatSVN是Java写开源统计程序,从statCVS从移植.从能Subversion版本号来获取信息库,该项目开发的叙述性说明,然后生成各种表格和图表.例:时间线.针对每一个开 ...
- jacoco-1-java代码测试覆盖率之本地环境初体验
前言 jacoco是一个开源的覆盖率工具,它针对的开发语言是java,其使用方法很灵活,可以插桩到Ant.Maven中,可以使用其JavaAgent技术监控Java程序等. 那么本次主要使用对java ...
- iOS 覆盖率检测原理与增量代码测试覆盖率工具实现
背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久.如果在开发.测试阶段能够提前暴露问题,就有助于避免线上事故的发生.代码覆盖率检测正是帮助开发.测试同学提前发现 ...
- Python实现代码统计工具——终极加速篇
Python实现代码统计工具--终极加速篇 声明 本文对于先前系列文章中实现的C/Python代码统计工具(CPLineCounter),通过C扩展接口重写核心算法加以优化,并与网上常见的统计工具做对 ...
- Python实现C代码统计工具(四)
目录 Python实现C代码统计工具(四) 标签: Python 计时 持久化 声明 运行测试环境 一. 自定义计时函数 1.1 整个程序计时 1.2 代码片段计时 1.3 单条语句计时 二. 性能优 ...
随机推荐
- 将DataFrame赋值为可变变量在spark中多次赋值后运行速度减慢的问题
该问题先标记上,之后有空了研究原因. 在var dataframe后将dataframe作为参数输入某方法,将结果重新赋予该dataframe,会导致spark运行显著减慢速度.暂时不知道原因,之后研 ...
- Python在Linux下编译安装报错:Makefile:1141:install
正常情况下执行:./configuremake && make install可以直接安装python,但是在在更新了乌版图后居然报错了!!!检查了一圈,发现乌版图安装了python3 ...
- 分享一份软件测试项目实战(web+app+h5+小程序)
大家好,我是谭叔. 本次,谭叔再度出马,给大家找了一个非常适合练手的软件测试项目,此项目涵盖web端.app端.h5端.小程序端,可以说非常之全面. 缘起 在这之前,谭叔已经推出了九套实战教程. 但是 ...
- Scrum Meeting 16
第16次例会报告 日期:2021年06月11日 会议主要内容概述: 最后一次例会 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下记录仅为保证公开性: 组员 负责 ...
- Scrum Meeting 0531
零.说明 日期:2021-5-31 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成后端管 ...
- Sharding-JDBC自定义复合分片算法
Sharding-JDBC自定义复合分片算法 一.背景 二.需求 1.对于客户端操作而言 2.对于运营端操作而言 三.分片算法 1.客户id和订单id的生成规则 2. 确定数据落在那个表中 3.举例说 ...
- 将manjaro作为主力开发系统,我遇到了哪些坑。
首先遇到的问题就是企业微信. 最开始几天,我直接去安装企业微信和微信,安装全都报错了. 无奈之下,只好安装了virtual box,装了一个win7,可以正常使用微信,企业微信,最开始蛋疼的地方是,企 ...
- stm32学习笔记之串口通信
在基础实验成功的基础上,对串口的调试方法进行实践.硬件代码顺利完成之后,对日后调试需要用到的printf重定义进行调试,固定在自己的库函数中. b) 初始化函数定义: void USART_Confi ...
- 【Azure 应用服务】App Service for Linux 中实现 WebSocket 功能 (Python SocketIO)
问题描述 使用 python websockets 模块作为Socket的服务端,发布到App Service for Linux环境后,发现Docker Container无法启动.错误消息为: 2 ...
- js判断是否是同一域名
可以判断自己的网页是否是嵌入别的网页中 /** * 是否相同域名 * @returns {boolean} * @constructor */ function SameDomain() { try ...