一、测试理论
(一)、测试类型(软件测试分类) 1、软件开发角度 (1)单元测试 单元测试是对程序中单个?程序或具有独?功能的代码段进?测试的过程
(2)集成测试 集成测试在单元测试的基础上,先通过单元模块组装成系统或?系统,再进?测试。中带你是检查模块之间的接?是否正确。
(3)系统测试 系统测试针对整个产品进?测试,验证系统是否满?需求规格说明的定义,以及软件系统的正确性和性能等是否能满?。
(4)验收测试 验收测试是部署软件前(运维?程师进?代码部署操作)的最后?个测试,?的是确保软件准备就绪,向需求?展示软件能够满?需求,验收测试细分为α测试和β测试。 α测试:指的是由?户,测试?员,开发?员等共同参与的内部调试 ; β测试:指的是内测后的公测,即完全交给最终?户测试。 2、软件结构与算法角度 (1)黑盒测试 ?盒测试也称为功能测试,是通过测试来检测每个功能是否都能正常使?,在?盒测试中,把程序当 作?个不可开的?盒?,在完全不考虑程序内部特性的情况下,对程序接?进?测试,它只检查程序功能 是否按照需求规格说明书的规定正常使?,程序是否能适当的接受输?程序?产?正确的输出信息。 (2)白盒测试 ?盒测试?被称为结构测试,透明盒测试、逻辑驱动测试或基于代码测试,是对软件代码实现的细节做细致检查。对于?盒测试,测试员必须要全?了解程序的内部逻辑结构,对所有逻辑路径进?测试。 (3)灰盒测试 是介于?盒测试和?盒测试之间的,灰盒测试关注输出对于输?的正确性,但同时也关注内部实现,不过这种关注不像?盒测试那么详细,完整,知识通过?些表征性的现象,事件,标志来判断内部的运?状态, 有时候输出是正确的,但内部存在错误点。这种情况?常多,如果每次都通过?盒测试来操作,效率低,因此采?灰盒测试的?法。 3、软件测试面角度
(1)功能测试 主要检查实际功能是否符合?户的需求,因此测试的?部分?作也是围绕软件的功能进?。 功能测试也称为?为测试(behavioral testing) ,根据产品的性能,操作描述和?户?案,测试?个 产品的特性以确定他们满?的设计需求。 功能测试主要包含: 1)逻辑功能测试 2)界面测试 3)易用性测试 4)安装测试 5)兼容性测试(软件本身的兼容性和不同平台下的兼容性)
(2)性能测试 性能测试通过?动化的测试?具模拟多种正常,峰值以及异常负载条件 来对系统进?各项性能指标进?测试。中国软件测评中?将性能测试概括为三个??:应?在客户端性能的测试,应?在?络上的性能测试和应?在服务器端性能的测试。
通常情况下性能测试包括:时间性能和空间性能两种。 1) 时间性能:主要指软件的?个具体响应时间。例如?个注册需要的时间,?个商品购买需要的时间 等。抛开具体的测试环境,来分析?次事务的响应时间是没有任何意义的。需要单间好?个具体且独?的测试环境。 2)空间性能:主要指软件运?时所消耗的系统资源,如硬件资源,cpu,内存,?络消耗等。
(二)软件测试V模型 V 模型是软件测试过程中的常??种模型,它反映了开发过程和测试过程的关系,在测试软件中起着重要作?。 V模型中的过程是从左向右描述了基本开发过程和测试?为。V模型的价值在于它?常明确的表明了测试过 程中存在的不同级别,并且清楚的描述了这些测试阶段和开发过程各个阶段对应的关系。
需求分析: 主要明确客户需要的是什么?需要软件做成什么样?,还有那些功能。这点?较关键的是需求分析师 和客户沟通时理解能?和交互性。要求分析师能准确的把客户所需要达到的功能,实现?式,等表述出来,给出分析结果,写出需求规格说明书。
概要分析: 主要是架构的实现,指搭建架构,表述各模块功能、模块接?连接和数据传递的实现等各项事务。
详细设计: 对概要设计中表述的各个模块进?深?分析,对各个模块组合进?分析等,这?阶段要求达到伪代码级别,已经把程序的具体实现功能,现象等描述出来。其中需要包含数据库设计说明。
软件编码: 按照详细设计好的模块功能表,编程?员编写出实际的代码。 单元测试–> 集成测试–> 系统测试–> 验收测试(详见一、测试类型分类) (三)测试方法 1、冒烟测试 指在对?个新版本进??规模的系统测试之前,先验证软件的基本功能是否实现,是否具备可测性。
2、回归测试 指修改了旧代码后,重新进?测试以确认修改后没有引?新的错误或导致其他代码产?错误。
3、随机测试 是指测试中的所有输?数据都是随机?成的,其?的是模拟?户的真实操作,并发现?些边缘性错误。
4、安全测试 在软件产品的?命周期中,特别是产品开发过程基本完成到发布阶段,对产品进?检验,以验证产品符合 安全需求定义和产品质量标准的过程。
(四)测试用例设计方法 1、等价类划分方法 (1)定义 是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。
(2)划分等价类: 等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试,因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件就可以用少量代表性的测试数据取得较好的测试结果。等价类划分可有两种不同的情况:有效等价类和无效等价类。 1)有效等价类 是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。 2)无效等价类 与有效等价类的定义恰巧相反。无效等价类指对程序的规格说明是不合理的或无意义的输入数据所构成的集合。对于具体的问题,无效等价类至少应有一个,也可能有多个。 设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验,这样的测试才能确保软件具有更高的可靠性。
(3)划分等价类的标准: 1)完备测试、避免冗余; 2)划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合; 3)并是整个集合:完备性; 4)子集互不相交:保证一种形式的无冗余性; 5)同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到"相同的执行路径"。 (4)划分等价类的方法 1)在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。如:输入值是学生成绩,范围是0~100; 2)在输入条件规定了输入值的集合或者规定了"必须如何"的条件的情况下,可确立一个有效等价类和一个无效等价类; 3)在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。 4)在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。 例:输入条件说明学历可为:专科、本科、硕士、博士四种之一,则分别取这四种这四个值作为四个有效等价类,另外把四种学历之外的任何学历作为无效等价类。 5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则); 6)在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。
(5)设计测试用例 在确立了等价类后,可建立等价类表,列出所有划分出的等价类输入条件:有效等价类、无效等价类,然后从划分出的等价类中按以下三个原则设计测试用例: 1)为每一个等价类规定一个唯一的编号; 2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止; 3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。
2、边界值分析方法 (1)定义:边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。 (2)与等价划分的区别 1)边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件。 2)边界值分析不仅考虑输入条件,还要考虑输出空间产生的测试情况。 (3)边界值分析方法的考虑: 长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。 使用边界值分析方法设计测试用例,首先应确定边界情况。通常输入和输出等价类的边界,就是应着重测试的边界情况。应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。 (4)常见的边界值 1)对16-bit 的整数而言 32767 和 -32768 是边界 2)屏幕上光标在最左上、最右下位置 3)报表的第一行和最后一行 4)数组元素的第一个和最后一个 5)循环的第 0 次、第 1 次和倒数第2 次、最后一次 (5)边界值分析 1)边界值分析使用与等价类划分法相同的划分,只是边界值分析假定错误更多地存在于划分的边界上,因此在等价类的边界上以及两侧的情况设计测试用例。 例:测试计算平方根的函数 –输入:实数 –输出:实数 –规格说明:当输入一个0或比0大的数的时候,返回其正平方根;当输入一个小于0的数时,显示错误信息"平方根非法-输入值小于0"并返回0;库函数Print-Line可以用来输出错误信息。
2)等价类划分: I.可以考虑作出如下划分: a、输入 (i)<0 和 (ii)>=0 b、输出 (a)>=0 和 (b) Error II.测试用例有两个: a、输入4,输出2。对应于 (ii) 和(a) 。 b、输入-10,输出0和错误提示。对应于 (i) 和(b) 。 3)边界值分析: 划分(ii)的边界为0和最大正实数;划分(i)的边界为最小负实数和0。由此得到以下测试用例: a、输入{最小负实数} b、输入{绝对值很小的负数} c、输入0 d、输入{绝对值很小的正数} e、输入{最大正实数}
4)通常情况下,软件测试所包含的边界检验有几种类型:数字、字符、位置、重量、大小、速度、方位、尺寸、空间等。 5)相应地,以上类型的边界值应该在:最大/最小、首位/末位、上/下、最快/最慢、最高/最低、 最短/最长、 空/满等情况下。 6)利用边界值作为测试数据 7)内部边界值分析: 在多数情况下,边界值条件是基于应用程序的功能设计而需要考虑的因素,可以从软件的规格说明或常识中得到,也是最终用户可以很容易发现问题的。然而,在测试用例设计过程中,某些边界值条件是不需要呈现给用户的,或者说用户是很难注意到的,但同时确实属于检验范畴内的边界条件,称为内部边界值条件或子边界值条件。 内部边界值条件主要有下面几种: a)数值的边界值检验:计算机是基于二进制进行工作的,因此,软件的任何数值运算都有一定的范围限制。 b)字符的边界值检验:在计算机软件中,字符也是很重要的表示元素,其中ASCII和Unicode是常见的编码方式。下表中列出了一些常用字符对应的ASCII码值。 c)其它边界值检验
(6)基于边界值分析方法选择测试用例的原则 1)如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。 例如,如果程序的规格说明中规定:“重量在10公斤至50公斤范围内的邮件,其邮费计算公式为……”。作为测试用例,我们应取10及50,还应取10.01,49.99,9.99及50.01等。 2)如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。 比如,一个输入文件应包括1~255个记录,则测试用例可取1和255,还应取0及256等。 3)将规则1)和2)应用于输出条件,即设计测试用例使输出值达到边界值及其左右的值。 例如,某程序的规格说明要求计算出"每月保险金扣除额为0至1165.25元",其测试用例可取0.00及1165.24、还可取一0.01及1165.26等。 再如一程序属于情报检索系统,要求每次"最少显示1条、最多显示4条情报摘要",这时我们应考虑的测试用例包括1和4,还应包括0和5等。 4)如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。 5)如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。 6)分析规格说明,找出其它可能的边界条件。
3、因果图方法 (1)定义:是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。 (2)因果图法产生的背景: 等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的各种组合、输入条件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起来可能出错的情况却被忽视了。 如果在测试时必须考虑输入条件的各种组合,则可能的组合数目将是天文数字,因此必须考虑采用一种适合于描述多种条件的组合、相应产生多个动作的形式来进行测试用例的设计,这就需要利用因果图(逻辑模型)。 (3)因果图介绍 1)4种符号分别表示了规格说明中向4种因果关系。 2)因果图中使用了简单的逻辑符号,以直线联接左右结点。左结点表示输入状态(或称原因),右结点表示输出状态(或称结果)。 3)Ci表示原因,通常置于图的左部;ei表示结果,通常在图的右部。Ci和ei均可取值0或1,0表示某状态不出现,1表示某状态出现。 (4)因果图概念 1)关系 ①恒等:若ci是1,则ei也是1;否则ei为0。 ②非:若ci是1,则ei是0;否则ei是1。 ③或:若c1或c2或c3是1,则ei是1;否则ei为0。“或”可有任意个输入。 ④与:若c1和c2都是1,则ei为1;否则ei为0。“与”也可有任意个输入。 2)约束 输入状态相互之间还可能存在某些依赖关系,称为约束。例如, 某些输入条件本身不可能同时出现。输出状态之间也往往存在约束。在因果图中,用特定的符号标明这些约束。 A.输入条件的约束有以下4类: ① E约束(异):a和b中至多有一个可能为1,即a和b不能同时为1。 ② I约束(或):a、b和c中至少有一个必须是1,即 a、b 和c不能同时为0。 ③ O约束(唯一);a和b必须有一个,且仅有1个为1。 ④R约束(要求):a是1时,b必须是1,即不可能a是1时b是0。 B.输出条件约束类型 输出条件的约束只有M约束(强制):若结果a是1,则结果b强制为0。 (5)采用因果图法设计测试用例的步骤: 1)分析软件规格说明描述中, 那些是原因(即输入条件或输入条件的等价类),那些是结果(即输出条件), 并给每个原因和结果赋予一个标识符。 2)分析软件规格说明描述中的语义,找出原因与结果之间, 原因与原因之间对应的关系,根据这些关系,画出因果图。 3)由于语法或环境限制, 有些原因与原因之间,原因与结果之间的组合情况不可能出现,为表明这些特殊情况, 在因果图上用一些记号表明约束或限制条件。 4)把因果图转换为判定表。 5)把判定表的每一列拿出来作为依据,设计测试用例。
4、判定表驱动分析方法 (1)定义:判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。 (2)判定表的优点 能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。因此,利用判定表能够设计出完整的测试用例集合。 在一些数据处理问题当中,某些操作的实施依赖于多个逻辑条件的组合,即:针对不同逻辑条件的组合值,分别执行不同的操作。判定表很适合于处理这类问题。 (3)“阅读指南”判定表 (4)判定表通常由四个部分组成如下图所示。 1)条件桩(Condition Stub):列出了问题得所有条件。通常认为列出的条件的次序无关紧要。 2)动作桩(Action Stub):列出了问题规定可能采取的操作。这些操作的排列顺序没有约束。 3)条件项(Condition Entry):列出针对它左列条件的取值。在所有可能情况下的真假值。 4)动作项(Action Entry):列出在条件项的各种取值情况下应该采取的动作。 (5)规则及规则合并 1)规则:任何一个条件组合的特定取值及其相应要执行的操作称为规则。在判定表中贯穿条件项和动作项的一列就是一条规则。显然,判定表中列出多少组条件取值,也就有多少条规则,既条件项和动作项有多少列。 2)化简:就是规则合并有两条或多条规则具有相同的动作,并且其条件项之间存在着极为相似的关系。 (6)规则及规则合并举例 1)如下图左端,两规则动作项一样,条件项类似,在1、2条件项分别取Y、N时,无论条件3取何值,都执行同一操作。即要执行的动作与条件3无关。于是可合并。“-”表示与取值无关。 2)与上类似,下图中,无关条件项“-”可包含其他条件项取值,具有相同动作的规则可合并。 3)化简后的读书指南判定表
(7)判定表的建立步骤:(根据软件规格说明) 1)确定规则的个数.假如有n个条件。每个条件有两个取值(0,1),故有2n种规则。 2)列出所有的条件桩和动作桩。 3)填入条件项。 4)填入动作项。等到初始判定表。 5)简化,合并相似规则(相同动作)。
5、正交实验设计方法 利用因果图来设计测试用例时, 作为输入条件的原因与输出结果之间的因果关系,有时很难从软件需求规格说明中得到。往往因果关系非常庞大,以至于据此因果图而得到的测试用例数目多的惊人,给软件测试带来沉重的负担,为了有效地,合理地减少测试的工时与费用,可利用正交实验设计方法进行测试用例的设计。 正交实验设计方法:依据Galois理论,从大量的(实验)数据(测试例)中挑选适量的,有代表性的点(例),从而合理地安排实验(测试)的一种科学实验设计方法,类似的方法有:聚类分析方法,因子方法方法等。
利用正交实验设计测试用例的步骤: (1)提取功能说明,构造因子–状态表 把影响实验指标的条件称为因子.而影响实验因子的条件叫因子的状态.利用正交实验设计方法来设计测试用例时,首先要根据被测试软件的规格说明书找出影响其功能实现的操作对象和外部因素,把他们当作因子,而把各个因子的取值当作状态.对软件需求规格说明中的功能要求进行划分,把整体的概要性的功能要求进行层层分解与展开,分解成具体的有相对独立性的基本的功能要求.这样就可以把被测试软件中所有的因子都确定下来,并为确定个因子的权值提供参考的依据.确定因子与状态是设计测试用例的关键.因此要求尽可能全面的正确的确定取值,以确保测试用例的设计作到完整与有效。 (2)加权筛选,生成因素分析表 对因子与状态的选择可按其重要程度分别加权.可根据各个因子及状态的作用大小,出现频率的大小以及测试的需要,确定权值的大小。 (3)利用正交表构造测试数据集 正交表的推导依据Galois理论(这里省略,需要时可查数理统计方面的教材)。 利用正交实验设计方法设计测试用例,比使用等价类划分,边界值分析,因果图等方法有以下优点:节省测试工作工时;可控制生成的测试用例数量;测试用例具有一定的覆盖率。
6、功能图分析方法 一个程序的功能说明通常由动态说明和静态说明组成,动态说明描述了输入数据的次序或转移的次序,静态说明描述了输入条件与输出条件之间的对应关系.对于较复杂的程序,由于存在大量的组合情况,因此,仅用静态说明组成的规格说明对于测试来说往往是不够的.必须用动态说明来补充功能说明.功能图方法是用功能图FD形式化地表示程序的功能说明,并机械地生成功能图的测试用例。功能图模型由状态迁移图和逻辑功能模型构成,状态迁移图用于表示输入数据序列以及相应的输出数据。在状态迁移图中,由输入数据和当前状态决定输出数据和后续状态,逻辑功能模型用于表示在状态中输入条件和输出条件之间的对应关系,逻辑功能模型只适合于描述静态说明,输出数据仅由输入数据决定。测试用例则是由测试中经过的一系列状态和在每个状态中必须依靠输入/输出数据满足的一对条件组成。功能图方法其实是是一种黑盒白盒混合用例设计方法。 (功能图方法中,要用到逻辑覆盖和路径测试的概念和方法,其属白盒测试方法中的内容。逻辑覆盖是以程序内部的逻辑结构为基础的测试用例设计方法。该方法要求测试人员对程序的逻辑结构有清楚的了解。由于覆盖测试的目标不同,逻辑覆盖可分为:语句覆盖,判定覆盖,判定-条件覆盖,条件组合覆盖及路径覆盖。下面我们指的逻辑覆盖和路径是功能或系统水平上的,以区别与白盒测试中的程序内部的。) (1)功能图 功能图由状态迁移图和布尔函数组成。状态迁移图用状态和迁移来描述。一个状态指出数据输入的位置(或时间),而迁移则指明状态的改变。同时要依靠判定表或因果图表示的逻辑功能。例,一个简化的自动出纳机ATM的功能图。 (2)测试用例生成方法 从功能图生成测试用例,得到的测试用例数是可接受的。问题的关键的是如何从状态迁移图中选取测试用例。若用节点代替状态,用弧线代替迁移,则状态迁移图就可转化成一个程序的控制流程图形式。问题就转化为程序的路径测试问题(如白盒测试)问题了。 (3)测试用例生成规则 为了把状态迁移(测试路径)的测试用例与逻辑模型(局部测试用例)的测试用例组合起来,从功能图生成实用的测试用例,须定义下面的规则。在一个结构化的状态迁移(SST)中,定义三种形式的循环:顺序,选择和重复。但分辨一个状态迁移中的所有循环是有困难的(其表示图形省略)。 (4)从功能图生成测试用例的过程 1)生成局部测试用例:在每个状态中,从因果图生成局部测试用例,局部测试用例由原因值(输入数据)组合与对应的结果值(输出数据或状态)构成。 2)测试路径生成:利用上面的规则(三种)生成从初始状态到最后状态的测试路径。 3)测试用例合成:合成测试路径与功能图中每个状态中的局部测试用例,结果是初始状态到最后状态的一个状态序列,以及每个状态中输入数据与对应输出数据的组合。 5.测试用例的合成算法:采用条件构造树。
7、场景设计方法 现在的软件几乎都是用事件触发来控制流程的,事件触发时的情景便形成了场景,而同一事件不同的触发顺序和处理结果就形成事件流。这种在软件设计方面的思想也可以引入到软件测试中,可以比较生动地描绘出事件触发时的情景,有利于测试设计者设计测试用例,同时使测试用例更容易理解和执行。
8、错误推测方法 (1)定义:基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法。
(2) 错误推测方法的基本思想: 列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例。 1)例如, 输入数据和输出数据为0的情况;输入表格为空格或输入表格只有一行。 这些都是容易发生错误的情况。可选择这些情况下的例子作为测试用例。 2)例如,前面例子中成绩报告的程序,采用错误推测法还可补充设计一些测试用例: I. 程序是否把空格作为回答 II. 在回答记录中混有标准答案记录 III. 除了标题记录外,还有一些的记录最后一个字符即不是2也不是3 IV. 有两个学生的学号相同 V. 试题数是负数。 3) 再如,测试一个对线性表(比如数组)进行排序的程序,可推测列出以下几项需要特别测试的情况: I.输入的线性表为空表; II.表中只含有一个元素; III.输入表中所有元素已排好序; IV.输入表已按逆序排好; V.输入表中部分或全部元素相同。
9、测试用例设计综合策略 (1)Myers提出了使用各种测试方法的综合策略: 1)在任何情况下都必须使用边界值分析方法,经验表明用这种方法设计出测试用例发现程序错误的能力最强。 2)必要时用等价类划分方法补充一些测试用例。 3)用错误推测法再追加一些测试用例。 4)对照程序逻辑,检查已设计出的测试用例的逻辑覆盖程度,如果没有达到要求的覆盖标准,应当再补充足够的测试用例。 5)如果程序的功能说明中含有输入条件的组合情况,则一开始就可选用因果图法。 (2).测试用例的设计步骤 1)构造根据设计规格得出的基本功能测试用例; 2)边界值测试用例; 3)状态转换测试用例; 4)错误猜测测试用例; 5)异常测试用例; 7)压力测试用例。 (3).优化测试用例的方法 1)利用设计测试用例的8种方法不断的对测试用例进行分解与合并; 2)采用遗传算法理论进化测试用例; 3)在测试时利用发散思维构造测试用例。
(五)测试用例设计实例 在此只举例两个有效等价类方法实例 (1)设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的"日期检查功能"。 1)划分等价类并编号,下表等价类划分的结果 2)设计测试用例,以便覆盖所有的有效等价类在表中列出了3个有效等价类,编号分别为①、⑤、⑧,设计的测试用例如下: 测试数据 期望结果 覆盖的有效等价类 200211 输入有效 ①、⑤、⑧ 3)为每一个无效等价类设计一个测试用例,设计结果如下: 测试数据 期望结果 覆盖的无效等价类 95June 无效输入 ② 20036 无效输入 ③ 2001006 无效输入 ④ 198912 无效输入 ⑥ 200401 无效输入 ⑦ 200100 无效输入 ⑨ 200113 无效输入 ⑩
(2)NextDate 函数包含三个变量:month、 day 和 year ,函数的输出为输入日期后一天的日期。 例如,输入为 2006年3月 7日,则函数的输出为 2006年3月8日。要求输入变量 month 、 day 和 year 均为整数值,并且满足下列条件: ①1≤month≤12 ②1≤day≤31 ③1920≤year≤2050 1)有效等价类为: M1={月份:1≤月份≤12} D1={日期:1≤日期≤31} Y1={年:1812≤年≤2012} 2)若条件 ①~ ③中任何一个条件失效,则NextDate 函数都会产生一个输出,指明相应的变量超出取值范围,比如 "month 的值不在 1-12 范围当中 " 。显然还存在着大量的 year 、 month 、 day 的无效组合, NextDate 函数将这些组合作统一的输出: " 无效输入日期 " 。其无效等价类为: M2={月份:月份<1} M3={月份:月份>12} D2={日期:日期<1} D3={日期:日期>31} Y2={年:年<1812} Y3={年:年>2012} 弱一般等价类测试用例 月份 日期 年 预期输出 6 15 1912 1912年6月16日 强一般等价类测试用例同弱一般等价类测试用例 注:弱–有单缺陷假设;健壮–考虑了无效值
(一)弱健壮等价类测试 用例ID 月份 日期 年 预期输出 WR1 6 15 1912 1912年6月16日 WR2 -1 15 1912 月份不在1~12中 WR3 13 15 1912 月份不在1~12中 WR4 6 -1 1912 日期不在1~31中 WR5 6 32 1912 日期不在1~31中 WR6 6 15 1811 年份不在1812~2012中 WR7 6 15 2013 年份不在1812~2012中 (二)强健壮等价类测试 用例ID 月份 日期 年 预期输出 SR1 -1 15 1912 月份不在1~12中 SR2 6 -1 1912 日期不在1~31中 SR3 6 15 1811 年份不在1812~2012中 SR4 -1 -1 1912 两个无效一个有效 SR5 6 -1 1811 两个无效一个有效 SR6 -1 15 1811 两个无效一个有效 SR7 -1 -1 1811 三个无效
(六)什么是软件缺陷 软件缺陷,通常又被叫做Bug或者defect,即为软件或程序中存在的某种破坏正常运行能力的问题、错误、其存在会导致软件产品在某种程度上不能满足用户的需求。 软件缺陷是指存在于软件(程序、数据、文档)中的那些不符合用户需求的问题。
1、软件未到达客户需求的功能和性能 2、软件出现了需求规格说明书指明不会出现错误的地方 3、软件的功能超出了需求规格说明书指明的范围 4、软件出现客户需求不能容忍的错误 5、软件的使用未能符合客户的习惯和工作环境
(七)你对测试的理解 1、定义角度 测试?作是检验软件系统是否满?软件?户的需求,寻找软件中的bug,越早发现越好,确认bug的可重复性以及bug产?的步骤,确认bug是否被解决。 测试?法,测试计划,测试平台,测试代码,测试?例,测试?档,测试报告的确定,编写和执?。
2、目的角度 ?产软件的最终?的是为了满?客户的需求,我们以客户的需求作为评判软件质量的标准,将软件的缺陷总结如下:
- 软件为达到客户需求的功能和性能
2)软件查出了客户需求的范围 3)软件出现客户需求不能容忍的错误 4)软件的使?未能符合客户的习惯和?作环境
二、HTTP协议
详见HTTP总结
1、HTTP工作原理 2、状态码
**
三、接口测试:PostMan工具
(一)接口测试步骤 1、测试接口文档(需求文档(文档评审) ) 2、根据需求文档设定测试计划 3、编写测试用例(用例编写完全可以按照以往规则来编写,例如等价类划分,边界值等设计方法) 4、执行测试用例(查看不同的参数请求,接口的返回的数据是否达到预期) 5、编写测试报告
(二)get请求和post请求 http请求常见的是get,post请求。 Get请求和post请求的区别:
1、url可见性 get请求参数url可见; post请求url参数不可见
2、传输参数 get请求在params中体现在url中 post请求书写在body中,不体现在url中
3、缓存性 get请求是可以缓存的 post请求不可以缓存
4、后退页面的反应 get请求页面后退时,不产生影响 post请求页面后退时,会重新提交请求
5、传输数据的大小 get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大) post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大
6、安全性 原则上post请求比get请求安全,因为其传输参数时url不可见,但若是有人抓包,也是可以看见的。
7、数据包 get产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据); post产生两个TCP数据包。对于post请求,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。 在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有浏览器都会在post中发送两次包,Firefox就只发送一次。
(三)如何使用PostMan做接口测试 1、什么是接口测试? 接口测试也属于功能测试。接口测试是测试系统组件间一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
2、为什么要做接口测试? (1)现在很多系统前后端架构是分离的,从安全层面来说,只依赖前端进行限制已经完全不能满足系统的安全要求(绕过前端太容易了), 需要后端同样进行控制,在这种情况下就需要从接口层面进行验证。 (2)如今系统越来越复杂,传统的靠前端测试已经大大降低了效率,而且现在我们都推崇测试前移,希望测试能更早的介入测试,那接口测试就是一种及早介入的方式。例如传统测试,你是不是得等前后端都完成你才能进行测试,才能进行自动化代码编写。 而如果是接口测试,只需要前后端定义好接口,那这时自动化就可以介入编写接口自动化测试代码,手工测试只需要后端代码完成就可以介入测试后端逻辑而不用等待前端工作完成。
3、如何使用PostMan进行接口测试? 流程:需求文档 -> 根据需求文档设定测试计划 -> 测试用例 ->执行 -> 测试报告 打开postman 输入开发人员给的接口地址,选择Http请求,点击“send”按钮,即可查看返回结果
(四)组件区别 1、Head navigation bar (头部导航栏):此部分有以下选项内容需要了解:
(1)New(新建按钮):可以用来新建集合、请求、mock服务、监听器、测试环境等(重要); (2)import(导入按钮):可以用来导入文件 信息、集合、文件夹、以及链接(tab); (3)Runner(运行按钮):用于运行集合(重要); (4)新窗口增加按钮:可以用来增加新的postman窗口、运行窗口、以及请求页签(tab); (5):构建器和团队选项,可以用于团队库和当前视图的转换; (6)抓取api请求图标:可以通过次按钮抓取api(不常用) (7) 同步状态图标:同步apid 请求已达到共享; (8)设置图标:管理postman的应用程序,设置postman主界面;
2、Side navigation bar :次部分包含内容如下:
(1)History:用postman发起过的任何请求,都会保存在历史选项卡里; (2)Collections:集合选项卡,可以是每个请求的集合、也可以是URL的集合;
3、work space:工作空间是postman使用的重点,对其务必熟悉;postman通过选项卡的形式在构建器中发送和管理的请求信息;上部分是请求构建器,下部分是相应构建器; 具体说明如下:
面对post请求如何使用postman进行测试; 用postman进行get请求。
四、性能测试:JMeter工具
(一)性能测试步骤
(二)单个接口测试 1、 添加线程组 在“测试计划”上右击->添加-> threads(Users)->线程组 2、添加http请求 在”线程组“打开右击–> 添加–>sampler -> http请求 添加完http请求后,填写对应的域名,接口以及请求参数 3 添加断言 在每一个http请求下,都应该添加一层判断机制(response的关键字),及添加结果断言。 在“http请求”右击–>添加–>Assertions–>reponse Assertion 查看请求结果 在”线程组“右击–> 添加–>监听器–>查看结果树,断言结果,聚合报告 1)查看结果树:打开查看结果树,绿色代表测试通过,红色代表测试失败。在此可以看到详细的请求头,响应时间,请求参数和返回结果,方便进行接口调试 2)断言结果:断言结果是查看返回的数据是否符合给定的断言 3)查看聚合报告 Label: 每个JMeter的请求都有一个Name属性,这里显示的就是Name属性的值。 #Samples:表示本次测试中一共发出多少个请求 Average:平均响应时间 Median:也就是50%用户的响应时间 90%Line: 90%用户的响应时间 Min:最小响应时间 Max:最大响应时间 Error%:本次测试中出现错误的请求的数量/请求的总数 Throughput:吞吐量——默认情况下表示每秒完成的请求数 KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
(三)多个接口测试 1、正则表达式 所谓正则表达式,即一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。 在“http请求”打开鼠标右键–>添加–>post processions–>Regular Expression Extractor Name of created variable:正则表达式名称,我们使用${名称}来进行引用; Regular Expression:设置提取规则
. 匹配任何字符
+ 一次或更多次
? 停止在第一个匹配成功时
Templates:表示用哪个正则表达式模板获取的值 ,默认使用
1
1
1,如果有多个正则表达式,则可以使用
2
2
2,
3
3
3等,表示解析到的第几个值给test。 Match No.:-1表示全部,0随机,1第一个,2第二个 Default value:如果没有取到值,则默认使用该值,可以为空 2、 Json Path Extractor 使用Json Path Extractor需要下载第三方插件,访问此链接下载plugin Manager,并将下载下来的jar包放到JMeter的lib/ext目录下,重启JMeter。 重启后,在options菜单下点击“plugins Manager”,在available plugins中,搜索json path extractor,点击apply changes andrestart jmeter即可。
(四)压测 压力测试分两种场景:一种是单场景,压一个接口的;第二种是混合场景,多个有关联的接口。压测时间,一般场景都运行10-15分钟。如果是疲劳测试,可以压一天或一周,根据实际情况来定。
1 、压测任务需求的确认 压测前要明确压测功能和压测指标,一般需要确定的几个问题: (1)固定接口参数进行压测还是进行接口参数随机化压测? (2)要求支持多少并发数? (3)TPS(每秒钟处理事务数)目标多少?响应时间要达到多少? (4)压服务器名称还是压服务器IP,一般都是压测指定的服务器 2、压测设置 (1)线程数:并发数量,能跑多少量。具体说是一次存在多少用户同时访问 (2)Rame-Up Period(in seconds):表示JMeter每隔多少秒发动并发。理解成准备时长:设置虚拟用户数需要多长时间全部启动。如果线程数是20,准备时长为10,那么需要10秒钟启动20个数量,也就是每秒钟启动2个线程。 (3)循环次数:这个设置不会改变并发数,可以延长并发时间。总请求数=线程数*循环次数 (4)调度器:设置压测的启动时间、结束时间、持续时间和启动延迟时间。 3、 压测结果查看 ??运行完后,聚合报告会显示压测的结果。主要观察Samples、Average、error、Throughput。 (1)Samples:表示一共发出的请求数 (2)Average:平均响应时间,默认情况下是单个Request的平均响应时间(ms) (3)Error%:测试出现的错误请求数量百分比。若出现错误就要看服务端的日志,配合开发查找定位原因 (4)Throughput:简称tps,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,tps越高说明服务器处理能力越好。 4、压测结果的分析 (1)有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内; (2)Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数; (3)压测结束,·登陆相应的web服务器查看CPU等性能指标,进行数据的分析; (4)最大的tps:不断的增加并发数,加到tps达到一定值开始出现下降,那么那个值就是最大的tps。 (5)最大的并发数:最大的并发数和最大的tps是不同的概率,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。 (6)压测过程出现性能瓶颈,若压力机任务管理器查看到的cpu、网络和cpu都正常,未达到90%以上,则可以说明服务器有问题,压力机没有问题。 (7)影响性能考虑点包括:数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面。
五、Web自动化测试:Selelium工具
(一)自动化测试原理 1、是把以人为驱动的测试转化为机器执行的一种过程,它是一种以程序测试程序的过程。
2、自动化测试分类:
一般IT上所说的自动化测试是指功能自动化测试,通过编码的方式用一段程序来测试一个软件的功能,这样就可以重复执行程序来进行重复测试的目的。如果一个软件有小部分功能发生改变,只要修改一部分自动化测试代码,就可以重复对软件进行测试,从而提高测试效率。
3、什么样的项目适合做自动化测试:
一般情况下,只要满足如下三个情况就可以开展自动化测试 软件需求变更不频繁、项目周期较长、自动化测试脚本可重复使用
4、 selenium WebDriver(selenium3) 提供了web自动化的各种语言(java,python,ruby等)调用接口库 通过各种浏览器的驱动(web driver)来驱动浏览器的 (二)WebDrive中API使用 常用的Python+selenium方法函数: 1、加载浏览器驱动: webdriver.Firefox()
2、打开页面:get()
3、关闭浏览器:quit()
4、最大化窗口: maximize_window()
5、设置窗口参数:set_window_size(600,800)
6、后退到前一页: back()
7、前进到后一页: forward()
8、刷新页面: refresh()
9、获得title并打印
from selenium import webdriver
title = driver.title
print title
if title = = u "百度一下,你就知道" :
print "title yes!"
else :
print "title no!"
url = driver.current_url
print url
10、元素定位:
(1)id定位:find_element_by_id() (2)name定位:find_element_by_name() (3)class定位:find_element_by_class() (4)tag定位:find_element_by_tag_name() (5)link定位:find_element_by_link_text() (6)partial link 定位: find_element_by_partial_link_text() (7)Xpath定位: a.绝对路径:find_element_by_xpath(“绝对路径”) b.元素属性:find_element_by_xpath("//unput[@id=‘kw’]") c.层级与属性结合 find_element_by_xpath("//form[@id=‘loginForm’]/ul/input[1]") d.逻辑运算符:find_element_by_xpath("//input[@id=‘kw’ and@class=‘s_ipt’]") (8)CSS定位:find_element_by_css_selector()
11、清除文本:clear()
12、模拟按键输入:send_keys(*value)
13、单击元素:click()
14、提交表单(相当于"回车"):submit()
15、鼠标事件: ActionChains 类提供了鼠标操作的常用方法:
引入ActionChains类:
from selenium.webdriver.common.action_chains import ActionChains
perform():执行所有ActionsChains中存储的行为 context_click() 右击 如:
RightClick = driver.find_element_by_id("id")
ActionChains(driver).context_click(RightClick).perform()
double_click() 双击 如:
DoubleClick = driver.find_element_by_name("name")
ActionChains(driver).double_click(DoubleClick).perform()
drag_and_drop(source, target) 鼠标拖放 source:鼠标按下的源元素;target:鼠标释放的目标元素 如:
:`element = driver.find_element_by_name("name")`
target = driver.find_element_by_name("name")
ActionChains(driver).drag_and_drop(element, target).perform()
move_to_element() 鼠标悬停在一个元素上(出现下拉列表框) 如:
above = driver.find_element_by_xpath("xpath路径")
ActionChains(driver).move_to_element(above).perform()
click_and_hold() 按下鼠标左键在一个元素上 如:
left = driver.find_element_by_name("name")
ActionChains(driver).click_and_hold(left).perform()
Python代码:
from selenium.webdriver.common.action_chains import ActionChains
element=driver.find_element_by_css_selector("#kw")
ActionChains(driver).context_click(element).perform()
16、键盘事件 Python代码:
from selenium.webdriver.common.keys import Keys
driver.find_element_by_css_selector("#kw").send_keys(Keys.CONTROL,'a')
16.元素等待:
(1)显示等待
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,'kw')))
(2)隐式等待
from selenium.common.exceptions import NoSuchElementException
drive.implicitly_wait(10)
17.定位一组元素:
- find_elements_by_id()
- find_elements_by_name()
- find_elements_by_class()
- find_elements_by_tag_name()
- find_elements_by_link_text()
- find_elements_by_partial_link_text()
- find_elements_by_xpath()
- find_elements_by_css_selector()
driver.find_elements_by_xpath("//input[@type='checkbox']")
driver.find_elements_by_css_selector('input[type=checkbox]')
slector=Select(driver.find_element_by_css_selector("[name='CookieDate']"))
slector.select_by_index(1)
18.多表单切换:switch_to.frame()
19.多窗口切换:switch_to.window() 当前句柄:current_window_handle 所有句柄:window_handles
20.警告框处理:switch_to_alert() text:返回所有alert/confirm/prompt中的文字信息 accept():接受现有警告框 dismiss():解散现有警告框 send_keys(keysToSend):发送文本至警告框
21.文件上传:send_keys()
driver.find_element_by_css_selector(".uploadpic").send_keys(r'E:\picture\s.png')
22.cookie处理: get_cookies():获得所有cookie信息 get_cookie(name):返回字典的key为“name”的cookie信息 add_cookie(cookie_dict):添加cookie。“cookie_dict”指字典对象,必须有name和value值 delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域” delete_all_cookies():删除所有cookie信息
23.滚动条设置(2种方式):
js = "var action=document.documentElement.scrollTop=10000"
driver.execute_script(js)
driver.set_window_size(600, 600)
js = "window.scrollTo(100,450);"
driver.execute_script(js)
24.窗口截图:get_screenshot_as_file()
25.关闭窗口:close()
26.生成随机数:radint()
|