Testes Não Funcionais
Qualidade de Software
Performance
Segurança
Confiabilidade

非功能测试:除了工作之外,还定义系统是否良好

功能测试询问系统是否做了它应该做的事情。非功能性的问题是询问它是否足够好以实际使用。

一个系统可以通过所有功能测试,但仍然会失败。

它完全符合规范的要求。每个按钮都有效,每个计算都是正确的,每个流程都会自行完成。即便如此,它的速度还是慢到令人恼火的地步,当很多人使用它时它就会崩溃,它会在第一次攻击尝试时泄露数据,而且它是如此混乱,以至于没有人可以在不破坏其他三件事的情况下改变它。它有效,但也很糟糕。

“做它应该做的事”和“做得足够好以实际使用”之间的区别正是非功能测试的领域。在我看来,它们是最能区分专业产品和伪装原型的质量部分。

功能性与非功能性

这种区别说起来很简单,但其后果却是深刻的。

功能测试检查系统的功能:给定输入,它是否产生正确的输出?注册可以保存吗?付款处理了吗?报告提供了正确的数字吗?这些是关于行为和纠正的问题。

非功能测试检查系统的运行情况:多快、多安全、多可靠、多可扩展、多易于使用和维护。他们不会问“这有效吗?”,而是问“这有效吗?”。速度、安全性、负载下的稳定性、[可达性0°,这些都是不起作用的。

陷阱是功能性很容易指定和收费,因此它几乎引起了所有的关注。非功能性是分散的,容易推迟,因此通常被忽视,直到它成为系统在生产中失败的原因。

重要的尺寸

“非功能性”是一把大伞。了解主要尺寸是值得的,因为每个尺寸都有不同的方式让系统即使在工作时也会令人失望。

性能是最明显的:响应时间、使用速度。一个正确但缓慢的系统会悄然失去用户。可扩展性和容量取决于它是否能够应对需求的增长和激增,而不是仅在很少有人使用时才起作用。

可靠性和可用性与连续性有关:系统是否能够随着时间的推移正常运行、从故障中恢复、不会损坏数据?安全性检查它是否能够抵抗恶意使用,这就是最昂贵的缺陷类别所在,因为安全缺陷不会让用户感到沮丧,而是暴露了他。

可用性和[可访问性1]询问具有不同能力和环境的真实的人是否可以真正使用它。而可维护性是最不可见的,它询问团队是否可以改进系统而不让每次更改都成为雷区。

为什么非功能性被推迟(以及为什么它是一个错误)

非功能性被忽视有一个结构性原因:它没有出现在演示中。

当您向客户或经理展示系统时,您展示的是功能。 “看,做这个,做那个。”没有人演示“看看它如何抵御一万个用户”或“看看它如何抵御攻击”。这些品质是看不见的,直到它们消失的那一天,然后它们才以危机的形式出现。

结果是虚假经济。负载、安全性、[可访问性2]测试被推迟,因为“首先它需要工作”。然后系统投入生产,在第一个高峰时崩溃,泄露数据或排除部分用户,而后期纠正的成本比及时测试的成本高出数倍。

在公共部门,这种情况尤其严重。一个有效但缓慢、不安全或无法访问的公民服务系统无法为最需要的人提供服务。而在处理个人数据时,非功能性安全缺陷直接遭遇[LGPD3,它不再是一个技术问题,而是一个法律问题。

测试非功能性需要不同的心态

测试功能相对简单:定义输入,检查输出。测试非功能性更加困难,因为它需要定义什么是“足够好”,而这是一个决定,而不是事实。

多快才算足够快?它可以“处理”多少个并发用户?什么级别的可用性是可以接受的?这些问题没有普遍的答案;取决于业务和用户的环境。因此,非功能测试的首要任务是将模糊的品质转化为可测量的目标。 “快”没有经过测试;测试了“95% 的情况下响应时间低于此时间”。

实际结果是,需要尽早定义非功能性需求以及功能性需求。如果把它们当作事后的想法,那么它们就会被测试得太晚或永远不会被测试。

那些让努力毫无用处的错误

第一个错误是没有设定目标。如果没有目标,“测试性能”就变成了收集数字而不知道它们是好是坏。目标必须在测试之前出现。

二是在不现实的环境中进行测试。在生产以外的机器上测量性能或在没有实际攻击场景的情况下测量安全性会产生误导性结果。非功能性对环境特别敏感,只有在条件与现实相似的情况下,这些数字才有效。

三是将其视为单一事件。随着时间的推移,每次对系统进行更改,性能、安全性和可靠性都会降低。发布时进行的一次安全测试几乎无法说明六个月和五十次发布后的安全性。非功能性需要复发。

当功能被视为理所当然时,质量才是剩下的

在产品和组织成熟的过程中,有一个时刻,“它有效”不再是一项成就,而是一个起点。从那时起,真正的质量是由非功能性定义的:它是快速的,它是安全的,它是耐用的,它是站立的,它是可访问的,它是可能发展的。

初创团队庆祝“它有效”。成熟的团队知道这只是地板。专业系统与业余系统的区别并不在于它做什么,而在于它在压力下、随着时间的推移,对每个人来说做得有多好。这种“有多好”正是非功能测试所保护的。

忽略它们并不会节省精力。它只是将成本转移到最糟糕的时刻:生产,用户在场。

如果您的产品“有效”,但您从未测量过它的速度、安全性或弹性,那么可能会出现无法正常运行的风险。我在博客上还有其他关于性能、安全性、可靠性和软件质量的文章,分别讨论了这些维度。

另请阅读

  • [负载测试:它们是什么以及为什么您的系统应该在客户之前进行这些测试4
  • 【压力测试:在系统崩溃之前找出系统如何崩溃5
  • 【非功能测试:真实案例脚本6
  • [非功能测试:带有清单的脚本7
  • [自动化测试:为什么未经测试的代码是债务8
  • [压力测试:日常商业模式9