摘要:如果能够让代码在编译的时候,自动完成白盒测试,这不是天方夜谭。
白盒测试也叫开发者测试,是对特定代码函数或模块所进行的功能测试。当前主流的白盒测试方法是:先针对仿真或者生产环境编译出可执行文件,然后运行得到测试结果。这种方法有3个问题:
- 可能需要专门针对白盒测试额外做一次构建。这是因为仿真环境和实际运行环境可能是不同的硬件平台,而且白盒测试需要额外链接一些库(比如GTest),构建方式和发布版本不一样。这一方面让构建需要加入额外动作,另一方面也不容易保证两套构建工程的一致性,难以确保开发人员每次发布软件前都通过了白盒测试。
- 为了运行白盒测试,必须要搭建运行环境。有些执行机环境资源不太容易获得(比如嵌入式单板),这就给开发人员随时随地开展测试带来了障碍。
- 当代码发生修改时,需要人为判断执行哪一部分白盒测试用例。当依赖关系复杂时,这种影响关系分析并不容易。
如果能够让代码在编译的时候,自动完成白盒测试,则上面3个问题将都不存在。当测试用例没有通过时,我们希望编译失败。这看起来像是天方夜谭,但随着C++语言的编译期计算功能越来越成熟,对于相当一部分代码来说它已不再是幻想。
一个简单的例子
C++11开始提供了强大的编译期计算工具:constexpr。在后续的C++14/17/20等版本中,constexpr的功能被不断的扩展,被称为“病毒式扩张”的C++特性[1]。这里先看一个获取字符串长度的constexpr函数(本文中代码都在C++17环境下编译运行):
template<typename T, auto E = '