有好一阵子没有再研究c++test了,杂事比较多,老是被打断。
还好今天终于又有一点时间,来继续之前没有做完的一些实践:c++test在run unit tests时是否有考虑各个单元之间的调用关系?如果考虑了,是否可以对被测的单个文件隔离执行“纯”的单元测试?
先编写简单的示例代码,两个源文件 demo.c和demo2.c:
demo.c
extern int add(int a, int b);
extern int dec(int a, int b);
extern int multi(int a, int b);
extern int divide(int a, int b);
int cal(int a, int b, int c)
{
int result = 0;
switch(c)
{
case 1:
result = add(a,b);
break;
case 2:
result = dec(a,b);
break;
case 3:
result = multi(a, b);
break;
case 4:
result = divide(a, b);
break;
default:
result = -999;
}
return result;
}
void tMain()
{
int t1, t2, t3, t4, t5;
t1 = cal(10, 10, 1);
t2 = cal(10, 10, 2);
t3 = cal(10, 10, 3);
t4 = cal(10, 10, 4);
//t5 = cal(1, 2, 9);
}
demo2.c
int add(int a, int b)
{
return a+b;
}
int dec(int a, int b)
{
return a-b;
}
int multi(int a, int b)
{
return a*b;
}
int divide(int a ,int b)
{
return a/b;
}
1 先实践c++test在run test tests时是否考虑各单元之间的调用关系
很简单,手动添加TestSuites,并添加测试用例,如下
void tsmain_tsMain()
{
tMain();
}
然后run unit tests,观察测试覆盖率的情况,就知道c++test是否调用其他单元了。测试覆盖率结果如下:
很显然,c++test考虑了各函数之间的调用关系。所以demo2.c覆盖率达到了100%。
2 如何对被测的单个文件隔离执行“纯”的单元测试?
所谓的单元测试,是针对程序中最小的单元所做的测试。如果像1中那样考虑调用关系那样去做,是不是有点“集成测试”的意思呢?所以这里要讨论的是c++test能否把被测文件隔离出来,然后执行“纯”的单元测试。
答案当然是肯定的,毕竟Parasoft在这个领域已经有20年的经验了。这里需要用到两个选项。
第一步:我们在build-in的run unit tests基础之上define一个自己的configurations,称之为My Run unit tests,所做的修改是:Execution的Symbols下,取消选择“use symbols from addtional project files”,增加选中“report unresolved symbols before linking”,然后保存即可。
选中demo.c后(注意只是选择demo.c,而不是整个project或者整个代码文件夹),执行My Run unit tests,几秒钟的等待后提示错误,错误信息如下:
Unable to locate definitions for the following functions:
int divide(int, int)
int multi(int, int)
int add(int, int)
int dec(int, int)
Unit Test execution terminated - please provide missing definitions and run analysis again.
哈哈,此时c++test不会再去其他文件找这些函数了,所以提示这些函数没有定义。要使测试进行下去,就需要对demo.c打桩,这里我选择自动打桩。
第二步:对demo.c打桩,注意一下,自动打桩同样不能使用build-in的Generate Stubs,同样在它的基础之上user-define一个configurations。所做的修改是同样的两项,取消一个选择,增加一个选择即可。
定制完成后,选择demo.c然后执行My Generate Stubs,完成后可以看到自动生成的桩文件。
最后再选中demo.c,执行My run unit tests,结果如下:
可以看到,此时只有demo.c的覆盖率,c++test已经不知道demo2的存在了。
呵呵,今天的实践成功!