针对今天的软件开发环境,最近一年,我一直倡导重新认识软件测试,对软件测试应该有一个新的理解,即给出“软件测试”一个新的公式:
测试 = 检测 + 试验
这个公式意味着软件测试包括两部分工作:检测和试验。对于产品中确定性特性进行验证,可以进行检验,因为其验证标准或依据是明确的。而对产品中不确定性特性进行验证,只能通过实验来验证。所以可以将上述公式再展开,就成为:
测试 = 检测已知的 + 试验未知的
即软件测试包括两部分工作—对已知的检测和对未知的试验。
·已知的部分,是指测试目标、测试需求和测试的验证准则等都是明确的,也可以理解待测试的功能特性是清楚的、测试范围和数据是有限的,具有良好的可测试性。例如,某些功能在规范的需求规格说明书或其他需求文档中得到清晰的描述,那么这些功能是可以检测(check)的,可以根据文档直接进行验证,判断软件系统中所实现的功能是不是符合之前所定义的需求。在性能测试需求中,如果针对众多的性能指标给出了量化的要求,那么这性能是可以检验的,是可以直接验证的。
·未知的部分,即测试目标、测试需求和测试预言等是不明确的,也可以理解为产品的功能需求定义是不清楚、不稳定的,测试范围和数据是无限的,很难直接进行验证,而是需要通过不断地试验,才能知道所实现的功能特性是否正确。例如,用户故事对需求描述过于简洁,验证就很困难,需要足够的探索和沟通才能搞清楚,才能判断系统的实现是否满足用户的需求。如果我们开发一个崭新的系统,之前也没有性能指标数据,这时也需要先试验,获得性能指标数据作为性能基准线。当测试数据是无限的,我们的测试就是一个有限样本的试验。
要理解已知的部分和未知的部分, 不仅要了解测试的输入具有两重性 —— 确定性和不确定性,而且测试的输出也具有很大的不确定性 。在今天移动互联、大数据时代,移动app的用户数量特别大,操作方式、应用环境、喜好也存在较大的差异,大数据的复杂性、多样性、快速变化特性等,都增加了测试输入和输出的不确定性。针对输出结果的判断,需要进一步了解Test Oracle(可译为“测试预言”)所带来的挑战。 什么是Test Oracle呢? Test Oracle就是一种决定一项测试是否通过的(判断)机制。Test Oracle的使用会要求将被测试系统的实际输出与我们所期望的输出进行比较,从而判断是否有差异。如果有差异,可能就存在缺陷。Test Oracle一般依据下列内容做出判断:
① 需求规格说明书和其他需求、设计规范文档;
② 竞争对手的产品;
③ 启发式测试预言(Heuristic oracle);
④ 统计测试预言(Statistical oracle);
⑤ 一致性测试预言(Consistency oracle);
⑥ 基于模型的测试预言(Model-based oracle);
⑦ 人类预言(Human oracle)。
测试过程中, 判断测试结果是否通过,Test Oracle举足轻重 。对于已知的检测,我们会用到测试预言①、②、⑤、⑥ (如清晰的Spec、竞品参照、一致性要求、确定性模型等),如图1-5所示。其中基于模型的语言,也只能是确定性的模型。如果是随机模型、模糊模型,就属于不确定模型。
图1-5 对已知的输入/输出进行检测示意图
当我们开始一个软件项目,测试工作也随之开始——进行测试需求分析。这时,我们就可以将测试的范围(测试项)分为两部分:相对稳定的、明确的测试项和不确定的、容易变更的测试内容。针对已知的测试项,比较容易设计测试用例,理论上也基本能百分之百实现自动化。而针对未知的部分,就需要试验、需要探索。只是这种试验或探索,可以手工来做,也可以由工具来做。测试的风险也往往来自这部分——不确定的测试内容,值得我们特别关注,测试需求分析时分为这两部分就更加有意义。
① 如果Test Oracle属于启发式的,需要综合判断的,就需要手工测试 —— 测试人员的试验,不断质疑系统,根据系统的反馈来做出判断,这就是探索式测试 。探索式测试也有测试场景、测试思路的设计,但没有详细的设计——测试用例的设计,但探索式测试能发挥人的创造性、分析能力和思维能力,不断设计、执行、分析、学习,再设计、再执行、再分析、再学习……这样持续改进的测试过程,使测试不断优化,测试的效力不断得到提升,能更快、更多地发现问题。
② 对于工具的实验,例如一些系统出现崩溃的原因不明,只知道很有可能是异常数据造成的,这时就可以由工具来进行测试,包括产生随机数据来实现测试,或建立一个初步的数据模型,由模糊控制器产生数据或对正常输入数据直接进行变异数来完成测试,如图1-6所示,这就是自动的 随机测试、模糊测试、变异测试 等。这时,可以基于统计准则或系统异常的表现,来做出判断:是否发现了缺陷,这些方法常常用于系统的安全性测试、稳定性测试等。
图1-6 借助测试工具进行未知实验的示意图
未来,随着大数据的积累和技术的成熟、人工智能(AI)的发展,这种对未知的测试,可以由人工智能完成(参考第15章相关内容),可以兼具上面两种不同方式的优势,不断学习、不断进行数据(输入、输出、log等)挖掘,不断构造、完善验证的推理规则和测试预言,完成自动的测试,从未知逐步走到已知,达到更好的测试效果。概括起来,“测试=检测+试验”意味着:
测试=基于确定性模型/明确测试预言的自动化测试
+基于AI搜索的/工具随机/模糊模型的/手工的探索式测试
在做测试需求分析之初,就需要将测试的范围(测试项)分为两部分:已知的(包括确定性的/稳定的)、未知的(包括不确定的/动态的)。已知的测试项,理论上都可以实现自动化;未知的部分,也可以用工具进行测试(模糊测试/随机测试等),更多地是依赖人的探索式测试。图1-7就是对本节的一个小结。
图1-7 基于Test Oracle的测试新认知