测试方法和测试用例设计

测试方法和测试用例设计

用户需求/原始需求

需求分析/规格说明书(评审过后,将不合理、无法做到的地方去掉以后的说明书)

测试需求(在需求分析的基础上,以测试团队的工作计划、方式的需要、工作优先级安排)

主要解决“测什么”的问题,即指明被测对象中什么需要测试。

功能是第一要务,按照测试团队的工作要求进行计划

在后期交流中,要不断验证客户需求,要保留文档

对于测试工程师:测试一般划分为功能性测试、非功能性测试

如果没有需求文档,先做冒烟测试,对软件大体有什么功能,进行了解,哪些是功能的重点,有多少功能点,把需求理出来

测试原则:

1. 所有测试活动应以需求为源头和驱动

2. 应尽早地和不断地进行测试

3. 完全测试(穷举测试)是不可能的,数据是无穷无尽的,总有测试不到的数据

4. 没有完美的软件和完美的测试

5. 应避免仅有程序员自己检查程序,避免随意性(避免随意测试)

6. 二八定律,把相对多的时间、成本、精力花在重要的模块、部分

7. Good enough 不做不充分的测试,也不做过多的测试,找到测试费用和测试量之间平衡点

8. 一定要有正确和错误验证

1、所有测试活动都应追溯到用户需求,测试活动应以需求(用户需求->需求规格说明书)为源头和驱动

2、应尽早地和不断地进行软件测试

3、完全测试(穷举测试)是不可能的,因为数据本身是无穷无尽的,总有无法测试到的数据、方面。没有完美的测试和完美的软件,只有未被发现的缺陷,没有不存在问题的软件

4、应充分注意测试中的集群现象:二八定律(把相对多数的时间花在重要的部分)

5、应避免只有程序员自己检查程序,尽量避免测试的随意性(即避免随机测试)

6、测试的Good Enough,不要做不充分的测试,也不做过多的测试,找到测试费用和测试量之间的平衡点,是最佳选择

制定测试内容和最低测试通过标准加以衡量(必要时具体问题具体分析)

7、兼顾合理的输入数据、操作对软件进行测试和不合理的输入数据、操作对软件进行测试

8、程序修改后要做回归测试(不论修改的多少,都要做回归测试)

测试的完成标准:

  1.   功能符合需求
    
  2.   被测系统所有的功能点都要被覆盖到(100%覆盖)  如果某个功能点被测试到了,就说该功能点被覆盖了(但凡是要交付到下一阶段的功能、内容,都必须覆盖到,所有功能点至少覆盖一次)
    
  3.   被测系统不允许出现严重程度为一、二、三级缺陷(致命错误、严重错误、一般错误)
    
  4.   所有的配置项必须完整(产业链的各个项目必须完整)
    

测试过程中遇到的问题:

不知道是否较全面的测试了所有功能

测试的覆盖率无法衡量

对新版本的重复测试很难实施

存在大量冗余测试影响测试效率

软件还未测试之前,就对需求进行设计,实用性要很强

测试用例

测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素。

解决要测什么、怎么测、如何衡量的问题

软件名、版本、模块、测试步骤、顺序、数据、预期结果(根据需求、设计,对可能的结果进行预测)

//测试用例一般可以划分为:场景测试用例(简称“测试用例”)和基本测试用例(给或称为“工用测试用例”)

定义:集合(测试环境、测试步骤、数据、代码、预期结果)

解决“测什么,怎么测,如何衡量”

测试是在测试执行之前设计、编写的文档/报告,它不一定会发现缺陷

缺陷报告是在测试执行完成之后,发现问题、缺陷的报告

作用:

1、 执行测试的有效依据(文档而非口头或主观)

2、 追溯测试的有效依据(可在做回归、缺陷分析时查看)

3、 衡量测试工作量的有效数据

4、 衡量测试人员工作量和工作质量的依据

5、 评估测试覆盖力度的依据(需求中的内容/功能点被测试涉及到了,就说它被覆盖了,需求/功能点覆盖100%)

6、 验证需求和寻找缺陷的重要手段

7、 为新版本或其他项目参考和累积测试经验

测试用例在什么时候开始

设计人员会根据需求进行设计,只要需求和设计文档到位,就可以开始编写测试用例

测试人员的时间周期比开发人员的时间周期长,测试人员早在需求阶段就进入测试阶段

