原文链接:http://blog.yeyuzhen.cn/?p=203
脑补链接:什么是CMake? 什么是代码覆盖率测试? 什么是 Gcov?
最近不怎么顺利的面试经历,让我觉得自己其实是一个2B程序员。应该是懒的原因,涉及到某技术的实现原理啥的,就觉得很烦人。能用就好,何必执着?所以,一个技术问题下来,都是“晚节不保”。自己更关心的是诸如“如何细粒度化任务,以提高开发效率?”、“如何实践代码覆盖率测试,提高程序的鲁棒性?”这类问题。唉~貌似逼格(项目经理)和现实(程序员)存在不小的差距。
日常开发中,我就很注重测试的环节——功能测试、性能测试。我常和组员说,“代码写的不好可以慢慢学,但是测试一定要用心,程序是一点点测出来的”,“能测出来的问题,不算Bug”。但是经过长期的“感性”测试,不免问自己,“测这些用例就OK了?”、“这块代码有没有问题?”、“测试要如何度量?”。后来了解到“代码覆盖率测试”这么个好东西,可以初步解决测试度量的问题。
完整演示项目Github地址:CMakeGcovSupport
初始项目目录结构:
CMakeGcovSupport
├── CMakeLists.txt
├── bin
├── build
├── include
│ └── name.h
├── libgreeting
│ ├── CMakeLists.txt
│ ├── include
│ │ └── greeting.h
│ └── src
│ ├── CMakeLists.txt
│ ├── greeting.cpp
│ └── yelp.cpp
└── src
├── CMakeGcovSupport.cpp
├── CMakeLists.txt
└── name.cpp
示例程序是个很简单的输出一行问候语的程序。为了演示复杂目录结构下CMake集成Gcov的方法,故意将输出问候语的函数单独放到了 libgreeting 静态库中。执行如下编译命令:
$ cd CMakeGcovSupport $ mkdir build $ cd build $ cmake -DENABLE_COVERAGE=ON .. $ gmake all
执行 CMake 外部编译之后,CMake 在 build 目录内为我们生成了 .gcno 文件:
CMakeGcovSupport
├── CMakeLists.txt
├── bin
│ └── CMakeGcovSupport
├── build
│ ├── ......
│ ├── libgreeting
│ │ ├── ......
│ │ └── src
│ │ ├── CMakeFiles
│ │ │ ├── ......
│ │ │ ├── greeting.dir
│ │ │ │ ├── ......
│ │ │ │ ├── greeting.cpp.gcno
│ │ │ │ ├── greeting.cpp.o
│ │ │ │ ├── ......
│ │ │ │ ├── yelp.cpp.gcno
│ │ │ │ └── yelp.cpp.o
│ │ │ └── ......
│ │ └── ......
│ └── src
│ ├── CMakeFiles
│ │ ├── ......
│ │ ├── CMakeGcovSupport.dir
│ │ │ ├── CMakeGcovSupport.cpp.gcno
│ │ │ ├── CMakeGcovSupport.cpp.o
│ │ │ ├── ......
│ │ │ ├── name.cpp.gcno
│ │ │ ├── name.cpp.o
│ │ │ └── ......
│ │ └── progress.marks
│ └── ......
├── include
├── libgreeting
└── src
为了避免接下来执行程序过程中,未覆盖的源码文件的覆盖率信息丢失,我们需要对覆盖率信息进行初始化操作:
$ cd CMakeGcovSupport $ lcov -d build -z $ lcov -d build -b . --no-external --initial -c -o CMakeGcovSupportInitialCoverage.info
然后我们执行 bin 中的 CMakeGcovSupport, main() 函数中将会调用 Greeting() 和 Name() 函数,而不会调用到 Yelp() 函数。
$ cd CMakeGcovSupport $ cd bin $ ./CMakeGcovSupport $ Hello, gcov.
这时,我们去 .gcno 所在目录,会看到有同名的 .gcda 覆盖率数据文件生成了。执行以下命令,生成覆盖率测试报告:
$ cd CMakeGcovSupport $ lcov -d build -b . --no-external -c -o CMakeGcovSupportCoverage.info $ genhtml -o CMakeGcovSupportCoverageReport --prefix=`pwd` CMakeGcovSupportInitialCoverage.info CMakeGcovSupportCoverage.info
用浏览器打开 CMakeGcovSupportCoverageReport 目录中的 index.html 查看覆盖率报告(Mac + Lcov1.10):
Linux + Lcov1.11覆盖率结果(不会误包含外部头文件覆盖率信息):
以上就是CMake项目初步集成 Gcov/Lcov 的方式。但是,还未深度集成到 CMake 编译过程中,而且覆盖率报告还存在一些瑕疵。下一步计划解决应用“--no-external”选项之后依旧会包含外部头文件覆盖率信息的问题,以及不显示头文件覆盖率信息的问题。最终深度集成 CMake 的效果希望是自定义如下命令:
$ gmake InitialCoverage # 初始化覆盖率信息命令 $ gmake ReportCoverage # 生成覆盖率测试报告命令
[1] 测试覆盖(率)到底有什么用?
[2] Linux 下 C/C++ 项目代码覆盖率的产生方法
[5] 使用gcov,lcov,genhtml进行代码覆盖率测试
[6] 关于C++ code coverage tool 的研究(1)
[7] 关于C++ code coverage tool 的研究(2)—GCOV 实现原理
[8] 关于C++ code coverage tool 的研究(3)—gcov使用实例
编辑历史:
V1.1,增加 Linux + Lcov1.11 下覆盖率报告截图,@2014-11-09
V1.0,初稿,@2014-11-08
文章浏览阅读873次,点赞19次,收藏28次。后端使用会简单很多,可以看看在第五个大标题上。1. 以下所有问题均基于uniapp开发微信小程序。2. 所使用的工具版本为:1、微信开发者工具:稳定版2、uniapp工具:HBuilder X 3.99;3、后端程序语言:java;
文章浏览阅读8.5k次,点赞5次,收藏14次。XML文件(使用FileStorage类)使用OpenCV时不仅要保存影像结果,往往也需要保存中间的矩阵结果,而OpenCV的imwrite函数只支持CV8U类型的数据(使用OpenCV保存其他类型Mat的时候,程序不会报错,但是无法生成结果文件),因此会给工作带来很多不便。OpenCV在2.0以后的版本中提供了FileStorage类,供用户直接使用,保存为XML/YAML文件。保存XML保存示例_opencv保存灰度值到csv
文章浏览阅读5.8k次。下面就是如何在cywin上安装openssl:_cygwin 安装--enable-openssl
文章浏览阅读5.1k次。本来是想将正式数据库通过navicat for mysql复制到本地的虚拟机上的mysql,结果总是只复制了一部分表就复制不了了,到后面索性连通过navicat for mysql打开数据库都打开不了了然后想着重启linux上的mysql:重启报错如下:查看mysql错误日志:查看报错的内容_navicat数据传输不动了
文章浏览阅读1.8w次,点赞11次,收藏77次。一般来说,我们学习Centos都在VMware Workstation下进行,用这种方法安装Centos很容易在一台机器上建立你自己的网络,这样方便你的学习。如何在VMware Workstation下安装你的Centos在此就不复述了,你可以很容易找到安装方法,下面的内容都安排在上述环境下进行。将你的Centos虚拟机连上Internet有两种方式:对于网卡来说,我们要做的工作就是使用DHCP还是static方式配置IP地址。另一个就是配置DNS服务器的IP地址。第一节DHCP方式1.网桥模式联网 首_centos网络配置
文章浏览阅读1.6w次,点赞7次,收藏52次。在串行通信中,数据在1位宽的单条线路上进行传输,一个字节的数据要分为8次,由低位到高位按顺序一位一位的进行传送。串口收发数据的单位:字节 (Byte) '', 1Byte = 8 bits , 串口收发数据格式一般为 :1bit 起始位(一般为0) + 8bits 数据位(一字节) +1bit 校验位(可有可无) + 1bit结束位(一般为1)奇校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为奇数; 偶校验是指每帧数据中,包括数据位和奇偶校验位的全部..._串口数据格式
文章浏览阅读775次。在项目开发过程中,一般app都有意见反馈这样的功能,布局中有很多文本框,布局底部存在一个提交按钮;用户在输入文本的时候,输入框经常被键盘遮挡,不能与键盘显示适配,很是头疼,我在网上找了很多方法,最后总结了一下,可以很好的解决这个问题。解决思路:当键盘显示的时候我们发现布局被键盘遮挡了一部分,这个时候我们根据可见区域的高度动态的去修改布局的高度以达到适配的效果。注意:内容布局最外层需要用Sc..._activity 6 文字遮挡
文章浏览阅读56次。每个类,我们的编译器都知道数据成员的偏移,函数代码段的位置,运行的时候,我们的C#系统会为我们每个类----》描述实例(数据内存);Type类型,Type实例,属于System名字空间;Type:一些类型的描述信息int type;//类型//这个字段的内存大小;int offset;//在内存对象中的内存偏移int type;//静态的还是,普通的;int offset;//函数代码指令的地址;l/当前类的实例的内存大小;//当前这个类的数据成员;
文章浏览阅读10w+次,点赞157次,收藏720次。电流流向: NPN PNP它最主要的功能是电流 放大和开关作用。Emitter,Base,CollectorNPN管,集电极电流IC和基极电流IB流入管子。发射极电流IE流出管子。且IC+IB=IE。 Icb+Ibe=Ice 即βIbe+Ibe=IcePNP管,集电极电流IC和基极电流IB流出管子。发射极电流IE流入管子。同样IC+IB=IE。无论管子..._pnp型3极管
文章浏览阅读1.8k次。在几年前,并没有真正意义上的前端开发。随着网络技术的发展,网站和 Web 应用程序变得越来越复杂,前端部分的工作独立出来逐渐成为现在的前端开发。如今,我们可以看到越来越多的公司在招聘前端开发岗位。前端开发并不容易,除了掌握基本的 HTML、CSS 和Javascript 之外,因为不同版本的浏览器和平台,你需要知道如何做一个跨浏览器的网站。而最新的发展趋势——响应式设计,它不仅_前端是否有类似liteflow的框架
文章浏览阅读969次。其次,当时的电子技术工艺水平比较落后,主要的元件是电子管或晶体管,利用它们制作的神经网络体积庞大,价格昂贵,要制作在规模上与真实的神经网络相似是完全不可能的;(3)非线性映射能力当对系统对于设计人员来说,很透彻或者很清楚时,则一般利用数值分析,偏微分方程等数学工具建立精确的数学模型,但当对系统很复杂,或者系统未知,系统信息量很少时,建立精确的数学模型很困难时,神经网络的非线性映射能力则表现出优势,因为它不需要对系统进行透彻的了解,但是同时能达到输入与输出的映射关系,这就大大简化设计的难度。..._w.s.mcculloch
文章浏览阅读325次。2020-8-9 mark工具推荐推荐一款轻量简洁的Markdown编辑器——Typora,好用到爆。之前用的是Atom+插件(markdown-preview-enhanced, markdown-writer),也挺不错的,但是就是功能太多,界面不够简洁。目前的使用方式是Typora + Atom + CSDN结合使用:Typora用来打字和产出Atom结合插件进行文件的管理CSDN将写好的文章或者笔记进行发布接下来说说,Typora的几点好处。支持Markdown的所有语._typora笔记成果