我在测试方面很新,所以请让我知道,如果我在任何时候完全错误的方向进行。话虽如此,假设我想测试下面的函数foo。如何测试输出依赖于另一个函数的函数?
int foo(int i) {
//Lots of code here
i = bar();
//Some more changes to i happen here, conditional on what bar returned
return i;
}
在这个例子中,foo和bar都是自己编写的函数,我已经测试过了。
由于foo的输出是以bar的输出为条件的,我假设为了测试foo,我需要创建一个模拟条。为了做到这一点,并假设bar的定义保存在与foo不同的源文件中,我可以创建一个新的源文件,包含该文件,而不是发现bar的实际定义的源文件,并将模拟在该文件中的酒吧。
int bar(void) {
return HARD_CODED_VALUE;
}
然而,存在2个问题与该方法:
1),会发生什么,如果杆返回多个值(例如作为错误代码或实际值)和I需要确保FOO正确地反应对于每种可能性?我无法为栏创建多个定义。我曾经想过的一个想法是在bar中创建一个静态int,然后每次调用bar时都会增加它。然后我只是有一个条件这个int,多次调用栏,从而返回多个值。不过,我不确定是否引入更复杂的逻辑成模拟功能是很好的做法,或者有更好的方式来实现这一点:如果酒吧是相同的源文件中foo
int bar(void) {
static int i = 0;
i++;
if(i == 1) {
return HARD_CODED_VALUE_1
}
else if(i == 2) {
return HARD_CODED_VALUE_2
}
else {
fprintf(stderr, "You called bar too many times\n");
exit(1);
}
}
2)会发生什么?我不能重新定义酒吧,也不能在不改变我的源代码的情况下分开foo和bar,这将是一个真正的痛苦。
foo函数可以在没有模拟条功能的情况下进行单元测试吗?如果是这样,只需创建一个涵盖foo和bar的组合功能的单元测试。 – 2011-02-05 12:46:50