1、如果需求、设计缺失或不完整,在软件完成后编写用例

2、需求、设计完整

熟悉需求、设计之后,在编码之前或实现过程中设计用例

3、软件代码、需求、设计变更后,测试用例需要变更

4、执行用例过程中或执行之后需要适时调整、修改

如何对软件执行操作动作、步骤?

操作步骤中输入些什么样的数据,数据有什么讲究,有什么范围,数据的营造

用合理的方式造出数据

黑盒测试与功能性测试、兼容性测试、自动化测试是平等的

黑盒设计用例的方法:(黑盒测试:以数据为驱动的功能性测试,不关注内部结构)

1、等价类

两位数加法计数器

需求:两位数范围内(-99~99),两个数求和

两位数包不包括小数?

衡量成本、时间,评估一下工作量,进行测试

加数1:[-99,99]

加数2:[-99,99]

工作量:199*199=39601

留哪些数据?为什么留这些数据?为什么砍掉其他数据?

等价类(解决了不能穷举测试的问题/极大的控制了测试成本在可接收范围内/控制测试用例的数量)

根据用户需求及其特点和数据本身的特点,将数据划分为有限的若干个类型,从每个类型中的抽取一个具有代表性的数据进行测试

如何利用现有的时间成本,将数据划分到什么地步

有效等价类

无效等价类

等价类1:[-99,99]

等价类2: <-99 因为无法找到小于-99同时大于99的数,因此,无效等价类分

等价类3: > 99 为两个

划分等价类的方法

1、在连续的数据取值范围中,至少可以划分三个等价类,其中1个有效等价类[0,100],2个无效等价类(<0)(>100)

有规律的数据,例如奇数、偶数,也可以用等价划分的方法

课堂练习:

微信红包(0,200]

分析需求特点,边界值的特点,是否需要取等于

等价类1 0<x<=200

等价类2 x<=0

等价类3 200>x

T0305样品软件

需求:一班学生学号[1,40]

​ 各科成绩[0,100]

一班学生学号

等价类1 [1,40]

等价类2 <1

等价类3 >40

等价类4 >200

成绩

等价类1 [0,100]

等价类2 <0

等价类3 >100

2、输入条件规定了必须输入某些数据,至少划分为一个有效等价类、一个无效等价类

3、输入数据只有两种可能,true、false/yes、no等,划分为一个有效等价类、一个无效等价类

4、确定一个有效等价类(多个条件都满足),若干个无效等价类(不满足长度要求或者不满足开头或者不满足组成,三个无效等价类)

5、在已知等价类的基础上,根据具体情况再划分

等价类细分的素材 例如:

非数值:

汉字

字母

其他字符

空白

6、规定了输入数据的一组值,并且对每个输入值分别处理,划分若干个有效等价类,一个无效等价类

建议尽可能在一个下拉框中,减少输入选项,可以增加下拉框控件数量

等价类划分步骤:

1、对输入数据进行分析(结合需求分析,数据本身特点的分析),再划分等价类

考虑输入数据的数据类型(输入类型)、数据范围(输入长度)

2、为等价类进行编号

3、每个等价类中的数据至少要用一次

9.25回顾

等价类划分方法

1、连续数据取值范围,可以分为一个有效,两个无效

2、规定输入某些无规律的数据取值集合,例如验证码,可以分为一个有效,一个无效

3、输入条件是布尔量true/fales,yes/no,可以分为一个有效,一个无效

4、由多个无关联的条件共同构成数据范围,例如Java标识符的命名规则,可以分为一个有效,多个无效

5、在已知等价类基础上,再进行细分

6、规定了输入数据是无规律的一组值,并且对每个输入值分别处理,例如下拉框,可划分为若干个有效,1个无效(除了下拉框中的,其他的都是无效的)

划分等价类标准

完备测试、避免冗余;

子集互不相交:保证无冗余,不会出现多个用例用到相同类型的数据;

所有子集相加即为数据总集(整个集合)。

等价类1 x>99

等价类2 x<-99

-99<=x<=99

等价类3 -99<=x<0

等价类4 x=0 若3和4中都包括0这个取值,那么会造成冗余

等价类5 0<x<=99

边界值

-99<=x<=99

if(-99<=x&&x<=99)

{

…//正确处理

}

if(x<-99||x>99)

{

…//错误处理

}

