c - 具有静态变量的 C 函数中的单元测试

标签 c unit-testing static

让以下 C 函数

void underTest(){
  static int i = 0;
  i++;
  if (i > 50*1000*1000) {
    /* I want to test this */
  }
}

我需要对该函数进行单元测试,包括 if block 。在我可以预见的解决方案中,有:

  • 尽一切努力使用预期的接口(interface)来达到所有情况(包括在该示例中多次调用该函数),这可能是一个真正的麻烦
  • 测试编译后读取内存映射以从其内存地址访问i
    • 修改目标代码
    • 或者更改源代码并希望重新编译具有确定性
  • 忘记测试并使用同行评审,考虑到成本,这并不是一个好的解决方案

注意:由于这是嵌入飞机的代码,对测试代表性要求非常高,任何形式的代码修改(包括#define static extern伎俩)是 Not Acceptable 。此外,修改代码以消除问题(例如使 i 全局化)将花费大量资金。

有人知道解决这种恼人情况的窍门吗?不管它有多脏,只要源代码不受影响。

最佳答案

如果修改目标代码意味着修改生成的.elf,那么这将不起作用,因为i是由加载程序在启动时分配的 em>...(肯定是我误解了,只是想澄清一下)。

加载后,您需要找出 .bss 部分中 i 变量的地址并直接访问它。您没有说明您正在使用哪个编译器,但是,例如,AFAIK gcc 具有扩展功能,可以在源代码级别和链接时指定变量/符号的地址,您的?

另一个解决方案是通过链接器脚本将 .bss 放置在已知地址。

关于c - 具有静态变量的 C 函数中的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49387056/

相关文章:

java - 反射性地获取项目中的所有包?

java - 测试扩展另一个类的抽象类

java - 如何使用 Mockito 模拟方法调用

c# - 如何在静态类中创建通用静态字典

java - 静态 Util 方法与实例 Util 方法——哪个更好?

java - 为什么可以在声明静态变量之前对其进行初始化

c - 功能指针,设计

C - scanf 无符号字符

c - 如何在 c 中将字符串转换为字符数组(或)如何提取单个 char 形式的字符串?

python - 当窗口/对话框为 "presented"时发出 gtk+ 信号