除了其他生命周期活动外,测试本身还要进行数学描述和分析。这里给出的数学方法就是工具,测试工程师应该清楚地了解如何使用这些工具。通过这些工具,测试人员会变得严格、精确和高效,所有这些都会改进测试。一般来说,离散数学更适用于功能性测试,而图论更适合结构性测试。本章只讨论离散数学,主要包括集合论、函数、关系、命题逻辑和概论的一些基本内容,如需深入研究和学习还需参考专门的资料。
3.1 集合论
关于集合没有一个严格和精确的定义,可理解为一个包含了一些元素的整体。比如M1 = {4月,6月,9月,11月},表示"M1是元素为4月、6月、9月、11月的集合"
集合成员关系:集合中的项叫做集合的元素或成员,这种关系适用符号∈表示,比如4月∈M1,12月∉M1
集合的定义方式:
- 简单列出集合的元素,Y={1812,1813,……,2011,2012}
-
给出决策规则,Y={年:1812≤年≤2012}
采用决策规则的优点是:无歧义要求使定义很清晰。有经验的tester都经历过"不可测试的需求。"很多时候出现这种情况的原因是:这种不能测试的需求来源于歧义的决策规则。第二个优点:利于适用决策表进行分析和设计。
采用决策规则的缺点:有可能在逻辑上太复杂。
- 通过其他集合构建。
韦恩(Venn)图:也叫文氏图,用于显示元素集合重叠区域的图示,集合被表示为一个圆圈,圆圈中的点表示集合元素。
有30天的月份集合的韦恩图
A∩B = {x:x∈A ∧ x∈B}
A∪B = = {x:x∈A ∨ x∈B}
A' = {x:x∉A}
A - B = {x:x∈A ∧ x∉B}
A⊕B = (A∪B)- (A∩B)
无序对偶:(a,b)
有序对偶:<a,b>
两者的差别是,对于a≠b,(a,b)=(b,a),但是<a,b>≠<b,a>
两个集合的笛卡尔积,是集合A×B = {<x,y>:x∈A ∩ y∈B}
集合关系:
A是B的子集,A⊆ B
A是B的真子集,A⊂B
A和B是相等集合,A=B
子集的划分
集合的一个划分是一种非常特殊的情况,对于测试人员非常重要。"划分"的含义是将一个整体分成小块,使得所有事物都在某小块中,不会遗漏。
定义:
给定集合B,以及B的一组子集A1、A2、……、An,这些子集是B的一个划分,当且仅当:A1∪A2∪…∪An = B,且i≠j → Ai∩Aj = ∅
划分的韦恩图
第一部分保证B的所有元素都在某个子集中
第二部分保证B没有元素在两个子集中
划分对测试人员很有用,因为两个界定性质会产生重要保证:完备性和无冗余性。当研究功能性测试时,我们会看到功能性测试的固有弱点是漏洞和冗余性:有些内容没有被测试,而另外一些内容被测试多次。
功能性测试的主要困难之一,就是找出合适的划分。
例如:三角形问题的划分
- 三角形和非三角形
- 等边三角形、等腰三角形、不等边三角形和非三角形
-
等边三角形、等腰三角形、不等边三角形、直角三角形和非三角形
初看起来这些划分没有问题,但是仔细研究会发现最后一个划分有一个问题,即不等边三角形和直角三角形并不是不想交的。也就是不满足第二部分保证:i≠j → Ai∩Aj = ∅
集合恒等式:
名称
表达式
等同律
支配律
A∪U=U
A∩∅=∅
幂等律
A∩A=A
求反律
(A')'=A
交换律
结合律
分配率
A∪(B∩C)=(A∪B)∩(A∪C)
迪摩根定律
(A∪B)' = A'∩B'
(A∩B)' = A'∪B'
3.2 函数
函数是软件开发和测试的核心概念。例如,整体功能分解范例就隐含使用了函数的数学概念。所有的功能性测试的基础都是函数。
定义:给定集合A和B,函数f是A×B的一个子集,使得对于ai、aj∈A,Bi、Bj∈B,f(ai)=bi,f(aj)=bj,定义域A,值域B。
函数的类型:
上函数:f是A到B的上函数,当且仅当f(A)= B
中函数:f是A到B的中函数,当且仅当f(A)⊂B
一对一函数:……
多对一函数:……
函数的合成:
h。g。f(a)= h(g(f(a)))
= h(g(b))
= h(c)
= d
函数合成链对于测试人员可能是一个问题,尤其是当一个函数的值域是函数合成链"下一个"函数定义域的真子集时。
数据流图中的因果流和非因果流
3.3 关系
集合之间的关系:
定义:给定两个集合A和B,关系R是笛卡尔积A×B的一个子集。
定义:给定两个集合A和B,一个关系,关系R的势是:
一对一势,当且仅当R是A到B的一对一函数
多对一势,当且仅当R是A到B的多对一函数
一对多势,当且仅当至少有一个元素a∈A在R中至少有两个有序对偶
多对多势,当且仅当至少有一个元素a∈A在R中至少有两个有序对偶,且至少有一个元素b∈B在R中至少有两个有序对偶
定义:给定两个集合A和B,一个关系,关系R的参与是:
全参与,当且仅当A中的所有元素都在R的某个有序对偶中
部分参与,当且仅当A中有元素不在R的有序对偶中
上参与,当且仅当B中的所有元素都在R的有序对偶中
中参与,当且仅当B中有元素不在R的有序对偶中
测试人员需要关心关系的定义,因为关系的定义直接与被测软件性质有关。例如,上参与/中参与的差别,直接与我们称之为基于输出的功能性测试有关。
单个集合上的关系:
我们使用两种重要的数学关系,即排序关系和等价关系。
定义:设A是一个集合, 是定义在A上的一个关系,<a,a>、<a,b>、<b,a>、<b,c>、<a,c>∈R,关系具有四个特殊属性:
关系是:
自反的,当且仅当所有a∈A,<a,a>∈R
反对称的,当且仅当<a,b>∈R 、<b,a>∈Ra=b
关系是排序关系,如果R是自反、反对称和传递的。
排序关系在软件中很常见:数据访问手段、杂凑代码、树形结构和数组,都利用了排序关系。
关系是等价关系,如果R是自反、对称和传递的
如果从定义在一个集合上的等价关系开始,则可以根据与该等价关系相关的元素定义子集。这就是划分,叫做由等价关系归纳的划分。这种划分中的集合叫做等价类。最终结果是划分和等价关系可以相互交换,而这一点对于测试人员来说是很重要的概念。划分有两个性质,即完备性和无冗余性。将这些性质带到测试领域中,可使测试人员做出关于软件已经测试的广度的有力、绝对的说明。不仅如此,只测试等价类中的一个元素,并假设剩余的元素有类似的测试结果,可大大提高测试效率。
与关系相关的测试方法:等价类
3.4 命题逻辑
(1)命题,真、假
(2)逻辑操作符,与∧或∨非,如果-则(IF-THEN)(→)
(3)逻辑表达式,真值表
逻辑等价:
定义:两个命题p和q是等价的(记做),当且仅当其真值表相同。
定义:永远为真的命题是重言式,永远为假的命题是矛盾式
与命题逻辑相关的测试方法:决策表
3.5 概率论
在研究软件测试时,有两种情况需要使用概率论,一是研究语句执行特定路径的概率,二是将其泛化为叫做操作剖面的流行行业概念。
定义:结果可能性相等的有限样本空间S中的时间E的概率,是p(E)=|E|/|S|
总结
本章只是简单介绍了功能性测试用到的数学基本概念,要很好的在实践中从容应用,还需根据实际需要深入研究。就本章来说,是在本人看过的所有软件测试书籍中唯一一本讲了数学基础的书籍,有一种突然为软件测试找到了理论基础和数学支撑的"踏实感",因为有了这些软件测试再也不是一门简单随意的行业。