《软件测试(原书第2版)》
著:(美) Paul C.Jorgensen
译:韩柯 杜旭涛
机械工业出版社
从今天(2013.09.02)开始学习这本书,书其实去年11月份就买了,但是当时在自学清华大学出版社(黎连业)的《软件测试与测试技术》,更多的是为了背诵知识点应对找工作的笔试,所以这本书还没有怎么认真的学习过。从今天开始,认真的学习一下这本书,下班后不急着走,留下来花半个小时的时间看下这本书。
可能更多的习惯还是在笔记本上记下相关的知识点,但是会在这里做一些心得总结或是重要知识点的记录。
2013.9.2
第一部分 数学背景——第一章 测试概述
1、因为很多文献的术语很混乱,这里开始对一些基本术语进行了定义。
错误(error):人类会犯错误。(人在编写代码时出现的错误,或是更早设计期间的错误)
缺陷(fault):缺陷是错误的结果。(过错缺陷(不正确的输入导致),遗漏缺陷(没有输入正确的导致))
失效(failure):当缺陷执行时会发生失效。(关于失效的定义还不是很明了,需再思考)
事故(incident):当出现失效时,可能会也可能不会呈献给用户。(我真的有点糊涂了。。。)
http://q.cnblogs.com/q/54335/这里是网上找到的答案,但是总觉得,就算不是工业标准,应该也是从工业标准演化过来的吧
2、通过维恩图理解测试
S—规格说明书中所描述的行为
P—编程已实现的行为
T—测试用例检验的行为
书中描述“这时我们已经能够看出测试作为一种工艺的一些可能性:测试人员怎样才能使这些集合都相交的区域(区域1)尽可能的大?另一种方法是问如何标识集合T中的测试用例。”
到了这一步,也就是需要我们去用某种方法来标识测试用例了,也就是下一小节中提到的功能性测试和结构性测试。
3、标识测试用例——功能性测试&结构性测试
功能性测试的基本观点是,任何程序都可以看作是将从输入定义域取值映射到输出值域的函数。
其实我想,应该就是我们所说的黑盒测试,在这种测试方法中,我们唯一需要的信息就是规格说明书。
优点:(1)与软件实现无关,就算代码的实现发生变化,测试用例遵照规格说明书,仍然可以继续使用;(2)测试可以和开发并行,所以可以压缩总项目开发的时间。
缺点:(1)规格说明书是很详细的,可能有很多重复的地方,这时测试用例之间就会有严重的冗余;(2)由于有遗漏缺陷,或是代码实现了但是说明书上没有的部分,则会出现为测试的软件漏洞。
结构性测试,其实一说功能性测试是黑盒测试这里就应该很清楚了,结构性测试就是白盒测试。要求熟悉线形图论的概念。
优点:我理解的是,(1)因为了解代码本身的确切内容和明确的测试范围,所以测试用例会更精准且更详细;(2)说明书上没有而代码实现了的部分可以得到测试,不会遗漏。
缺点:我认为则正是因为是基于代码来生成的用例,所以若没有代码的话,那就无法生成测试用例,那么说明书上说明了而代码没有实现的部分则会被漏测。
比较:两种测试都是不充分的,所以说啦,需要结合使用的啦~
相对而言,“考虑到程序的行为的话:如果所有已描述行为都没有被实现,则结构性测试永远不会认识到这一点;如果程序实现了没有被描述的行为,功能性测试永远不会揭示这一点。”在这样看来的话,当然是要二者相辅相成才可以,不过另一方面来说,简单点、不耗费精力的话,我总结结构性测试更适用于单元测试,功能性测试更适用于系统测试(那集成测试怎么分啊??)
而在这里也可以发现,其实经验啊经验啊是很重要的一点啊,通过分析容易犯什么类型的错误,并且思考在测试中可能出现什么类型的缺陷,就可以更好的找出使用这两种方法结合使用的黄金比例了吧,果然是工艺啊!すごい!!!
4、错误与缺陷分类
话说小梅是QA,我是QT,正好是两个代表啊在这里~
SQA更注重减少开发过沉重的错误做法(我想大概就是从产品设计,到代码规范的掌控吧)。
QT更注重发现产品中的缺陷。
书中用表格说明了输入/输出缺陷、逻辑缺陷、计算缺陷、借口缺陷、数据缺陷5种有用的异常类型,表格太多,我就不在这里记录下来了。
对了对了,差点忘了还有 一点,此前的学习中都标明“测试的目的是尽可能的发现缺陷”,而在这里提出了第二点“测试也是为了演示正确的执行”。
然后再ps:练习题的第三题不会做啊,要思考,要思考!
第一个部分叫做数学背景,我今天所看的部分只有短短的10页,却觉得实在是很有艺术性,也许这本书其实可以叫做软件测试的艺术的,哈哈哈哈哈!
pps:本来还想再看一下《Ruby语言入门教程v1.0》的pdf的,但是一个人都没有了啊!关灯了啊!呜呜呜呜~要不我还是回去吧~~~~(>_<)~~~~
2013.9.2
第一部分 数学背景——第二章 举例
这一章主要讲的是测试的方法。不得不说我看到这一部分的时候有点吓到了,因为此前看软件测试的书基本都看不到什么代码,这边却是第一页就开始讲代码,把我这个很久没有编程的人给吓到了。不过,这里所说明的“泛化伪代码”说是代码,更多的我觉得应该是逻辑表示,将流程图化成代码的形式来解释。
单元测试的部分讲了经典三角形问题、NextDate函数、佣金问题的泛化伪代码的实现,我只是看了下代码,确认自己可以看懂代码所表示的意思,理解整个实现代码的思路,并没有去试写代码。
集成测试部分给出的梨子是SATM系统、货币转换器、雨刷系统,SATM系统的部分很坑爹,那么长的文字和图片,结果文字在这边,图片在翻页后的背面,我勒个去!幸好也就是简单的ATM机操作而已,不然姐姐非得看得头疼不可,排版很伤神啊。。。。
今天就是简单了解了下这几个例子吧,清晰个体、集成、整体之间的区别。OK,今天的部分到此为止,这些例子会在之后的几章中继续用到,并且细化分析。
剩下的时间去看看昨天没看成的ruby去吧~
2013.9.3
第一部分 数学背景——第三章 测试人员的离散数学
3.1 集合论
今天躲懒了,加班到7点,累得不行,不想看书了。中午的时候看了一部分,集合论的部分,这部分主要是为了后面的部分打数学的基础,毕竟很多人可能已经忘了很多的数学定义啊公式什么的了。
决策规则定义集合:如S={销售: 15%的佣金率适用于该销售额} 我们很难列出这个集合的原色,但是对于特定的销售额,可以用这个决策规则来定义。ps:需要注意的是,规则必需是无歧义的,一定要清晰。
笛卡尔积:这个其实我都忘了,第一眼见到的时候根本没反应过来。给一下定义:
假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为AxB = {<x,y>:x∈A∧y∈B} = {(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。
突然发现我们平常写测试用例的时候不是也划分了集合的吗,然后再分配到每个人身上去。嗯。。。这样说好像也不对,应该说是比如说一个功能,适当的进行划分成几个子集,子集被测试的次数(程度)应该均量,不能一个被测很多遍了,另一个却没被测几次,毕竟其实测试中很多部分都是重叠而冗余的。
2013.9.4
第一部分 数学背景——第三章 测试人员的离散数学
3.2 函数
隔了这么长时间来看函数还真是一脸茫然啊,貌似大二(还是大三?)才学过离散数学的,现在一些定义已经乱了。。。。
mark一下函数定义啊
首先给出函数f:A→B,并定义集合:f(A) = {bi∈B:b=f(ai)对于某个ai∈A} 这个集合有时记做A在f下的映象。定义:
f是从A到B的上函数,当且仅当f(A) = B.
f是从A到B的中函数,当且仅当f(A) ∈ B.(这里是真子集,只不过符号我打不出来)
f是从A到B的一对一函数,当且仅当对于所有ai、aj∈A,ai≠aj使得f(ai) ≠ f(aj).
f是从A到B的多对一函数,当且仅当存在ai、aj∈A,ai≠aj使得f(ai) = f(aj).
以及上函数和逆函数的概念,从case得到结果是一回事,从我们想要的结果推导出case的步骤就又是一个方面了。
今天发工资,回去吃好的~~不是为偷懒找借口啦!我周末会把书带回去看的!╭(╯^╰)╮
2013.9.9
第一部分 数学背景——第四章 测试人员的图论
4.1 图
定义:图G=(V,E)由节点的有限(并且非空)集合V和节点无序对偶集合E组成。
V={n1,n2,…,nm} E={e1,e2,…,ep} 其中每条边ek={ni,nj},ni、nj∈V。集合{ ni,nj}是一个无序对偶,记做(ni,nj)。
定义:节点的度是以该节点作为端点的边的条数。把节点n的度记做deg(n)。
定义:拥有m个节点和n条边的图G=(V,E)的关联矩阵是一种m*n矩阵,其中第i行第j列的元素是1,当且仅当节点i是边j的一个端点,否则该元素是0。
注意:(1)任何列的表项和为2,否则一定是出现了错误;(2)行的和为节点的度。
定义:拥有m个节点和n条边的图G=(V,E)的相邻矩阵是一种m*m矩阵,其中第i行第j列的元素是1,当且仅当节点i和节点j之间存在一条边,否则该元素是0。
定义:路径是一系列的边,对于序列中的任何相邻边对偶ei、ej,边都拥有相同的(节点)端点。
注意:路径可以描述为一系列边,也可以描述为一系列节点。一般更常见的是节点序列。
定义:节点ni和nj是被连接的,当且仅当它们都在同一条路径上。
1.连接性是自反的,因为每个节点显然都在到其本身长度为0的路径上。
2.连接性是对称的,由于如果ni和nj在一条路径上,则nj和ni也在同一条路径上。
定义:图的组件是相连节点的最大集合。
定义:给定图G = (V,E),其压缩图通过用压缩节点替代每个组件构成。
定义:图G的圈数由V(G) = e – n + p给出,其中:e是G中的边数;n是G中的节点数;p是G中的组件数。
注意:通过在测试中使用圈复杂度,则(通常)会得到强连接图,将生成较高圈复杂度的图。
4.2 有向图
定义:有向图(或框图)D = (V,E)包含:一个节点的有限集合V={n1,n2,…,nm} ,一个边的集合E = {e1,e2,…,ep},其中每条边ek = <ni,nj>是节点ni,nj∈V的一个有序对偶。
注意:有向图中的边适合很多软件概念:串行行为、命令是程序设计语言、按时间顺序的事件、定义/引用对偶、消息、函数和过程调用,and so on~
一般图和有向图之间的差别与说明式和命令式程序设计语言之间的差别有很强的类比性。
定义:有向图中节点的内度,是将该节点作为终止节点的不同边的条数。节点n的内度记做indeg(n)。
有向图中节点的外度,是将该节点作为开始节点的不同边的条数。节点n的外度记做outdeg(n)。
注意:一般图和有向图通过将明显的对应性联系起来的定义关联起来,例如deg(n) = indeg(n) + outdeg(n)。
定义:内度为0的节点是源节点。 外度为0的节点是吸收节点(汇节点)。 内度不为0,并且外度不为0的节点是传递节点。既是源节点又是汇节点的节点是孤立节点。
定义:有m个节点的有向图D = (V,E)的(有向图的)相邻矩阵是一种m×m矩阵:A = (a(i,j))。其中a(i,j)是1,当且仅当从节点i到节点j有一条边,否则该元素为0。
注意:有向图的相邻矩阵不一定是对称的,行的和是节点的外度,列的和是节点的内度。
定义:(有向)路径是一系列边,使得对于该序列中的所有相邻边对偶ei,ej来说,第一条边的终止节点是第二条边的初始节点。
注意: 环路是一个在同一个节点上开始和结束的有向路径。
(有向)半路径是一系列边,使得对于该序列中至少有一个相邻边对偶ei,ej来说,第一条边的初始节点是第二条边的初始节点,或第一条边的终止节点是第二条边的终止节点。
定义:有m个节点的有向图D = (V,E)的可达性矩阵是一种m×m矩阵R = (r(i,j)),其中r(i,j)是1,当且仅当从节点i到节点j有一条路径,否则该元素为0。
有向图D的可到达性矩阵可以通过相邻矩阵A计算如下:R = I+A+A2+A3+…+Ak。其中k是D最长路径的长度,I是单位矩阵。
定义:有向图中的两个节点ni和nj是(n-连接性):
0-连接,当且仅当ni和nj之间没有路径。
l-连接,当且仅当ni和nj之间有一条半路径,但是没有路径。
2-连接,当且仅当从ni和nj之间有一条路径。
3-连接,当且仅当从ni和nj有一条路径,并且从nj到ni有一条路径。
定义:有向图的强组件是3-连接节点的最大集合。
2013.9.10
第一部分 数学背景——第四章 测试人员的图论
4.3 用于测试的图
定义:给定一个采用命令式程序设计语言编写的程序,其程序图是一种有向图,其中:
1.(传统定义):节点是程序语句,边表示控制流(从节点i到节点j有一条边,当且仅当对应节点j的语句可以立即在节点i对应的语句之后执行)。
2.(经过改进的定义):节点要么是整个语句,要么是语句的一部分,边表示控制流(从节点i到节点j有一条边,当且仅当对应节点j的语句或语句的一部分,可以立即在节点i对应的语句或语句的一部分之后执行)。
程序图的问题:(1)如何处理非执行语句,例如注释;(2)与拓扑结构可能和语义可能的路径之间的差别有关。(这句话好绕口啊,这部分会在后面讲到,这里只是mark一下)
定义:有限状态机是一种有向图,其中状态是节点,转移是边。源状态和吸收状态是初始节点和终止节点,路径被建模为通路,等等。大多数有限状态机表示方法都要为边(转移)增加信息,以指示转移的原因和作为转移的结果要发生的行动。
(有限状态机是表示可能发生的各种事件,以及其发生产生的不同结果的简单方法。)
(为了执行有限状态机,我们要从初始状态(exist)开始,并提供引起状态转换的事件序列(exist),每次事件发生时,转移都会改变活动状态,并发生新的事件。)
定义:Petri网是一种双向有向图(P,T,In,Out),其中,P和T是不相交的节点集合,In和Out是边集合,In ⊆ P×T,Out ⊆ T×P。(P是要输入的节点,T是要输出的节点,In是输入关系,Out是输出关系。)
(双向图有两个节点集合V1和V2,以及一个边集合E,要求每条边在和集合之一种有自己的初始节点,在另一个节点集合中有自己的终止节点。)
定义:有标记的Petri网是一种5元组(P,T,In,Out,M),其中(P,T,In,Out)是一个Petri网,M是从地点到正整数的映射集合。
(集合M叫做Petri网的标记集合,M中的元素是n元组,其中n是集合P中的地点个数。对于左图的Petri网,集合M包含形式为<n1,n2,n3,n4,n5>d的元素,其中n是只想被称作“位于”该地点的记号个数的指针,这里Petri网的标记元组是<1,1,0,2,0>。 )
定义:转移可以在Petri网中发生,如果在其所有输入地点中至少有一个记号。 (上图中没有能够进行的转移时,若将一个记号放入P3,则转移t2就可以发生)
定义:当触发Petri网一个转移时,要从其每个输入地点删除一个记号,并在其每个删除地点增加一个记号。
定义:EDPN(事件驱动的Petri网)是一种多向图(P,D,S,In,Out),包括三个节点集合P、D和S,以及两个映射集合In和Out。
其中:P是端口事件的集合;D是数据地点的集合;S是转移的集合;In是(P∪D)×S的有序对偶集合;Out是S×(P∪D)的有序对偶集合。
(EDPN图的图形表示与一般Petri网很相似,惟一的差别是使用三角表示端口时间地点。)
(右图中有四个转移,即S7、S8、S9和S10;两个事件输入,即P3和P4;三个数据地点,即d5、d6和d7。没有端口输出事件。)
定义:EDPN(P,D,S,In,Out)的一个标记M,是p元组的一个序列M=<m1,m2,…>,其中p=k+n,k和n是集合P和D中的元素个数,p元组中的个体项表示事件或数据地点中的记号个数。
(EDP和传统的Petri网的一个重要差别,是可以通过在端口输入事件地点中创建一个记号分解事件静止。)
定义:Harel使用与方法无关的术语“团点”表示状态图的基本构件块。团点可以像维恩图显示集合包含那样地包含其他团点。团点还可以像在有向图中连接节点一样地通过边连接其他团点。
到这里为止,第一部分数学背景就看完了啦~从明天开始学习第二部分《功能性测试》,然后另开一篇来写吧,不然也太长了,O(∩_∩)O哈哈哈哈哈哈哈哈~