软件测试(第2版)_Paul学习04_01——Ch3测试人员的离散数学

本文介绍软件测试中的数学基础,包括集合论、函数、关系、命题逻辑及概率论的基本概念。重点探讨了这些数学原理如何应用于功能性测试,提高测试的效率与准确性。

除了其他生命周期活动外,测试本身还要进行数学描述和分析。这里给出的数学方法就是工具,测试工程师应该清楚地了解如何使用这些工具。通过这些工具,测试人员会变得严格、精确和高效,所有这些都会改进测试。一般来说,离散数学更适用于功能性测试,而图论更适合结构性测试。本章只讨论离散数学,主要包括集合论、函数、关系、命题逻辑和概论的一些基本内容,如需深入研究和学习还需参考专门的资料。

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 = {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的真子集,AB

A和B是相等集合,A=B

 

子集的划分

集合的一个划分是一种非常特殊的情况,对于测试人员非常重要。"划分"的含义是将一个整体分成小块,使得所有事物都在某小块中,不会遗漏。

定义:

给定集合B,以及B的一组子集A1、A2、……、An,这些子集是B的一个划分,当且仅当:

A1∪A2∪…∪An = B,且i≠j → Ai∩Aj = ∅

划分的韦恩图

第一部分保证B的所有元素都在某个子集中

第二部分保证B没有元素在两个子集中

划分对测试人员很有用,因为两个界定性质会产生重要保证:完备性和无冗余性。当研究功能性测试时,我们会看到功能性测试的固有弱点是漏洞和冗余性:有些内容没有被测试,而另外一些内容被测试多次。

功能性测试的主要困难之一,就是找出合适的划分。

例如:三角形问题的划分

  1. 三角形和非三角形
  2. 等边三角形、等腰三角形、不等边三角形和非三角形
  3. 等边三角形、等腰三角形、不等边三角形、直角三角形和非三角形

    初看起来这些划分没有问题,但是仔细研究会发现最后一个划分有一个问题,即不等边三角形和直角三角形并不是不想交的。也就是不满足第二部分保证:i≠j → Ai∩Aj =

    集合恒等式:

    名称

    表达式

    等同律

A∪∅=A
 

AU=A

支配律

AU=U

 

A∩∅=

幂等律

AA=A
 

AA=A

求反律

A''=A

交换律

AB=BA
 

AB=BA

结合律

A∪(BC=ABU C
 

A∩(BC=AB)∩C

分配率

A∩(BC=AB)∪(AC
 

A∪(BC=AB)∩(AC

迪摩根定律

AB' = A'B'

 

AB' = 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>∈R

反对称的,当且仅当<a,b>∈R 、<b,a>∈Ra=b

传递的,当且仅当

<a,b>、<b,c>∈R <a,c>∈R

 

关系是排序关系,如果R是自反、反对称和传递的。

排序关系在软件中很常见:数据访问手段、杂凑代码、树形结构和数组,都利用了排序关系。

 

关系是等价关系,如果R是自反、对称和传递的

 

如果从定义在一个集合上的等价关系开始,则可以根据与该等价关系相关的元素定义子集。这就是划分,叫做由等价关系归纳的划分。这种划分中的集合叫做等价类。最终结果是划分和等价关系可以相互交换,而这一点对于测试人员来说是很重要的概念。划分有两个性质,即完备性和无冗余性。将这些性质带到测试领域中,可使测试人员做出关于软件已经测试的广度的有力、绝对的说明。不仅如此,只测试等价类中的一个元素,并假设剩余的元素有类似的测试结果,可大大提高测试效率。

与关系相关的测试方法:等价类

3.4 命题逻辑

(1)命题,真、假

(2)逻辑操作符,与∧或∨非,如果-则(IF-THEN)(

→)

(3)逻辑表达式,真值表

p

q

p→q

q→p

(p→q)(q→p)

((p→q)(q→p))

1

1

1

1

1

0

1

0

0

1

0

1

0

1

1

0

0

1

0

0

1

1

1

0

 

逻辑等价:

定义:两个命题p和q是等价的(记做),当且仅当其真值表相同。

定义:永远为真的命题是重言式,永远为假的命题是矛盾式

与命题逻辑相关的测试方法:决策表

3.5 概率论

在研究软件测试时,有两种情况需要使用概率论,一是研究语句执行特定路径的概率,二是将其泛化为叫做操作剖面的流行行业概念。

定义:结果可能性相等的有限样本空间S中的时间E的概率,是p(E)=|E|/|S|

总结

本章只是简单介绍了功能性测试用到的数学基本概念,要很好的在实践中从容应用,还需根据实际需要深入研究。就本章来说,是在本人看过的所有软件测试书籍中唯一一本讲了数学基础的书籍,有一种突然为软件测试找到了理论基础和数学支撑的"踏实感",因为有了这些软件测试再也不是一门简单随意的行业。

<think> 首先,用户的问题是关于理解一个特定的正则表达式:/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$。我需要解释这个正则表达式的含义。 回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题。 - 最后,生成相关问题。 用户提供了三个引用: - 引用[1]:关于常见正则表达式,如正浮点数。 - 引用[2]:包含各种正则表达式的例子,如字母数字下划线字符串、整数、浮点数、中文字符、身份证号等。 - 引用[3]:关于正则表达式的简化建议。 但用户说这些引用仅供参考,我应该基于用户的问题来回答。用户的问题是解释正则表达式/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$的含义。 所以,我需要解析这个正则表达式。 分解正则表达式- /^:表示字符串的开始。 - (?=.*[A-Z]):这是一个正向先行断言(positive lookahead)。意思是:字符串中必须包含至少一个大写字母(A-Z)。 - (?=.*[a-z]):另一个正向先行断言,表示字符串中必须包含至少一个小写字母(a-z)。 - (?=.*[0-9]):另一个正向先行断言,表示字符串中必须包含至少一个数字(0-9)。 - .{8,}:表示任意字符(除换行符外)至少8次。意思是字符串长度至少为8个字符。 - $:表示字符串的结束。 所以,整体来看,这个正则表达式匹配的字符串必须: 1. 包含至少一个大写字母。 2. 包含至少一个小写字母。 3. 包含至少一个数字。 4. 长度至少为8个字符。 这通常用于密码强度验证,要求密码有大小写字母、数字,并且长度至少8位。 现在,构建回答: - 使用中文。 - 结构清晰:逐步解释。 - 引用相关部分:用户提供了引用,但它们是关于其他正则表达式的。我可以提到引用[2]中有类似的正则表达式例子,比如强密码的表达式,但用户的具体表达式不同。引用[2]中有类似的东西:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/,这很相似,但长度不同。 在引用[2]中:强密码:必须包含数字、字母,字符长度为6~15位 /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/ 或 /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{6,15}$/。 用户的正则是/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$,长度至少8,没有上限,并且使用.*允许任何字符。 所以,在回答中,我可以引用这个。 引用[3]是关于简化正则表达式的建议,但可能不直接相关。 回答结构: 1. 介绍正则表达式的整体目的:用于验证密码强度。 2. 分解表达式部分: - ^$:表示整个字符串。 - (?=.*[A-Z]):解释先行断言的含义。 - 类似地解释其他部分。 - .{8,}:长度要求。 3. 总结匹配的条件。 4. 自然地添加引用:例如,在解释先行断言时,可以提到引用中的类似例子。 引用标识:在引用的段落末尾添加[^n]。 最后,生成相关问题。 相关问题应该基于这个主题,比如: 1. 如何使用这个正则表达式在代码中? 2. 这个正则表达式的局限性是什么? 3. 如何修改它来添加特殊字符要求? 4. 相关的正则表达式例子。 确保LaTeX:在回答中,如果有数学表达式,比如.*[A-Z],这不算数学表达式,所以不需要用$...$。但如果有像范围或计数,可能不需要。指令是针对数学表达式的,所以这里可能不适用。 在引用中,用户有像^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$这样的表达式,但没有要求用LaTeX格式。指令说“所有行内数学表达式(包括变量、不等式、方程等)必须使用$...$格式”,但正则表达式不是数学表达式,所以我应该直接写正则表达式。 在回答中,我会直接写正则表达式代码,用反引号表示代码块或内联代码。 指令有示例:在“快速排序”例子中,有代码块用```python```。 所以,我可以将正则表达式放入代码块。 回答步骤: 1. 解释整体含义。 2. 分解每个部分。 3. 给出示例匹配的字符串。 4. 引用相关资源。 5. 生成相关问题。 用中文。 </think> ### 正则表达式 `/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$` 的含义解析 这个正则表达式主要用于验证密码强度,要求字符串满足特定的复杂度条件。以下我将逐步分解其结构,帮助您理解每个部分的含义。整个表达式的核心是使用**正向先行断言(positive lookahead)** 来确保字符串中包含大写字母、小写字母和数字,同时要求最小长度。正则表达式语法可参考站内引用中的常见模式[^2]。 #### 1. **整体结构** - `/^ ... $/`:这表示正则表达式匹配整个字符串,从开头 (`^`) 到结尾 (`$`)。例如,字符串 `"Abc12345"` 会被匹配,但 `" Abc12345"`(开头有空格)则不会,因为空格导致开头不匹配。 - 表达式由多个部分组成: - 三个正向先行断言 `(?=...)`:用于检查字符串是否满足某些条件,但不消耗字符(即不移动匹配位置)。 - `.`:匹配任意单个字符(除换行符外)。 - `{8,}`:表示前面的模式(这里是 `.`)至少重复 8 次,即字符串长度至少为 8 个字符。 - **简言之**:这个正则表达式要求字符串**必须同时包含至少一个大写字母、至少一个小写字母、至少一个数字,且总长度不少于 8 个字符**。它常用于密码策略中,确保密码强度。 #### 2. **分解每个部分** - `(?=.*[A-Z])`: - `(?= ... )` 是正向先行断言,表示“字符串必须满足括号内的条件”,但不计入匹配位置。 - `.*`:匹配零个或多个任意字符(`.` 表示任意字符,`*` 表示重复零次或多次)。 - `[A-Z]`:匹配一个大写字母(A 到 Z)。 - **含义**:字符串中必须包含至少一个大写字母。例如,在 `"abc123"` 中不满足(没有大写字母),而 `"Abc123"` 满足。 - 类似用法在引用[2]中的“强密码”例子中出现过(如 `/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$/`)[^2]。 - `(?=.*[a-z])`: - 结构同上,但 `[a-z]` 匹配一个小写字母(a 到 z)。 - **含义**:字符串中必须包含至少一个小写字母。例如,`"ABC123"` 不满足(没有小写字母),而 `"Abc123"` 满足。 - `(?=.*[0-9])`: - `[0-9]` 匹配一个数字(09)。 - **含义**:字符串中必须包含至少一个数字。例如,`"Abcdefg"` 不满足(没有数字),而 `"Abc123"` 满足。 - `.{8,}`: - `.` 匹配任意字符。 - `{8,}` 表示前面的 `.` 至少重复 8 次,即字符串长度至少为 8 个字符。 - **含义**:整个字符串的最小长度为 8。例如,`"Abc123"`(长度 6)不满足,而 `"Abc12345"`(长度 8)满足。 #### 3. **组合效果和示例** - **匹配条件总结**: - 至少一个大写字母(A-Z)。 - 至少一个小写字母(a-z)。 - 至少一个数字(0-9)。 - 长度至少 8 个字符(允许更长)。 - 字符类型不限(因为 `.` 匹配任意字符,包括符号如 `!@#$`)。 - **有效匹配示例**: - `"Password123"`:包含大写 P、小写 assword、数字 123,长度 11。 - `"Abc!12345"`:包含大写 A、小写 bc、数字 12345,以及符号 `!`,长度 9- **无效匹配示例**: - `"password"`:缺少大写字母和数字。 - `"PASSWORD123"`:缺少小写字母。 - `"Abc123"`:长度不足 8。 - `"!@#$%^&*"`:缺少字母和数字。 这个表达式确保了密码的基础强度,但未要求特殊字符(如符号),您可以根据需求扩展。类似的正则表达式设计原则在引用[3]中提到,强调“宁简勿繁”,即拆解复杂条件为多个简单断言以提升可读性和效率[^3]。 #### 4. **实际应用** - 在编程中,这个正则表达式可用于表单验证(如密码输入框)。例如,在 JavaScript 中: ```javascript const regex = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$/; console.log(regex.test("Abc12345")); // 输出 true console.log(regex.test("abc1234")); // 输出 false(缺少大写字母) ``` - 优点:使用先行断言能高效检查多个条件,无需嵌套或复杂逻辑。 - 局限性:它不检查字符类型重复(如多个数字),或特殊字符要求。如果需更严格规则(如包含符号),可追加断言,例如添加 `(?=.*[!@#$%^&*])`。 如果您有更多上下文(如具体代码实现),我可以提供更针对性的帮助。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值