明晰单元测试
上一篇 / 下一篇 2012-04-27 09:58:20 / 个人分类:杂谈
对于我这混迹于软件行业超十载,且在工作中能经常娴熟运用单元测试的“老鸟”来说,看到这样的理解实在是hold不住了,觉得很有必要写一篇文章以正视听(希望后面的人能“搜”到这篇文章)。51Testing软件测试网x(nn'}^
;ko;Z/QMG GKA0 之所以要做“以正视听”这件事,是因为我担心上面的解释让新人或没有单元测试经验的人产生一种幻觉 ——“哇,好赞诶,原来我每天都在做单元测试!”这种幻觉带的后果,是这些人不去做真正的单元测试,且别人在说单元测试如何如何时,他却不知所云。51Testing软件测试网0v W|T[
&G2c&i'?z%jn0 如果要用不会产生争议的文字解释单元测试,我想我不一定能写得比维基百科上的好,那请允许我从特点的角度对之加以解释。首先,单元测试一定要写测试代码。测试代码并不会最终成为软件产品的一部分,测试代码通过实现各种不同测试用例的方式,检查被测代码(最终成为软件产品的一部分)的行为是否如程序员所希望的那样。读者不难想象,测试用例中需要构建大量被测代码所需的参数、环境等(体力活)。51Testing软件测试网7fPL[t$r
T4|ssy0 其次,为了简化单元测试程序中测试用例的编写,单元测试一定需要使用一定的测试框架,比如cxxtest、CppUnit、JUnit等等。当然,使用自己设计的测试框架也是一种选择。51Testing软件测试网1H2bO4C7eI
LXHEGf0 再次,单元测试通常(我本来想写成“一定”,但又怕被指太绝对)需要通过获取代码覆盖报告这一形式以了解测试效果,来自开源社区的gcov和lcov相 信被不少人所知。“代码覆盖”是一个不小的“炸弹”,乃至有的人会选择性地将其看成是“形式主义”。对于有这样反应的人,我相信是因为他们吃过了“代码覆 盖”这“鸟”的苦头,因为那帮丫领导将百分百的代码覆盖率当成了考核目标,结果可想而知。51Testing软件测试网(o v o{a\'DYl
I'} F Ry%o4F&C-|0 代码覆盖报告的真正作用,是帮助程序员了解被 测代码的哪些“角落”没有“扫过”,从而指导测试用例的编写。如果一味地以百分百的代码覆盖率作为目标,这会让程序员承担巨大的工作压力。 Parasoft(C++ Test工具的开发商)的一份研究报告中指出,覆盖率超过大约80%时,团队所承担的工作压力就很重了,这一报告可作为制定具体覆盖率的参考。51Testing软件测试网%VDF6w`Z*X
1k5V4U aH5N^t0 另外,即使以百分百的代码覆盖率为实施目标,很遗憾,还是达不到完全保证代码质量的目的,因为测试用例是可以“伪造”的。在软件行业,不论有多么好的软件开发方法,都依赖于程序员的专业精神,否则其效果将大打折扣,这一点对于单元测试也不例外。与其追求百分百的覆盖率,强调测试用例的质量更具意义(OMG,如何保证测试用例的质量?)。还有,千万不要将单元测试当作是“银弹”。51Testing软件测试网*O~ \ l\ c