在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
点击上方“中兴开发者社区”,关注我们 每天读一篇一线开发者原创好文 【摘要】 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 |
请发表评论