单元测试功能宏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单元测试功能宏相关的知识,希望对你有一定的参考价值。
我正在编写一些函数宏的单元测试,它们只是一些函数调用的包装器,并且有一些小的管理。
我整个早上都在写测试,而且我开始变得乏味,所以这可能仅仅是隧道视觉的情况,但是:
是否有一个有效的案例要进行宏观扩展的单元测试?我的意思是检查是否为函数宏的参数的各种源代码形式生成了正确的函数行为。例如,函数参数可以采用以下形式的源代码形式:
- 文字
- 变量
- 运算符表达式
- 结构成员访问
- 指向结构的成员访问
- 指针解除引用
- 数组索引
- 功能调用
- 宏观扩张
- (随意指出我错过的任何事情)
如果宏没有正确扩展,那么代码通常甚至不会编译。那么,如果参数是float
文字或float
变量,或函数调用的结果,那么在不同的单元测试中是否还有任何明智的点?
扩展应该是单元测试的一部分吗?
正如我在comment中所说:
使用像
value & 1
这样的表达式可以揭示宏是粗心的,但代码检查也可以做到这一点。我认为通过全面的测试是过度的;乏味的是给你一个相关的警告。
还有一种额外的检查模式可能是相关的,即副作用,例如:x++ + ++y
作为参数。如果对宏的参数进行多次评估,则副作用可能会被扰乱,或至少重复。作为参数的I / O函数(getchar()
或printf("Hello World
")
)也可能揭示参数的错误管理。
它还部分取决于您要应用于宏的规则。但是,如果它们应该看起来和行为类似于函数调用,它们应该只评估一次参数(但它们应该评估每个参数 - 如果宏根本不评估参数,那么副作用就不会应该发生的事情(如果宏真的是一个函数会发生)。
另外,不要低估inline
功能的价值。
根据@Jonathan Leffler的回答中的评论和一些观点,我得出结论,这是在功能测试中更好的测试,最好是使用模糊测试器。
这样,使用几个自动化脚本,模糊器可以在函数宏中抛出数十个参数,并记录那些不编译,生成编译器警告或编译和运行的参数,但产生不正确的结果。
由于模糊测试不应该快速运行(比如单元测试),所以将它添加到模糊套件并让它在周末运行是没有问题的。
以上是关于单元测试功能宏的主要内容,如果未能解决你的问题,请参考以下文章