这里没有软件测试的泛泛理论,只有博主的最佳实践。 博主的研究方向为静态分析和性能测试,致力于各种测试工具的引入、评估和开发。 本博的测试文章均为作者原创,转载请务必注明出处。

c++test对隔离的单个文件做单元测试

上一篇 / 下一篇  2008-07-03 15:49:45 / 个人分类:C++test

有好一阵子没有再研究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的存在了。

呵呵,今天的实践成功!


TAG:

引用 删除 xiaoler   /   2010-08-16 17:51:05
多谢楼主总结,推荐个C++test经验分享博客:http://www.mytestlife.com/post/c++test.html
引用 删除 xiaoler   /   2010-08-16 17:48:46
5
 

评分:0

我来说两句

Open Toolbar