使用静态变量在C函数中进行单元测试

时间:2018-03-20 14:33:59

标签: c unit-testing static

让以下C函数

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

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

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

注意:因为这是嵌入飞机的代码,对测试代表性有很高的要求,任何形式的代码修改(包括#define static extern技巧)都是不可接受的。此外,修改代码以消除问题(例如,使i全局化)将花费成本。

有人知道这种烦人的情况吗?无论它多么脏,只要源代码不受影响。

2 个答案:

答案 0 :(得分:1)

如果通过修改对象代码意味着修改生成的.elf,那么由于启动时的加载程序分配了i,这将无效。 ..(当然我误解了它,只想澄清它)。

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

另一个解决方案是通过链接描述文件将.bss放在已知地址。

答案 1 :(得分:0)

重构代码以使其可测试。 变换

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

void alsoUnderTest(){
    /* I want to test this */
}

void underTest(){
  static int i = 0;
  i++;
  if (i > 50*1000*1000) {
    alsoUnderTest()
  }
}