五、思考和讨论
1、自动化功能测试做到多少才合适?
当然是越多越合适,问题在于自动化功能测试成本要大大高于单元测试和集成测试,这些成本反映在测试环境的搭建、数据的准备,需要准备其他很多关联数据例如用户信息和权限信息、自动化功能测试的运行时间长、稳定性(随机成功/失败)、编写等等,需要权衡成本与收益。
个人认为,自动化功能测试需要考虑的着重点包括:页面是否包含大量功能交互性JS(与展现性JS相对)?当前功能是否与其他功能共享一些代码?即独立性,独立性越低越需要着重覆盖(这里又涉及到另外一个问题,即从各个模块里重构出共用代码是否总是合适?)。QA每次冒烟测试时是否需要重复回归(重复回归次数越多,自动化越有价值)?经常失败的测试一定比不失败的测试价值更高?或者从未失败过的测试就没有价值?
2、单元测试?功能单元测试?
TDD 的测试粒度多大才合适?从我个人而言,几乎天然的反对mock,为了满足测试覆盖率的追求,强制将两个联系很紧密的类分开,做出各式各样mock,这真让人气馁;stub也不是什么好东西,在一个曾经的spring项目里,在测试目录里,一堆一堆的测试xml配置文件让人有种呕吐的感觉。那就做集成测试吧,两个类关系很好,那么就整体测试它们的输入和输出,看起来很不错,功能实现了,测试也没多写,也不用准备太多其他东西,但是打开实现代码,你就发现那个丑陋,到处是复制和粘贴,是啊,不管黑猫白猫抓住老鼠就是好猫,只关注了当前结果,完全失去了TDD驱动简单设计的好处。
3、测试的重点是测试用例的设计,它反映出对需求的理解
那么结论就很明显,我们如果连需求就没有理解,如何进行实现,所以测试驱动是很自然的。