心理方面的因素:
1 正确认识 软件测试
是找出程序的错误的程序,并不是为了证明程序是正确的。
因为,几乎不存在没有错误的程序。
之所以要这样想,是因为如果我们从一开始就认为程序没错,那我们在潜意识里,无意识地回避会引起错误的测试方法或者数据。否则会造成我们不自觉地把错误屏蔽了,人的行为微妙而神奇。
这告诉我们,不要害怕发现错误—— 当然,从我的角度来说,我想说一些我自身的一些想法: 有时候我们回避报告一个错误,主要是害怕因此被迫加班加到周六晚上十二点——这一点,我认为是 经理的 责任——尽管我知道,很多时候特别是小IT公司,以市场为主导。 有时一旦客户逼上来了,一般来说,情况都是,一旦老板被逼地紧了,员工就会被逼地更紧。于是乎就不难理解,为什么会有人连续几个月,半年,甚至一年,两天没完没了的加班......什么叫没完没了的加班? 就是说,周一到周日一直上班,至于传说中的加班费就不说了——那个东西真的只是传说。然后晚上一般都是加到12点,也就是说除了吃饭睡觉就是上班...... 这种情况下,你知道为什么我们有时候会隐瞒发现的错误了吧?
2 一个发现错误的测试,并不代表它是失败的,恰恰相反,它是正确的,因为它实现了自身的价值。
软件测试 实际上做了两件事情
1 发现潜在的错误
2 证明程序只做了应该做的事情。
但是,要证明第二点实际上是很困难的。
实现这个目标的最佳途径是 对错误的不断研究。
关于第二点可以啰嗦几句的: 那就是,有一种很错误的想法就是“反正没什么坏处,留着又怕什么呢?” 事实上,这是一种最错误的想法。
3.黑盒测试,也就是 数据驱动
但是,如果要穷举,实际上,不仅不经济,并且不可能。
4.白盒测试。逻辑驱动,其基本思想是 穷举所有路径。
基于同样的道理,也是很困难的,只是相比 数据(我想,逻辑路径总是相对有限一些吧。) 当它仍然非常困难。 ——这里面还提到一个 代码覆盖率的问题,其意思就是测试程序所测试到的条件分支,代码占了所有分支,所有代码的百分比。
测试原则
1 测试用例中一个必须部分是对预期输出或结果的精确定义,以避免把错误的结果解释成正确的。
这里,说一个,我们在实际工作中经常发生的一个算是小插曲吧。 这个项目中,有上下位机的通讯,因此很多测试,很多错误调试需要双方互相调整和配合。 经常在调试遇到故障现象时,我们经常会问对方那边发现了什么异常状况,对方总是很自然地问一句,你那边观察到什么异常反应。 这个时候,我们总是很习惯地选择先不告诉对方自己的发现——因为从自己的角度出发,对方就是黑盒,所以,我们会屏蔽自己的内部。 我们这样的目的常常是,让对方在不知道具体底细的情况下,如实或者说,全盘托出自己发现的异常,以帮助自己定位更多细节。
理由和前面说的第一条类似:人有一种很奇妙的微妙行为,尽管他完全无心为之,但假如他知道更多细节——特别是假如他潜意识中对相关的情况了解的足够多,他甚至可以往自己希望得到的结论,结果引导出一个看似非常合理的解释,于是乎就掩盖了更多的真实原因。
这种现象,我在自己身上发现过,也在和我一同工作的人身上发现过。
所以,对一个测试用例 的预期输出做出精确定义,其重要意义就是——让你避免这种潜意识的无心行为。 有一种说法是:人的潜意识能够处理比人的显意识更巨量的隐性的逻辑分析运算,从而得到某种让你吃惊的结果——这种内在机制通常表现为 灵感,或者类似于 福尔摩斯那种“总是先说出结果,然后要整理半天才能理出解释一样”。
2.错误总是倾向于聚集存在!! 在我看到这一条的时候,我马上在我的实际工作中得到验证。 是的,在我的工作中,有一个功能模块,如果做一个粗略统计的话,可以说,从两个月前我们提交出第一版测试程序,我们收到的bug反馈中,这个模块的相关错误至少占了20%到25%——要知道,余下的部分里,有两到三个问题也同样以这种规律聚集出现!
关于这个现象,我有过一种比较粗浅的解释: 那是因为,这个模块从一开始的结构设计,就没有得到足够的考虑——是的,从实际情况看,我们经常聚集出现的几个模块,的确都是后期上司“临时”要求加进去的——事实上,他“临时加”的东西还不少,以至于最开始,我误以为自己的职责和权限只不过是为他写子程序,也不好多问,当然也因为那个时候我实在不懂这么多,没有这些经验教训。 所以,我经常是,做完这个,突然被“临时要求”加上这个,以至于我时有发现,前后矛盾或者难以加入新功能。 有时我经常被迫重新修改先前已完成的工作,因为这种修改会让我觉得更加简洁,完善。
另一个原因,也许大家都会想到: 正如我们体育运动时,如果你扭伤了左脚踝,那么,很可能你以后经常还得扭伤 左脚踝。一个很浅显的原因也许是,因为它曾经受过伤。 但也许更深层的原因是,你的某种习惯性的动作和发力方式,使得你很容易扭伤左脚踝。
同样的道理,你犯过的错误,往往会重复出现,比方说,对数据类型的字长没有足够的检验;比如说,在两个并行处理的线程里同时操作一个变量.......
所以,为了避免这种错误,对已犯的错误做一个详细记录,并时常回顾,就可以比较好地避免 一错再错。
并不是只有功课才需要 温故而知新 的。
[ 本帖最后由 辛昕 于 2012-6-14 23:13 编辑 ] |