作者 | vivo 互联网服务器团队 - Li Qingxin
C/C++ 开发效率一直被业内开发人员诟病,单元测试开发效率也是如此,以至于开发人员不愿花时间来写单元测试。那么我们是不是可以通过改善编写单元测试的效率来提升项目的测试用例覆盖率?文章源自玩技e族-https://www.playezu.com/189835.html
本文主要介绍如何利用GCC插件来实现提升C/C++开发者的单元效率工具解决方案,希望对大家在提升单元测试效率上有所启发。文章源自玩技e族-https://www.playezu.com/189835.html
一、动机
文章源自玩技e族-https://www.playezu.com/189835.html
上图展示了C/C++单元测试的基本流程,在日常开发过程中写单元测试是一项比较大工程量的事情,C/C++ 目前单元测试代码都需要自己手动写,而且对于一些私有方法打桩就更加麻烦。文章源自玩技e族-https://www.playezu.com/189835.html
目前业内无开源的自动化测试框架或者工具,倒是有一些商业的自动测试工具,下图展示了我们自动化测试工具及单元测试库:文章源自玩技e族-https://www.playezu.com/189835.html
文章源自玩技e族-https://www.playezu.com/189835.html
即使开源界有gtest等测试库的支持,我们仍然需要编写大量的单元测试用例代码。对于一些private、protected的类方法,编写单元测试用例的效率就更低,需要手动打桩(mock)。同时我们分析测试用例发现,存在很多边界的用例,它们基本上都是很固定或者有一定模式,比如int 最大最小值等。文章源自玩技e族-https://www.playezu.com/189835.html
如何改善编写单元测试的效率,提升C/C++同学开发效率以及程序质量?我们可以通过提取源文件中的函数、类等信息,然后生成对应的单元测试用例。自动生成用例时需要依赖函数的声明、类的声明等信息,那么我们应该如何获取这些信息呢?文章源自玩技e族-https://www.playezu.com/189835.html
例如:如下的函数定义:文章源自玩技e族-https://www.playezu.com/189835.html
文章源自玩技e族-https://www.playezu.com/189835.html
我们希望能够从上面的函数定义中得到函数的返回值类型、函数名称、函数参数类型、函数作用域。通常我们可以通过以下几种方式得到:
1.1 方法1:使用正则表达式
无奈C/C++ 格式比较复杂能够虽然能够使用多种组合来获取对应的函数声明等信息:
那么就需要写一系列的正则表达式:
- 提取函数名称、参数名:[z-aA-Z_][0-9]+
- 提取函数返回值:^[a-zA-Z_]
关键词提取出来了,但是他有一个很大的问题:怎么判断文件中书写的代码是符合C/C++语法描述呢?