面对复杂系统的问题,这种“大胆假设,小心求证”的方法往往能产生神奇的效用。以下是一个真实的例子,在对一个多节点的集群电子商务进行系统测试时,发现在高并发访问的条件下,从应用服务器到数据库的连接数骤然增加,并很快到达连接数的上限。数据库连接数一旦到达上限并且没有及时释放时,新的请求会因为无法获取连接而被阻塞,在表面上看,系统的性能会表现得非常糟糕。

  面对这样的问题,一般的问题分析方法可能难以在短时间内找到原因。这时候需要在现有的条件下大胆假设可能有问题的地方。“现有的条件”指的是一些表面的系统运作数据,如应用服务器日志、数据库锁信息、数据连接池信息等。根据这些信息,发现有种特定的操作一旦出现,系统的数据库连接请求会急剧增加。通常情况下,因为存在系统级别的缓存,重复的访问一般不会给系统带来重新计算的负担。然而,问题的表现是,反复的访问似乎对系统产生了明显的性能影响。

  这种情况下可以大胆假设系统的缓存设置可能有问题,虽然按照正常流程安装和配置的系统不可能存在缓存的问题。基于这个假设,接着要做的是检查所有和缓存相关的配置内容。检查发现,价格模块的对象缓存并没有设置,而这个设置正常情况下应该是激活的。如果没有价格的对象缓存,那么相同的价格对象都不会被缓存在内存中,而是每次获取的时候都重新计算生成。

  在电子商务系统中,价格信息是使用非常频繁的一类信息,因为缺少对象缓存,实际应用有可能出现不断地查找数据库计算价格的情形,这会导致数据库连接被大量占用。更改设置后重新测试,验证发现使用了价格的对象缓存,数据库的连接数不再出现被异常地大量占用的情况,问题得到解决。发现了对象缓存的设置错误,进一步追寻原因,发现原来是系统安装的过程中配置脚本运行出现了异常,从而导致缓存的创建步骤并没有被执行。如此一来,整个问题的来龙去脉非常清晰了。解决问题以后,这种看似很复杂的问题,其原因也许很简单。解决这个性能问题的关键在于假设问题的原因是缓存的设置有问题;而验证恰好证实了假设的正确。如果仅仅使用一般的问题分析方法来寻找问题的原因,这种“意外”的问题往往是非常棘手的。

  “像外行一样思考,像专家一样实践”的方法是一位的计算机学者谈及学术研究时提出的一种方法论。软件测试虽然和学术研究有着明显的差异,但是测试过程中需要发现和解决问题的时候,这种方法论很有借鉴意义。在软件测试中,对待问题同样需要开阔的视野和严谨的求证态度。我们认为,测试专家能够在测试中发现绝大部分的问题并能够使用合理的分析方法找到解决绝大部分缺陷的方案,而高手则能够更进一步,棘手的问题也能够有效解决。

  能否以这种收放自如的思维方式应对测试中遇到问题,是高手和专家的一个重要分野。在大部分情况下,这种分野是不明显的,因为困难的问题只会占所有问题的很小一部分,而这种问题在测试中不会很容易地暴露。然而这种问题被发现了之后,高手和专家在造诣上的差别会显现出来。

  1.3.2  工欲善其事必先利其器

  对于测试工程师而言,虽然发现和解决问题才是体现其价值的事情,然而测试工程师不得不花大部分时间执行测试。

  从图1-4中可以发现,对于一个普通的测试工程师来说,执行测试消耗了很大一部分时间,而常规项目 的任务把可用时间的90%都占用了,剩余可以用于提高生产效率的资源变得非常紧缺。而提高生产效率从长远来说又能降低常规项目任务占用时间的比例。

  在一个水平较高的开发团队中,设计和代码实现的水平通常是比较高的。在这种团队中,测试的注意力会更多地放在验证和问题解决方面。验证是通过执行测试的方式完成的,真正运行一个场景,查看系统的反馈是否和预期吻合。对于结构复杂的系统和对软件质量要求很高的软件,需要执行多种类型的测试验证各种场景,而每种测试都可能包括大量的测试用例。例如,在电子商务系统一个新版本的开发过程中,功能测试的用例可能多达成千上万,涵盖各种正常或异常的分支场景。对于如此大量的测试用例,执行的工作量之大可想而知。

  如果测试工程师的绝大部分时间都被执行所占据,那么可以用来分析解决问题的时间相对很有限了。开发水平提高不能减小测试的工作量,那么,测试工程师通过什么方法更有效地完成测试任务呢?答案是提高测试效率。对于同一个测试人员,效率的提高有两种外在的表现,第一种方式是使用相同时间完成更多的测试用例执行;第二种方式是对于同一个或同一组测试用例,耗费的时间减少了。

  相对于测试新手对测试执行的生疏,测试专家以熟练的执行更快地完成测试任务。提高技能的熟练程度,能够提高效率。通常来说,执行一个测试,需要完成一系列操作步骤,首先需要安装测试环境、准备测试数据,如果是使用自动化操作的方式执行的测试,则需要准备测试脚本或代码;接着需要开启监控测试环境的工具,然后才能开始执行测试用例;执行完毕后,需要收集必要的数据和结果,确认测试是否通过。这一系列步骤的执行效率可以随着熟练的程度得到提高。