• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

干货|使用luacov统计lua代码覆盖率

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

点击上方“中兴开发者社区”,关注我们

每天读一篇一线开发者原创好文

【摘要】

 LuaCov是一个针对 Lua 脚本进行代码覆盖率分析的开源工具,它完全使用lua脚本编写,安装方便,小巧易用,非常适合做lua代码的覆盖率分析。

当Lua脚本在加载了luacov模块的情况下运行时,它会生成一个统计(stats)文件。当执行完统计后,需要使用luacov命令处理统计文件,最终生成一个报告文件。该报告文件清晰的展示了lua代码每行的执行次数,及整个文件的覆盖率情况。

本文关注的重点在于,如何使用开源工具luacov进行C++工程下的lua代码覆盖率分析,并对相关方法及经验做了一些简单的总结。


【关键词】

luacov、lua代码覆盖率

1 背景

目前项目中使用lua来做配置数据的约束校验,但并没有提供对lua代码的覆盖率分析,因此为更好的编写lua代码,保证编码质量,决定引入对lua代码的覆盖率分析。经过比较分析,最终决定引入完全,安装方便,小巧易用luacov来进行此项工作。


2 LuaCov介绍

LuaCov是一个针对 Lua 脚本进行代码覆盖率分析的开源工具,它完全使用lua脚本编写,安装方便,小巧易用,仅仅依赖lua可执行程序,没有其他的依赖,因此他非常适合做lua代码的覆盖率分析。


2.1 LuaCov安装

 1.下载luacov。下载路径:https://github.com/keplerproject/luacov

 2.进入下载后的目录,到运行make install命令

参考其makefile文件可知,运行makeinstall命令后将会拷贝luacov的相关lua脚本到系统默认的luapath下(安装lua可执行程序后就可以看到此目录)。如果不想安装到此目录,自己也可以写自己的拷贝命令,后文在项目实践中也是这么做的。

2.2 LuaCov配置

    LuaCov提供默认配置,其默认配置在luacov/default.lua中,同时,支持用户自己配置相关参数,下面对其默认默认配置的一些参数进行下说明。

2.3 LuaCov使用

通常情况下,LuaCov使用也比较简单,只需简单的两步即可。


2.3.1 运行lua脚本,收集覆盖率数据。

为了使用luacov收集数据,在运行lua的时候需要加载luacov模块。Luacov支持两种加载方式,一种是在命令行中无侵入的添加运行参数,一种是修改lua脚本文件,在文件的第一行显示的添加require("luacov")来加载。下面以直接使用lua命令运行test.lua为例进行说明:

命令为: lua -lluacov test.lua

当运行完此命令后,luacov将在运行目录下生成覆盖率数据文件luacov.stats.out

2.3.2 运行luacov命令,生成覆盖率报告文件

     当执行完lua脚本后,便可以在原来运行目录使用luacov命令行来生成报告文件,运行命令后luacov将分析luacov.stats.out,并生成luacov.report.out。

     命令:lua luacov

     生成的报告格式为如下,其中每行前面的数值表示了该行运行的次数,如果为0则表示未执行,即没有覆盖:

3 LuaCov项目中应用

3.1 使用前分析

前面所述为lua脚本为独立文件时收集覆盖率的情况,但在目前的项目中,lua是集成在C++工程中的,且lua脚本也是通过C++代码创建的lua虚拟机来运行的,因此上述方式将不再适用。经在GitHub上沟通,了解到,luacov同样可以支持此种情况,但需要做如下调整。

1. 在运行脚本前需要调用runner模块下的init()函数,在停止前需要调用shutdown函数。相当于GMOCK单元测试的setup和teardown。

2. 需要将原来luaL_dostring()函数修改成luaL_loadbuffer()或者luaL_dofile(),这是因为后面两个函数均可以携带文件名,而生成覆盖率报告时正是读取文件路径对应的内容来处理的。

3. 如果使用luaL_loadbuffer(),需要修改luacov的配置文件,将codefromstrings设置为true。


3.2 现有工程修改

3.2.1 脚本加载存储函数的修改

目前项目是读取yang文件中定义的lua标签来获取相关脚本的,且保存时只保存了脚本内容,并未保存脚本文件的路径。但对于luacov需要在生成报表时读取路径下的文件,因此就需要将文件路径也存储下来。

修改方式为:

1.1 定义一个结构存储脚本内容和脚本路径

1.2修改存储和获取脚本的接口

 1.3 修改luaVm执行脚本的函数,将luaL_dostring改为luaL_loadbuff(),并将存储的文件名传给luaL_loadbuff。


3.2.2 增加luacov初始化和关闭的入口

1.1 增加一个yang文件,用来定义执行初始化的lua脚本。

该文件定义依赖现有lua执行的框架,表示当ManagedElement的userlable修改时触发luaCovInitShutDown.lua脚本。

1.2 增加初始化脚本

4 CI集成

为方便项目CI的集成,特写了两个shell脚本,在做覆盖率测试时直接调用这两个脚本即可。

5. 题外扩展

目前项目的思路是在执行FT过程中统计代码覆盖率,在研究luacov用法的过程中发现lua也有相关的UT框架(busted:https://github.com/Olivine-Labs/busted.git),并且此框架已经集成了luacov,且支持lua 接口的mock


6.推广建议

需要参考使用


7.参考资料

https://github.com/LuaDist

https://github.com/keplerproject/luacov

https://github.com/keplerproject/luacov/issues/53

http://wiki.jikexueyuan.com/project/openresty/test/coverage.html


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua基础(1)--初识lua发布时间:2022-07-22
下一篇:
Lua文件处理发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap