测试方法和测试用例设计
测试方法和测试用例设计
用户需求/原始需求
需求分析/规格说明书(评审过后,将不合理、无法做到的地方去掉以后的说明书)
测试需求(在需求分析的基础上,以测试团队的工作计划、方式的需要、工作优先级安排)
主要解决“测什么”的问题,即指明被测对象中什么需要测试。
功能是第一要务,按照测试团队的工作要求进行计划
在后期交流中,要不断验证客户需求,要保留文档
对于测试工程师:测试一般划分为功能性测试、非功能性测试
如果没有需求文档,先做冒烟测试,对软件大体有什么功能,进行了解,哪些是功能的重点,有多少功能点,把需求理出来
测试原则:
\1. 所有测试活动应以需求为源头和驱动
\2. 应尽早地和不断地进行测试
\3. 完全测试(穷举测试)是不可能的,数据是无穷无尽的,总有测试不到的数据
\4. 没有完美的软件和完美的测试
\5. 应避免仅有程序员自己检查程序,避免随意性(避免随意测试)
\6. 二八定律,把相对多的时间、成本、精力花在重要的模块、部分
\7. Good enough 不做不充分的测试,也不做过多的测试,找到测试费用和测试量之间平衡点
\8. 一定要有正确和错误验证
1、所有测试活动都应追溯到用户需求,测试活动应以需求(用户需求->需求规格说明书)为源头和驱动
2、应尽早地和不断地进行软件测试
3、完全测试(穷举测试)是不可能的,因为数据本身是无穷无尽的,总有无法测试到的数据、方面。没有完美的测试和完美的软件,只有未被发现的缺陷,没有不存在问题的软件
4、应充分注意测试中的集群现象:二八定律(把相对多数的时间花在重要的部分)
5、应避免只有程序员自己检查程序,尽量避免测试的随意性(即避免随机测试)
6、测试的Good Enough,不要做不充分的测试,也不做过多的测试,找到测试费用和测试量之间的平衡点,是最佳选择
制定测试内容和最低测试通过标准加以衡量(必要时具体问题具体分析)
7、兼顾合理的输入数据、操作对软件进行测试和不合理的输入数据、操作对软件进行测试
8、程序修改后要做回归测试(不论修改的多少,都要做回归测试)
测试的完成标准:
-
功能符合需求
-
被测系统所有的功能点都要被覆盖到(100%覆盖) 如果某个功能点被测试到了,就说该功能点被覆盖了(但凡是要交付到下一阶段的功能、内容,都必须覆盖到,所有功能点至少覆盖一次)
-
被测系统不允许出现严重程度为一、二、三级缺陷(致命错误、严重错误、一般错误)
-
所有的配置项必须完整(产业链的各个项目必须完整)
测试过程中遇到的问题:
不知道是否较全面的测试了所有功能
测试的覆盖率无法衡量
对新版本的重复测试很难实施
存在大量冗余测试影响测试效率
软件还未测试之前,就对需求进行设计,实用性要很强
测试用例
测试用例(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、空闲->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、 测试用例数量要大于功能点的数量