单元测试定位Bug问题求解

dwen20 2010-07-02 05:37:26
使用Cppunit进行单元测试,但是在写测试用例的过程中遇到了麻烦:

描述:
有类A,成员函数有f1和f2,还有成员变量等等,现在要测试函数f1和f2.

条件:
f1和f2是相关联的,无法找到(理论上也没有)一种验证方法可以单独确定这两个函数的逻辑是否正确。

假设情况一:f1的正确性严格依赖f2。那么导致的结果就是cppunit跑出的结果若显示f2失败,那么必然也会导致f1失败,这种情况下我们无法判断是f1存在bug还是f2存在bug,或是都存在bug,唯一能确定的是bug存在f1和f2中;

假设情况二:f1的正确性严格依赖f2,而f2的正确性又严格依赖f1。如果cppunit在f1中失败,必然也使得f2失败,这个时候,我们更无法判断到底是f1存在bug还是f2存在bug,或是都存在bug,唯一能确定的是bug存在f1和f2中。

得出结论,在以上两种情况下,唯一能确定的就是bug肯定存在于由f1和f2组成的这个关系体中,这是一个范围;更极端的情况可能是这个关系体中函数的数量为N,并且两两之间存在依赖关系,那么定位bug的工作就更加艰难。

问题讨论:
1.有没有方法可以在不改变待测试代码的基础上,完成对单个函数的精准定位,而不是范围上的定位?
2.这种待测试代码是否可以在设计上完全避免(个人倾向于无法避免)?如果可以,是否会引进不必要的开销?例如,一个set方法的验证可以通过相应的get方法来验证,但是这个get方法可能是根本不需要的,而是为了迎合测试的顺利而额外添加的(虽然说set的正确性依赖get的正确性,但由于get一般过于简单,bug滋生率近乎零,所以用此例;事实上,如果连get方法都怀疑的话,测试基本就无法进行了,因为没什么验证是可信的)。
3.本人(菜鸟)是在实际中遇到了这种情况,不知道各位是否遇到过,又是如何处理的?

补充:
出于测试的初衷考虑,一般get方法是不用测试的,否则那就是为了测试而测试了(花20%时间足以),而不是出于效率的考虑,当然有个原则是说所有的代码都应该被测试,但开发人员的精力是有限的,如果把80%的时间放在了80%无用的地方,就太不值了,这似乎是个矛盾。。。
其实,本人手头的项目已经运行良久,经过大量的实际运行测试,没出什么问题(有点小自信,嘿嘿),但出于boss的要求,不得不编写单元测试代码,真是无奈,不过恰好借此机会向各位大侠取点经。
...全文
339 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ethan-lee 2010-07-17
  • 打赏
  • 举报
回复
你完全不用考虑各种函数之间的问题~ 采用cpptest 自动化测试工具进行自动生成测试用例 并执行~
推荐 : CPPTest
星级 :5颗星
dwen20 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 enmb 的回复:]
另外两个函数互相调用/依赖本身也不是很好的设计
[/Quote]
这个相互依赖并不是说会相互调用,而且就函数功能上来看,是完全独立的;比如说对一个链表的操作,插入和查询在功能上是完全独立的,这个在设计上也是再合理不过的了。
问题是如果要证明插入操作是成功的,就必须要通过查询到的结果作为依据,也就是插入操作的正确性依赖查询操作的正确性。
dwen20 2010-07-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bigsir 的回复:]
没用过cppunit,不过从程序的角度来说(毕竟单元测试也是个小程序),中断可以提供你所需要的功能
不管是f1还是f2跑,所关联的数据犯错误直接进行中断,抛出。
那么先犯错的肯定是原因。

高手看看,我这么胡说有点道理没有。
[/Quote]

貌似这样就不是自动化了吧,会导致单元测试被强迫地进行人为干预,当然是能够查找Bug的,不过跟CppUnit相违背了
enmb 2010-07-16
  • 打赏
  • 举报
回复
另外两个函数互相调用/依赖本身也不是很好的设计
enmb 2010-07-16
  • 打赏
  • 举报
回复
mock应该可以解决你的问题,解依赖是mock的重要用途
yueer1979 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bigsir 的回复:]
没用过cppunit,不过从程序的角度来说(毕竟单元测试也是个小程序),中断可以提供你所需要的功能
不管是f1还是f2跑,所关联的数据犯错误直接进行中断,抛出。
那么先犯错的肯定是原因。

高手看看,我这么胡说有点道理没有。
[/Quote]
同意
Erorr 2010-07-05
  • 打赏
  • 举报