边界值是等价类派生出来的方法,只要有数据的取值范围,就肯定有边界值

开区间:一个连续的取值范围,大于最小值,小于最大值,不包括两个端点

1<x<10 (1,10)

闭区间:一个连续的取值范围,大于等于最小值,小于等于最大值,包括两个端点

1<=x<=10 [1,10]

上点:不区分开闭区间,边界上的点,1和10是上点

若是开区间,上点在域范围外

若是闭区间,上点在域范围外

内点:在取值范围内的任意一点,2,3,4等都是内点

离点:若是开区间,离点是范围内离上点最近的点,若是闭区间,离点就是范围外离上点最近的点

开区间(1,10),2和9就是离点,内收,因为1,10是无效值,所以还应取又消失

闭区间[1,10],0和11是离点,外放

边界值:上点和离点

(49,79):49,79,50,78

(49,79]:49,79,50,80

[49,79):49,79,48,78

回顾上午的知识:

边界值(等价类的补充/特例)

开区间:不包含最大值和最小值的数据取值范围 (1,10)

闭区间:包含最大值和最小值的数据取值范围 [1,10]

上点:边界上的点,最大值、最小值,不区分开闭区间

内点:取值范围内的任意一点

离点:区分开闭区间,离上点最近的点

开区间的离点是取值范围内离上点最近的点,内收,最小值+1个单位,最大值-1个单位,因为上点是无效值,故还应取有效值

闭区间的离点是取值范围外离上点最近的点,外放,最小值-1个单位,最大值+1个单位,因为上点是有效值,故还应取无效值

4+1理论,2个上点,2个离点,1个内点

6+1理论

[10,100] 边界值,9,10,100,101

(10,100) 边界值,10,11,99,100

不管开闭区间,六个边界值:9,10,11,99,100,101

若已知,开闭区间,会产生冗余,若需求不明确,或团队技术不高的情况可考虑采用6+1理论

回顾:

等价类的作用:解决不能穷举测试的问题,极大的控制成本在可接收范围内

等价类划分(根据需求的特点,数据本身的特点进行划分)

有效等价类:符合需求的数据

无效等价类:不符合需求的数据

等价类划分方法:

1、 连续数据取值范围,可划分为一个有效,两个无效

2、 规定输入的数据是无规律的一组值,并且对每个输入值分别进行处理,例如下拉框,可划分为若干个有效,一个无效(除了下拉框中的,都是无效的)

等价类缺点:数据值是不准确的,不精确的/数据值的准确性不一样

边界值:是等价类的补充,解决数据不准确的缺点

边界值的优点:数据值的准确性、判断数据的边界,解决了数据中极大极小值可能存在的问题

int i;

If(i>=1 && i<=12)

{

System.out.print(i+“月是月份”);//正确处理

}

If(i<1 ||1>12)

{

System.out.print(i+”不是月份”);//错误处理

}

等价类、边界值都是为黑盒测试设计数据的

4+1理论

开区间:包含最大值和最小值的数据取值范围 (1,12) 1<x<12

1,2,12,13

闭区间:不包含最大值和最小值的数据取值范围 [1,12] 1<=x<=12

0,1,12,13

上点:边界上的点,取值范围的两个端点

离点:离上点最近的点,在开区间中,离点是取值范围内离上点最近的点;

在闭区间中,离点是取值范围外离上点最近的点。

char c;

for(c=0;c<70000;c++)

{

System.out.print(c);

}

代码可编译,可运行,结果是死循环,

ping –l 5000 192.168.0.106 向IP地址为192.168.0.106发送字节数为50000的数据包

ping –t 5000 192.168.0.106 不间断的向IP地址为192.168.0.106发送字节数为32的数据包

ping –l 5000 192.168.0.106 -t 不间断的向IP地址为192.168.0.106发送字节数为50000的数据包

ping IP地址,向该IP地址发送数据包,数据包字节的取值范围为[0,65500]

端口号,采用短整型,[0,65536]

数据设计和制造

数据组合:因果图,正交排列(有较强的局限性)

掌握原理、目的、操作步骤

因果图:(质量控制,也称石川图/鱼骨图/树杈图)

输入的数据(因)

程序结果(果)

先分析因果关系

确定因与因,因与果之间的关系

用例评审标准:

1、100%覆盖需求、功能、控件

2、执行效率,文字说明不够清晰、步骤不严谨

