Mid Station

C++ Unit Test and Coverage

三月份了,广州的天气竟然变得规律起来。往往是今天下雨,明天天晴,回南天与冷空气轮番交战。
身处忝列CBD地段的校区,脚踩满地的落叶,抬头却也能看见几棵盛开的洋紫荆。

开学前读了两本书,一本叫Clean Code,另一本也是C字开头,叫C++ Primer。读前者主要是为了完成某课的课程论文;至于后者,说起来也惭愧,C++是我最早想要学习的编程语言。早在十年前,我就稀里糊涂买过一本C++ Primer Plus来看。至于为什么早年还在看Plus,现在反而不看带Plus的了,以下是一篇截取自Quora的回答:

C++ Primer & C++ Primer Plus
十年过去,我用C++编程水平也就勉强够用,往往是短短几行代码编译器都能弹一堆警告。越发觉得回炉再造之必要性。回想大学也选修过C++的课,但是教授的思路其实还是把C++当成是C语言的延伸,无非就是在C语言基础上加入了一点类和继承的内容。而今却越发觉得两者是完全不同的语言,C++的精髓应该在于STL,然而课上却偏偏漏掉这部分内容,所以也只好毕业后自己补课了。另一方面也是从漏洞研究的角度来考虑,无论是逆向还是源码审计,起码得对语法和基本库函数足够熟悉,相信导师说磨刀不误砍柴工也是这个道理。

Clean Code & gtest

此书中文译名《代码整洁之道》,为了完成一篇课程论文,我花了两周时间从头读完,期间也动手把其中一个重构的示例跟从作者的思路复现了一遍。书中花了挺多笔墨来鼓吹采用测试驱动开发的模式,思路是个好思路,但是想在国内推广使用还是感觉有些困难,在开发时间极其有限的情况下,也没谁敢先写测试再写产品代码,要是在开发人员能够扎扎实实把每个项目的单元测试做好就很不错了。

谈到单元测试,Java有总所周知的Junit,那么C++呢,查了一下Google家的gtest评价不错,那么就试着用到C++ Primer 一个文本查询的例子上面,用半天学了一下Cmake的用法,再用半天配到项目里面写了一组测试用例,配置好了以后测试用例写起来还是很舒服的。

1
2
3
4
5
6
TEST(AndQuery, shouldReturnRepresantation)
Query andQuery = Query("foo") & Query("bar");
string rep = andQuery.rep();
string expectedRep = "(foo & bar)";
EXPECT_EQ(rep, expectedRep);
}

随后还顺手做了一个C++项目模板,单元测试没有覆盖率总觉得不带劲,于是又加入了coverage模块,make test一键测试,make coverage一键生成覆盖率报告。模板项目地址:cpp-boilerplate,欢迎★。

以上,就是用来填充一个没有比赛的雨天周末的文字及其副产品。