关于c++的单元测试问题。

viliv715 2012-10-22 04:57:28
公司是用C++结合vc开发的,之前没有专人做过代码的单元测试,只是开发人员之间相互测试,现在要求我规范白盒测试的流程,我也刚毕业没多长时间没什么经验,我看了很长的时间这方面的资料了,包括gtest的框架cppunit的框架之类的测试框架,但是测试的用例也是得自己写的,我有个疑问就是既然是单元测试,没有结合测试,那么每个最小单位类或者函数当时肯定是调试过的,我做单元测试就是用更多的实例进行调试,那么什么情况才算是测试通过,看代码的各种覆盖率吗?而且如果是用上述的俩测试框架来做的话也没有什么覆盖率。还有就是对类的测试有什么方法吗?对函数的测试还比较具体,但是类中声明的很多东西都是之后才定义的,还是说我只要测试他重新定义的那个方法就行了?跪求大神指导
...全文
176 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Coder_Y_Jao 2012-10-23
  • 打赏
  • 举报
回复
你可以看下下面这个链接中的例子
http://www.linuxeden.com/html/sysadmin/20090521/65776.html
viliv715 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:
这个我知道 我比较疑惑的是,比如说if(a>5)a是unsigned char型,那么我需要测试0、4、5、6、255让他们全部通过还是说测试两个一个T一个F就够了?


不需要全部测试,即便是所谓的覆盖率也是覆盖所有分支,而不可能覆盖所有数据。
以一个取某个月最大的天数的函数unsigned int foo(unsigned int year,unsigne……
[/Quote]
您说的那个例子我看明白了了,但是之后对类的test还是不太明白,能不能麻烦您给我一个简单的例子看一下?
Coder_Y_Jao 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
这个我知道 我比较疑惑的是,比如说if(a>5)a是unsigned char型,那么我需要测试0、4、5、6、255让他们全部通过还是说测试两个一个T一个F就够了?
[/Quote]

不需要全部测试,即便是所谓的覆盖率也是覆盖所有分支,而不可能覆盖所有数据。
以一个取某个月最大的天数的函数unsigned int foo(unsigned int year,unsigned int month)为例,可以考虑下面几组用例,如果是指针或者句柄,则需要考虑NULL和无效句柄等,即传入相应的数据则得出预期的结果。传入的数据不必完全覆盖,以可能导致不同的结果为界限。

EXPECT_EQ(29,foo(2012, 2));
EXPECT_EQ(28,foo(2011, 2));
EXPECT_EQ(28,foo(2100, 2));
EXPECT_EQ(29,foo(2000, 2));
EXPECT_EQ(31,foo(2011, 3));
EXPECT_EQ(30,foo(2011, 4));
EXPECT_EQ(31,foo(2011, 8));
EXPECT_EQ(30,foo(2011, 9));
EXPECT_EQ(0,foo(2011, 13));


类的test你就像调用者一样调用就好了,具体的判定点还是在方法上,由于一般成员函数和对象及其成员变量有“依赖性”,所以类的test的用例可能会比较多,
viliv715 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

后于开发的单元测试大多是show起来更好看的敷衍了事的行为。
ut应当是我需要什么,它就要提供什么,而不是它提供什么我就test什么,这样ut自然知道怎么写。
敏捷也是强调TDD的
-------------------------------------------
已gtest为例,可以形成相应的ut结果,是否通过看结果就知道
C/C++ code

#include <gtes……
[/Quote]
这个我知道 我比较疑惑的是,比如说if(a>5)a是unsigned char型,那么我需要测试0、4、5、6、255让他们全部通过还是说测试两个一个T一个F就够了?
Coder_Y_Jao 2012-10-22
  • 打赏
  • 举报
回复
图片贴掉了,补上

Coder_Y_Jao 2012-10-22
  • 打赏
  • 举报
回复
后于开发的单元测试大多是show起来更好看的敷衍了事的行为。
ut应当是我需要什么,它就要提供什么,而不是它提供什么我就test什么,这样ut自然知道怎么写。
敏捷也是强调TDD的
-------------------------------------------
已gtest为例,可以形成相应的ut结果,是否通过看结果就知道

#include <gtest/gtest.h>

int _tmain(int argc, _TCHAR* argv[])
{
// Google Test
testing::InitGoogleTest( &argc, argv );

return RUN_ALL_TESTS();
}
//具体的TEST部分省略

http://img.my.csdn.net/uploads/201210/22/1350897056_5448.PNG

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