等价类之间互不相交

将等价类中的数据进行等价分类,将有效等价类和无效等价类划分出来,再将它们进行组合

一个应用程序输入项目的个数很多,等价类个数偏多,组合更多,人工成本过大

因果图基本步骤:

1、 在程序中梳理输入项目,(再根据输入项目数据的特点)划分等价类(因)

2、 在程序中梳理得出预期结果(果)

3、考虑因之间的关系、产生的结果的组合(石川图)

4、判定驱动法形成判定表、对判定表进行优化(化简)

5、判定表的每一列即一条测试用例

解决问题:

分析数据之间组合产生的不同结果,从而设计测试用例/分析因与因之间的组合产生的不同结果,设计测试用例

原因为真,结果必为真

![img](file:///C:/Users/82426/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)

![img](file:///C:/Users/82426/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)与(并且):两个原因都为真,结果才为真

![img](file:///C:/Users/82426/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)或:有一个原因为真,结果就为真

![img](file:///C:/Users/82426/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)非:原因为假,结果为真

排他性约束:各个原因之间不能同时为真,但可以同时为假

![img](file:///C:/Users/82426/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)

在一个复杂的应用程序中,可以局部的使用因果图

使用因果图的方法写测试用例

1、 门槛相对较高(需要一定需求分析能力)

2、 需要较高的熟练度

3、 成本偏高(规模大、复杂度高)

正交

正交测试目标:

节省工作时间/节省测试用例设计时间,减少人工排列组合的时间

控制测试用例数量

具有比较均衡的覆盖率

优点:

节省测试用例设计时间,减少人工排列组合的时间

控制测试用例数量

具有比较均衡的覆盖率

特点:均匀分散、齐整可比(概率相同)

正交表必须满足这两个特点,有一条不满足,就不是正交表:

1、 每列中不同数字(水平)出现的次数相等

2、 在任意两列,其横向组成的数字对中,每种数字对出现的次数相等

因素:考察的变量/被测的输入项/ (外貌、家庭、个人、能力)

水平:因素被考察的值/输入项中的等价类/控件中的取值范围、等价类(身高、体重、颜值、背景、经济、性格、三观、年龄、经济、生活)

因素1:水平1、水平2… 每个因素的水平数量相等

因素1:水平1、水平2…

……

Ln(mk) Ln_k_m

n:表的行数,需要测试组合的次数/测试用例的数量

k:表的列数,控件个数/因素的数量

m:每个控件包含的取值个数/水平的数量

正交表的表示形式:L行数(水平数因素数)

L9(34)表示用例数量为9,因素数量为4,每个因素含3个水平

正交表类型

1、完全符合正交表(每个因素的水平相同,且符合正交规律)的整齐排列直接套用现成的正交表

2、部分符合正交表(每个因素的水平相同,但因素或水平无现成的正交表),将因素或水平适当增减向可能的正交表靠拢,如果是减则在正交表基础上适当人工增加用例

3、非整齐的排列借助正交公式缩减并计算出排列数量,再人工方式在最终的排列数量中按规律排列

正交表公式:N=(p1-1)q1+(p2-1)q2+…+1

p:水平的数量

q:拥有此水平数量的因素个数

N:最后求出的最后结果数量

1:校验值

a:a1 a2

b:b1 b2

c:c1 c2 c3

d:d1 d2 d3

e:e1 e2 e3 e4 e5 e6

N=(2-1)2+(3-1)2+(6-1)*1+1=12

状态图

数据、操作动作

状态图的分析使用步骤

  1.   列出被测系统的输入事件
    
  2.   对空闲状态(程序刚启动时的状态)加所有可能的输入,判断产生哪些新状态
    
  3.   对第二步产生的每个新状态分别加所有可能的输入
    
  4.   对第三步产生的每个新状态分别加所有可能的输入
    
  5.   对第四步产生的每个新状态分别加所有可能的输入
    
  6.   直到没有新状态产生
    

在空闲状态下,单独进行

第一轮

1、空闲->ip1->人民币金额已输入

2、空闲->ip2->国家已选择

3、空闲->ip3->国家未选择,人民币金额未输入

4、空闲->ip4->空闲

5、空闲->ip5->程序结束,退出

第二轮

1、人民币金额已输入->ip1->人民币金额已输入

6、人民币金额已输入->ip2->国家已选择,人民币金额已输入

7、人民币金额已输入->ip3->国家未选择,人民币金额已输入

4、人民币金额已输入->ip4->空闲

5、人民币金额已输入->ip5->程序结束,退出

第三轮

6、国家已选择->ip1->国家已选择,人民币金额已输入

2、国家已选择->ip2->国家已选择

8、国家已选择->ip3->国家已选择,人民币金额未输入

4、国家已选择->ip4->空闲

5、国家已选择->ip5->程序结束,退出

第四轮

7、国家未选择,人民币金额未输入->ip1->国家未选择,人民币金额已输入

6、国家未选择,人民币金额未输入->ip2->国家已选择,人民币金额未输入

3、国家未选择,人民币金额未输入->ip3->国家未选择,人民币金额未输入

4、国家未选择,人民币金额未输入->ip4->空闲

5、国家未选择,人民币金额未输入->ip5->程序结束,退出

4、国家未选择,人民币金额未输入->ip6->空闲

第五轮

6、国家已选择,人民币金额已输入->ip1->国家已选择,人民币金额已输入

6、国家已选择,人民币金额已输入->ip2->国家已选择,人民币金额已输入

9、国家已选择,人民币金额已输入->ip3->显示金额

4、国家已选择,人民币金额已输入->ip4->空闲

5、国家已选择,人民币金额已输入->ip5->程序结束,退出

第六轮

7、国家未选择,人民币金额已输入->ip1->国家未选择,人民币金额已输入

6、国家未选择,人民币金额已输入->ip2->国家已选择,人民币金额已输入

7、国家未选择,人民币金额已输入->ip3->国家未选择,人民币金额已输入

4、国家未选择,人民币金额已输入->ip4->空闲

5、国家未选择,人民币金额已输入->ip5->程序结束,退出

7、国家未选择,人民币金额已输入->ip6->国家未选择,人民币金额已输入

第七轮

6、国家已选择,人民币金额未输入->ip1->国家已选择,人民币金额已输入

8、国家已选择,人民币金额未输入->ip2->国家已选择,人民币金额未输入

8、国家已选择,人民币金额未输入->ip3->国家已选择,人民币金额未输入

4、国家已选择,人民币金额未输入->ip4->空闲

5、国家已选择,人民币金额未输入->ip5->程序结束,退出

7、国家已选择,人民币金额未输入->ip6->国家已选择,人民币金额未输入

测试点:给出错误提示,点击确定后,能否继续正确的完成操作

每种状态至少访问一次

被用户多次使用,常用的模块、状态要多次覆盖

优点

能够清晰地看出哪些状态未被覆盖到

能够清楚的计算出状态覆盖力度

1、思路清晰,要求我们事先做好设计思路,需求分析

2、测试用例的概述、测试点要清晰准确

3、测试步骤简洁,即别人看你的测试用例是,可以清晰地看到第一步做什么,第二步做什么

4、测试步骤清晰、具体,即不会产生歧义

5、无冗余即测试用例不要重复,每条用例的测试点要不一样

6、100%覆盖就是在设计用例时,用户需求、功能、控件都要涉及到

7、可复用性,即测试用例可反复使用,可执行性高

1、100%覆盖

2、预期结果是否确定、唯一

3、可执行性,语言描述是否清晰、步骤是否严谨

4、对中间、后台的数据的检查

正确保存,即数据能够完整、准确的保存到后台,

冗余:

在设计上存在等价类的子集相交(你在划分等价类的时候,就存在交集)

不是为了验证重复性或业务需求,多条用例的数据步骤完全一样

多条测试用例不能测试出需求、设计或程序或数据的不同类型和方面

考虑等价类、方法够不够

1、 需求点100%覆盖

2、 被测功能点、控件100%覆盖

3、 必须有正确数据、正确步骤和坑能导致出错的数据、步骤

4、 有数据值域的必须考虑数据值域覆盖:边界值、等价类

5、 所有边界值都必须覆盖

6、 等价类必须包含有效和无效等价类

7、 所有等价类都必须覆盖(等价类数量过多导致超过测试成本,优先考虑有效等价类,然后根据数据使用频率、机率高低分优先级,高级优先覆盖,同时考虑自动化测试)

8、 核心功能点必须被覆盖多次()

9、 测试用例数量要大于功能点的数量

原文地址:https://www.cnblogs.com/TD1900/p/11755181.html