TA的每日心情 | 无聊 昨天 09:08 |
---|
签到天数: 531 天 连续签到: 1 天 [LV.9]测试副司令
|
1测试积点
使用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的要求,不得不编写单元测试代码,真是无奈,不过恰好借此机会向各位大侠取点经。
|
|