“测试的最高境界是找出所有BUG吗?不是,测试的最高境界是不需要进行测试。为什么不需要进行测试?是因为所有的问题都已经在软件各阶段中介入的测试工作中给预防解决了。由此引申,测试的定位并不是找出BUG,而是预防BUG。”
这是因为,如果测试的出发点只为是发现BUG,那么测试工作将会变成:辛苦的发现了一个BUG,之后开发针对性的修正了这个BUG,再回重新测试的过程,可能又需要人力物力进行新的一轮稳定性测试,可能又会产生新的BUG,花费更多的时间进入稳定。
所以改善这个问题的出发点就是改变对测试工作的认识——测试的目标并不是为了找出BUG,而是预防BUG的出现。(观念的转变)
正确的测试目标是预防BUG的出现
首先可以从软件测试的阶段划分来看。软件开发的阶段划分为需求、设计、编码、测试、验收。假如在编码阶段完成后测试出的BUG属于设计问题(我们测试工作中经常遇到的情况),那么我们已经编码完成的产品就要面临着伤筋动骨的修改,这样的修改会引发更多的BUG的产生。(某个功能一开始并未对底层算法做测试,只对表层UI做了验证,后期发现该功能存在较大算法问题,导致稳定周期非常长。)由此可以说明需求设计阶段的测试比编码阶段测试重要的多。
在需求上出现的BUG就很有可能足以推翻整个产品。那么如果在需求设计阶段测试人员就能发现产品设计的BUG,那么就可以避免了因此而衍生的产品BUG,达到预防BUG这种测试理念的目标。因此在之后的迭代过程中,我们需要加强对需求文档的静态测试及对开发详细设计的测试,这两个阶段是容易产生严重BUG的阶段。
“测试工作不只是一种技术,也不仅是一种活动。测试工作的成功也不能取决于测试成果,测试的BUG越多并不能证明测试工作做的好。”所以由此引申,测试工作要站在团队的高度来开展,在团队中做好测试,而不是在测试小组中做好测试。这其实就要求我们关注整体研发目标而非功能的目标或者测试单个职能的目标。
做好以预防BUG为目标的测试工作,首先要尽早的参与到迭代的各个环节中,从需求交底阶段就要进行测试,其次就是需要各部门及小组的大力支持,与业务、项目、代码人员共同形成团队,在团队中影响其他小组提高产品质量,更好的完成以预防产品出现BUG为目标的测试活动。
自动化测试感悟:“没有银弹”
“我们并没有理性的看待自动化测试,自动化测试并不是我们看上去的那样美。”
首先自动化测试能直接的节约成本、让测试人员变轻松的想法是一个误区。因为原本用于手工测试的时间用来编写及维护测试脚本了,而完善的自动化测试脚本编写或维护的时间很可能会超过手工测试的时间。
再者自动化测试脚本用例是测试人员所编写,自动化测试只能是沿着该测试人员的“足迹”前进。所以用自动化测试来发现更多软件产品问题的想法也是一个误区。
其次并不是所有的测试都能自动化,测试的自动化也不一定是解决问题的最佳手段。
实际上自动化测试是一种理念,它要发挥它真正的作用就需要这种理念转变为一种体系——自动化测试体系。片面的追求自动化,无异于缘木求鱼。
自动化测试体系是指能够适用某种环境的测试工具、过程、人员结构、方法的综合,运用于整个项目团队。
片面追求完全的自动化进度或者完全的手工验证并不可取。我们会根据项目的进展,尝试过如下几种覆盖方法:
1. 紧跟迭代——开发进行详细设计阶段,测试人员进行用例的编写,在开发进行代码编写的过程中测试人员进行自动化脚本的覆盖,开发交付后进行自动化测试及手工测试补充验证。
2. 先手工验证暴露问题再自动化覆盖——开发交付较早,为了避免在迭代结束时才发现大量bug,因此优先进行了一轮手工测试验证,然后再进行自动化覆盖,保证了bug的提前暴露。
3. 不适合自动化验证部分,手工交叉补充——由于测试点较多,自动化覆盖并不能达到非常好的覆盖率及验证效率,因此自动化覆盖了部分内容,手工覆盖了另一部分自动化不好验证但手工非常容易验证的部分,达到了非常好的效果。
另外,如果研发的设计、编码实现并没有考虑到自动化,而导致自动化脚本的编写非常吃力。比如之前项目的符号命名不规范,提示信息不统一,导致自动化覆盖时,经常出错,但其实并不是值得关注的功能性问题,却耗费了大量人力物力进行脚本分析及维护。
根据经验,对不同的项目要开展不同自动化策略。参考如下:
1) 评审项目中特定的部分作为应用自动化的候选对像。
2) 从项目中高度冗余的任务或场景重点考虑自动化。
3) 将乏味且人工容易出错的工作重点考虑自动化。
4) 将回归测试经常需要“照顾”到的部分重点考虑自动化。
5) 自动化开始时要首先关注开发成熟、理解透彻、相对稳定的且不易变的部分优先考虑自动化。
自动化所实现的最大价值目标是可不间断的、可重复的自动执行对需求、设计、代码全面覆盖的大量测试用例从而预防bug的产生的一套质量保障机制。
所以自动化测试的重点在于测试自动化作为一个体系,要运用于整个项目团队。
项目组要讨论它(策略、时间、成本等)、研发需要参与它(编码方向、自动化支撑、以及代码单元测试自动化的计划和执行等)、测试要引导及推进它(策略、方法、执行、跟进、维护等),各团队共同形成体系,才能让自动化测试工具真正的成为一种质量保证的有力武器。