当前位置: 首页 > news >正文

测试第一定律

我们说被测对象是“正确”的,意思是被测对象的理想和现实完全相符。被测对象有没有可能是正确的?当然有可能。如果不可能,就说明理想过于不切实际。我们平常不太考虑正确性判定问题,不是因为“正确”不可能,而是因为正确性判定太难了,成本太高了,所以我们总是习惯性地逃避这个问题。可是,在航空航天、核工业这样一些安全攸关的领域里,产品质量的标准非常高,有时候甚至就是明明白白地要求,产品必须正确,不能有任何缺陷。而且随着人类文明的发展,人类改造自然的能力越来越大,质量问题造成的风险也越来越高,这样的要求也会越来越普遍。我们应该为这样的未来做好准备。

测试的终极梦想就是验证被测对象是“正确”的,这样的测试才是绝对充分的测试。解决正确性判定问题也是所有测试基础理论的起点和归宿。

设被测对象为P,其测试输入空间为D。用谓词COMPLETE(T, C)表示测试集T满足充分准则C。用谓词OK(t)表示测试用例t执行通过。用谓词SUCCESSSFUL(T)表示测试集T执行通过。

我们称一个充分准则是可靠的,当且仅当满足该准则的所有测试集要么全部测试通过,要么全部测试不通过。形式化描述为:

RELIABLE(C)=(\forall T_1,T_2 \subseteq D)((COMPLETE(T_1,C) \wedge COMPLETE(T_2,C))\rightarrow (SUCCESSFUL(T_1)\equiv (SUCCESSFUL(T_2)))

换言之,如果有多个测试集都满足某一个可靠的充分准则,那么这些测试集在检出缺陷的能力上是一致的。

此外,我们称一个充分准则是有效的,当且仅当对于被测对象中的任何缺陷,都存在一个满足该准则的测试集能够检出此缺陷。形式化描述为:

VALID(C)=(\forall d \in D)(\neg OK(D) \to (\exists T \subseteq D)(COMPLETE(T,C) \wedge \neg SUCCESSFUL(T)))

显然,充分准则的有效性仅仅保证缺陷检出的可能性,而无法保证缺陷检出的必然性。

如果一个充分准则既是可靠的,又是有效的,那么满足该准则的测试集就可以实现“绝对充分”的测试。这样的测试集一旦执行通过,我们就有十足的把握断言“被测对象在整个测试输入空间上都可以测试通过”。这一论断可形式化表述为如下定律:

(\exists T \subseteq D)(\exists C)(COMPLETE(T,C) \wedge RELIABLE(C) \wedge VALID(C) \wedge SUCCESSFUL(T)) \to (\forall d \in D)OK(d)

这就是所谓“测试第一定律”。该定律的证明过程非常简单。其前提条件包括:

  1. 准则C是可靠的;
  2. 准则C是有效的;
  3. 测试集T满足C;
  4. T执行通过。

这时,假设存在某个测试输入点d使得OK(d)不成立。既然C是有效的,那么必然存在某个满足C的测试集T'可以检出该缺陷,即SUCCESSFUL(T')不成立。又因为C是可靠的,满足C的测试集T和T'的执行结果就应该是一致的,即SUCCESSFUL(T)也不成立。这就和前提“T执行通过”矛盾了。因此假设不成立,证明完成。

之所以称这一定律为“测试第一定律”,不是因为其内涵有多么深奥,而是因为它给我们指出了通过测试来缓解正确性判定问题的一个方向:如果我们根据充分准则C选取了测试集T,而且T在被测对象P上执行通过了,那么只要我们证明了C是可靠且有效的,就可以证明P是正确的。

什么样的充分准则是可靠且有效的呢?我们首先能想到的是穷尽测试,也就是将整个测试输入空间作为测试集。显然,穷尽测试准则符合“可靠”和“有效”的要求。如果穷尽测试通过了,我们就可以断定被测对象是正确的(不考虑测试准绳问题的话)。然而由于成本原因,穷尽测试在大多数情况下并不现实。所以,我们需要对穷尽测试做出一些实用化的妥协。这便催生了基于枚举思想的一系列测试设计方法。

枚举的思想:组合测试

 【枚举的思想】等价类划分法,其实是被阉割的分割测试法

【枚举的思想】模型检验 

缓解正确性判定问题的另一个思路是采用形式化的演绎推理技术,比如在一组公理和推理规则的基础上,通过命题公式的等值演算来证明被测程序是正确的。这种基于严谨数学方法的手段看似无懈可击,其实也有很明显的局限性。这里有个有趣的故事。Peter Naur在1969年发表了一篇论文,提出了一种从需求推演出程序代码的系统化开发方法。Naur给出了一个示例程序,并且用非形式化的方法证明了这个程序的正确性。可是在论文发表之前,同行评审专家就发现了示例程序中的一个缺陷。1971年举办的首届IEEE容错计算国际会议上,Ralph L. London又指出了该示例程序的另外3个缺陷,并给出了一个修正版。London用形式化的数学方法证明了修正版程序是正确的。然而故事并没有结束。到了1975年,John B. Goodenough和Susan L. Gerhart发表了里程碑式的论文《TOWARD A THEORY OF TEST DATA SELECTION》,指出London的修正版程序中仍然存在3个缺陷。可见,形式化证明并非解决正确性判定问题的灵丹妙药。究其原因,是被测对象内在与外在的复杂性,致使我们对理想与现实进行形式化的过程中,难免引入各种简化设定。而理想与现实的差异,往往就潜伏在被这些简化设定所模糊掉的地方。

http://www.dtcms.com/a/274598.html

相关文章:

  • 如何通过公网IP访问部署在kubernetes中的服务?
  • AVL平衡二叉树
  • 为什么必须掌握Java异常处理机制?——从代码健壮性到面试必考题全解析
  • 阿里云服务器,CentOS7.9上安装YApi 接口管理平台
  • Linux修炼:权限
  • vue2往vue3升级需要注意的点(个人建议非必要别直接升级)
  • 基于规则匹配的文档标题召回
  • Leaflet面试题及答案(21-40)
  • PHT-CAD 笔记
  • 【每日算法】专题八_分治_归并排序
  • k8s新增jupyter服务
  • 7.11 dp 图
  • 企业IT管理——医院数据备份与存储制度模板
  • spring-ai RAG(Retrieval-Augmented Generation)
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_max
  • 【网络】Linux 内核优化实战 - net.netfilter.nf_conntrack_buckets
  • 基于深度学习的人类活动识别模型研究:HAR-DeepConvLG的设计与应用
  • C++,从汇编角度看《虚拟继承的邪恶》
  • 多模态联邦学习
  • STM32F103ZET6 TFTLCD显示图片
  • Docker构建银河麒麟arm架构redis镜像
  • Windows下基于docker desktop 使用Claude code
  • MySQL中使用group_concat遇到的问题及解决
  • 容器管理: 单机用Docker Compose,多机用Kubernetes
  • Docker高级管理--Dockerfile 镜像制作
  • 8.卷积神经网络基础
  • CSS 版本迭代历史和版本特性
  • ffmpeg-api记录
  • 8、鸿蒙Harmony Next开发:相对布局 (RelativeContainer)
  • PortsWiggerLab: Blind OS command injection with output redirection