回复
另外,提供一个小技巧
可以在测试代码中搞个
#define private public
#define protected public
这样就可以修改private的成员了,假如没有类似set接口的时候。
Erorr 2010-07-05
  • 打赏
  • 举报
回复
mock一下不可以吗
搞个静态计数器,第一次调用f2的时候返回一个值,第N次调用的时候返回一个值
单元测试的结果应该是可预测的,所以其中每次调用的返回值也是固定的
这种方法在JUnit里面是框架的一部分
具体问题具体分析吧,每种测试的方法是不同的,不能拿集成测试的思想来搞单元测试
dwen20 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 knowinganddoing 的回复:]
必须指出,大量的实际运行测试不能代替单元测试。
举个例子,汶川地震的时候,移动通讯完全瘫痪,这种情况在实际日常运行中是很难遇到的,但在512的时候就很要命。
但若有相关的……
[/Quote]
是啊,这个我同意,不过我的问题还是没有答案,唉。。。
dwen20 2010-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 erorr 的回复:]
可能会比较麻烦,但是单元测试讲的是覆盖率,把代码都覆盖到了就行了
覆盖不到的,就需要考虑代码的分支是否真的会走到,会用到,还需要修改代码
具体还是看公司的测试策略,多问问同事吧
[/Quote]

同事都没做过,现在不是覆盖率的问题,估计这里没人会关心覆盖率;关键是如何写测试用例的问题,呃,难道就没人遇到过类似的情况吗。。。
bigsir 2010-07-05
  • 打赏
  • 举报
回复
没用过cppunit,不过从程序的角度来说(毕竟单元测试也是个小程序),中断可以提供你所需要的功能
不管是f1还是f2跑,所关联的数据犯错误直接进行中断,抛出。
那么先犯错的肯定是原因。

高手看看,我这么胡说有点道理没有。
Erorr 2010-07-04
  • 打赏
  • 举报
回复
可能会比较麻烦,但是单元测试讲的是覆盖率,把代码都覆盖到了就行了
覆盖不到的,就需要考虑代码的分支是否真的会走到,会用到,还需要修改代码
具体还是看公司的测试策略,多问问同事吧
KnowingAndDoing 2010-07-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 dwen20 的回复:]
其实,本人手头的项目已经运行良久,经过大量的实际运行测试,没出什么问题(有点小自信,嘿嘿),但出于boss的要求,不得不编写单元测试代码,真是无奈,不过恰好借此机会向各位大侠取点经。
[/Quote]
必须指出,大量的实际运行测试不能代替单元测试。
举个例子,汶川地震的时候,移动通讯完全瘫痪,这种情况在实际日常运行中是很难遇到的,但在512的时候就很要命。
但若有相关的性能需求,单元测试(或其他测试)时,这种情况是可以被测出来的。
dwen20 2010-07-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 erorr 的回复:]
简单的策略是,测f1的时候,mock f2的返回值,测f2的时候,mock f1的返回值
当然实现起来也许比较难,甚至要改设计
单元测试要求的是100%的覆盖率,所以get也需要覆盖,这样做的好处是自动化测试或者CI的时候简单的判断是否全覆盖了,如果不是全覆盖,很难说那部分是不重要的get
单元测试的好处很多,包括重构,CI等,当然成本也比较高,一般比较专业的公司才会要求
[/Quote]
mock f2的返回值也不一定可行呢?比如f2的返回值不可控的情况。
Erorr 2010-07-02
  • 打赏
  • 举报
回复
简单的策略是,测f1的时候,mock f2的返回值,测f2的时候,mock f1的返回值
当然实现起来也许比较难,甚至要改设计
单元测试要求的是100%的覆盖率,所以get也需要覆盖,这样做的好处是自动化测试或者CI的时候简单的判断是否全覆盖了,如果不是全覆盖,很难说那部分是不重要的get
单元测试的好处很多,包括重构,CI等,当然成本也比较高,一般比较专业的公司才会要求

5,215

社区成员

发帖
与我相关
我的任务
社区描述
软件工程/管理 质量管理/软件测试
功能测试压力测试安全性测试 个人社区 湖南省·长沙市
社区管理员
  • 软件测试
  • 虫无涯
  • 小博测试成长之路
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎大家加入到软件测试的社区,在这里,希望大家勇于发表自己的看法,欢迎大家分享自己在软件测试工作过程中遇到的问题以及工作经验分享。

1.想转行的小伙伴,遇到问题没有及时回复的,可以私聊小博进行反馈

2.大家对社区有好的建议,都可以在社区发帖进行反馈

推荐大家学习的软件测试入门笔记:软件测试入门学习笔记

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