其实是没有前七次实验的
因为第八次实验是考试,复习了前七次实验的内容。
所以这个第八次实验是个伪命题hiahiahia
文章目录
- 一、软件测试
- 1.1 概述
- 1.2 软件生命周期
- 1.2 软件测试原则
- 1.3 测试分类
- 二、黑盒测试
- 2.1 概述
- 2.2 等价类划分法
- 2.2.1 概述
- 2.2.2 等价类
- 2.2.3 划分原则
- 2.2.5 划分步骤
- 2.3 示例
- 2.3.1 题目要求
- 2.3.2 等价类划分表
- 2.3.3 测试用例
- 2.3.3.1 有效等价类
- 2.3.3.2 无效等价类
- 三、白盒测试
- 3.1 概述
- 3.2 逻辑覆盖法
- 3.3 分支覆盖
- 3.4 示例
- 3.4.1 题目要求
- 3.4.2 流程图及分支标注
- 3.4.3 分支覆盖及用例列表
- 四、实验1:三角形类型判断
- 4.1 问题描述
- 4.2 参考等价类划分
- 五、往届试题
- 5.1 11年试题:标识符判断
- 5.1.1 题目描述
- 5.1.2 参考等价类划分
- 5.1.3 参考测试用例
- 5.2 15年试题:标识符判断加工
- 5.3 12年试题:用户名正确性测试
- 5.3.1 题目描述
- 5.3.2 参考等价类划分
- 5.3.3 参考测试用例
- 5.4 14年试题(一):测试抄错的代码
- 5.4.1 题目描述
- 5.4.2 参考流程图
- 5.4.3 参考测试用例
- 5.5 14年试题(二):电话号码
- 5.5.1 题目描述
- 5.5.2 参考等价类划分
- 5.5.3 参考测试用例
- 六、参考资料
一、软件测试
1.1 概述
软件测试是为了发现程序中的错误而执行程序的过程,贯穿于软件生命周期,其目的是尽早发现软件缺陷,并确保其得以修复。再全面的测试也不能完全消除软件缺陷,希望完全依托测试确保软件质量是不现实的。
1.2 软件生命周期
从软件工程的角度来看,软件的生命周期一般分为4部分:
- 软件分析时期
- 软件设计时期
- 编码和测试时期
- 软件运行与维护时期
在编码的同时,也进行着单元测试。
1.2 软件测试原则
- 完全测试是不可能的。测试并不能找出所有错误。
- 测试中存在风险。
- 软件测试只能表示缺陷的存在,而不能证明软件产品已经没有缺陷。
- 软件产品中潜在的错误数与已发现的错误数成正比。
- 让不同的测试人员参与到测试工作中。
- 让开发小组和测试小组分立。
- 尽早并不断进行测试。
- 在设计测试用例时,应该包括输入数据和预期的输出结果两部分。
- 集中测试容易出错或错误较多的模块。
- 长期保留所有的测试用例。
1.3 测试分类
二、黑盒测试
2.1 概述
将被测试的软件系统看成一个黑盒子,不关心盒子的内部结构和内部特性,只关心软件产品的输入数据和输出结果。
黑盒测试的测试方法有等价类划分法、边界值分析法、错误推测法和因果图法。
2.2 等价类划分法
2.2.1 概述
将程序的输入域划分为若干子集,然后从每个子集中选取少数具有代表性的数据用作测试用例。所选取的输入数据对于揭露程序中的错误都是等效的。
2.2.2 等价类
等价类分为有效等价类和无效等价类:
- 有效等价类:对程序的规格说明是有意义的、合理的输入数据所构成的集合。
- 无效等价类:对程序的规格说明是无意义的、不合理的输入数据所构成的集合
2.2.3 划分原则
划分等价类时遵循的原则:
- 如果输入条件规定了取值范围或个数,则可确定一个有效等价类和两个无效等价类。例如,如果输入值x在0到100之间,那么有效等价类是0<=x<=100,无效等价类是x<0和x>100。
- 如果输入条件规定了输入值的集合或是规定了“必须如何”的条件,则可以确定一个有效等价类和一个无效等价类。例如,如果输入值是日期类型,那么有效等价类是日期类型的数据,无效等价类是非日期类型的数据。
- 如果输入条件是布尔表达式,则可以分为一个有效等价类和一个无效等价类。例如,如果要求密码非空,则有效等价类为非空密码,无效等价类为空密码。
- 如果输入条件是一组值,且程序对不同的值有不同的处理方式,则每个允许的输入值对应一个有效等价类,所有不允许的输入值的集合为一个无效等价类。例如,如果级别的值是初级、中级、高级,则有效等价类应该有三个,分别为初级、中级、高级,无效等价类有一个,为其他任何级别。
- 如果规定了输入数据必须遵循的规则,则可划分出一个有效等价类(符合规则)和若干个无效等价类(从不同的角度违反规则)
2.2.5 划分步骤
- 对每个输入和外部条件进行等价划分,画出等价类表,并为每个等价类进行编号。
- 设计一个测试用例,使其尽可能多地覆盖有效等价类,重复这一步直到其有效等价类被覆盖。
- 为每一个无效等价类设计一个测试用例。
2.3 示例
2.3.1 题目要求
测试一个函数dateValidation(int year, int month, int day),功能是验证输入日期是否合法。
输入三个变量(年、月、日),函数返回布尔值,判断该日期是否合法:1≤月份≤12,1≤日期≤31,2000≤年份≤2019。
2.3.2 等价类划分表
输入及外部条件 | 有效等价类 | 等价类编号 | 无效等价类 | 等价类编号 |
日期的类型 | 数字字符 | 1 | 非数字字符 | 8 |
year | 2000<=year<=2019 | 2 | year<2000 year>2019 | 9 10 |
month | 1<=month<=12 | 3 | month<1 month>12 | 11 12 |
非闰年的2月 | 1<=day<=28 | 4 | day<1 day>28 | 13 14 |
闰年的2月 | 1<=day<=29 | 5 | day<1 day>29 | 15 16 |
month ϵ {1,3,5,7,8,10,12} | 1<=day<=31 | 6 | day<1 day>31 | 17 18 |
month ϵ {4,6,9,11} | 1<=day<=30 | 7 | day<1 day>30 | 19 20 |
2.3.3 测试用例
2.3.3.1 有效等价类
序号 | 输入数据 | 预期输出 | 覆盖范围(等价类编号) | ||
year | month | day | |||
1 | 2008 | 1 | 9 | TRUE | 1,2,3,6 |
2 | 2008 | 2 | 29 | TRUE | 1,2,3,5 |
3 | 2008 | 4 | 30 | TRUE | 1,2,3,7 |
4 | 2018 | 2 | 28 | TRUE | 1,2,3,4 |
2.3.3.2 无效等价类
序号 | 输入数据 | 预期输出 | 覆盖范围(等价类编号) | ||
year | month | day | |||
1 | x | 2 | 29 | FALSE | 8 |
2 | 1234 | 3 | 2 | FALSE | 9 |
3 | 2222 | 3 | 2 | FALSE | 10 |
4 | 2018 | 0 | 3 | FALSE | 11 |
5 | 2018 | 13 | 1 | FALSE | 12 |
6 | 2018 | 2 | 0 | FALSE | 13 |
7 | 2018 | 2 | 29 | FALSE | 14 |
8 | 2004 | 2 | 0 | FALSE | 15 |
9 | 2004 | 2 | 30 | FALSE | 16 |
10 | 2018 | 3 | 0 | FALSE | 17 |
11 | 2018 | 3 | 32 | FALSE | 18 |
12 | 2018 | 4 | 0 | FALSE | 19 |
13 | 2018 | 4 | 31 | FALSE | 20 |
三、白盒测试
3.1 概述
白盒测试关注软件产品的内部细节和逻辑结构。
方法:
- 逻辑覆盖测试方法
- 基本路径测试方法
3.2 逻辑覆盖法
根据覆盖的目标不同,可分为语句覆盖、分支覆盖、条件覆盖、分支-条件覆盖、条件组合覆盖、路径覆盖。
- 语句覆盖每条语句至少执行一次。
- 判定覆盖每个判定的每个分支至少执行一次。
- 条件覆盖每个判定的每个条件应取到各种可能的值。
- 判定/条件覆盖同时满足判定覆盖条件覆盖。
- 条件组合覆盖每个判定中各条件的每一种组合至少出现一次。
- 路径覆盖使程序中每一条可能的路径至少执行一次。
3.3 分支覆盖
基本思想:设计若干个测试用例,运行被测程序,使程序中的每个分支至少被执行一次。
以考察程序if-else结构为基础。
对循环结构,考察循环条件能够满足和不可能满足两种情况。
3.4 示例
3.4.1 题目要求
判断是否为闰年的函数isLeapYear(int year)。
闰年的条件是:
- 能被4整除,但不能被100整除;
- 能被100整除,又能被400整除。
3.4.2 流程图及分支标注
3.4.3 分支覆盖及用例列表
输入 | 执行路径 |
---|---|
2000 | 1,2,4,5,8,10 |
2004 | 1,2,4,7,10 |
2006 | 1,2,3,9 |
1900 | 1,2,4,5,6,9,10 |
四、实验1:三角形类型判断
4.1 问题描述
三角形的判断:(题目链接)
定义一个函数,用于判断三角形的三条边能否构成三角形,如果能,则判断是普通三角形,等腰三角形,还是等边三角形。(三角形的边长为整数)
输入:三角形的三条边a,b,c(1≤a,b,c≤104)
输出:如果是普通三角形,输出:regular triangle!
如果是等腰三角形,输出:isosceles triangle!
如果是等边三角形,输出:equilateral triangle!
如果不能构成三角形,输出:not a triangle!
实现代码:
//Trangle.java package testProject; import java.util.Scanner; public class Trangle { public static boolean isTrangle (int x, int y, int z) { if (x <= 0 || y <= 0 || z <= 0 ||x + y <= z || x + z <= y || y + z <= x) { return false; } return true; } public static boolean isIsosceles (int x, int y, int z) { if(x == y || y == z || z == x) { return true; } return false; } public static boolean isEquilateral (int x, int y, int z) { if(x == y && y == z && z == x) { return true; } return false; } public static void main (String[] args) { Scanner sca=new Scanner(System.in); int a = 0, b = 0, c = 0; try { a = sca.nextInt(); c = sca.nextInt(); b = sca.nextInt(); } catch (Exception e) { System.out.println(e); } if (isTrangle(a, b, c)) { if (isEquilateral(a, b, c)) { System.out.println("equilateral triangle!"); } else if (isIsosceles(a, b, c)) { System.out.println("isosceles triangle!"); } else { System.out.println("regular triangle!"); } } else { System.out.println("not a triangle!"); } } public String type (int a, int b, int c) { if (isTrangle(a, b, c)) { if (isEquilateral(a, b, c)) { return "equilateral triangle!"; } else if (isIsosceles(a, b, c)) { return "isosceles triangle!"; } else { return "regular triangle!"; } } else { return "not a triangle!"; } } }
编写实现并做黑盒(等价类划分)与白盒测试(分支覆盖)
注意事项:
黑盒测试:
无效等价类三条边的划分范围:
[1, 10^4],并且是正整数黑盒测试的每一个无效等价类只包含一个无效条件
容易出现过于笼统的问题
4.2 参考等价类划分
有效等价类 | 等价类编号 | 无效等价类 | 等价类编号 | |||
输入值 | 输入3个整数a,b,c(1<=a,b,c<=10000) | 数字字符 | 1 | 非数字字符 | 15 | |
整数 | 2 | 一边为非整数 | a为非整数 | 16 | ||
b为非整数 | 17 | |||||
c为非整数 | 18 | |||||
两边为非整数 | a,b为非整数 | 19 | ||||
a,c为非整数 | 20 | |||||
b,c为非整数 | 21 | |||||
三边为非整数 | 22 | |||||
3个数 | 3 | 只输入1个数 | 只输入a | 23 | ||
只输入b | 24 | |||||
只输入c | 25 | |||||
只输入2个数 | 只输入a,b | 26 | ||||
只输入a,c | 27 | |||||
只输入b,c | 28 | |||||
输入3个以上数 | 29 | |||||
1<=a,b,c<=10000 | 4 | 一边小于1或大于10000 | a<1||a>10000 | 30 | ||
b<1||b>10000 | 31 | |||||
c<1||c>10000 | 32 | |||||
两边小于1或大于10000 | (a<1||a>10000)&&(b<1||b>10000) | 33 | ||||
(a<1||a>10000)&&(c<1||c>10000) | 34 | |||||
(b<1||b>10000)&&(c<1||c>10000) | 35 | |||||
三边小于1或大于10000 | (a<1||a>10000)&&(b<1||b>10000)&&(c<1||c>10000) | 36 | ||||
输出值 | “not a triangle” | a+b<=c | 5 | |||
a+c<=b | 6 | |||||
b+c<=a | 7 | |||||
"regular triangle" | a+b>c | 8 | ||||
a+c>b | 9 | |||||
b+c>a | 10 | |||||
"isosceles triangle" | a=b&&b!=c | 11 | ||||
a=c&&c!=b | 12 | |||||
b=c&&c!=a | 13 | |||||
"equilateral triangle" | a=b&&b=c | 14 |
五、往届试题
5.1 11年试题:标识符判断
5.1.1 题目描述
在某一个PASCAL语言版本中规定:“标识符由字母开头、后跟字母或数字的任意组合构成。有效字符数为8个,最大字符数为80个。”并且规定:“标识符必须先说明,再使用。”“在同一说明语句中,标识符至少必须有一个。”请用等价类划分方法设计测试用例。
分析:有效字符数为8个,最大字符数为80个的意思是八个以内是有效的,可以大于80个,但那些都是无效的,就跟百度搜索前三十个字是有效的,你可以输进去很多,但是无效。
5.1.2 参考等价类划分
输入条件 | 有效等价类 | 等价类编号 | 无效等价类 | 等价类编号 |
标识符首字符 | 字母 | 1 | 非字母 | 6 |
标识符组成 | 字母或数字组合 | 2 | 非字母和数字组合 | 7 |
保留字 | 8 | |||
标识符字符数 | 1~8个 | 3 | 0个 | 9 |
>8个 | 10 | |||
>80个 | 11 | |||
标识符个数(同一语句中) | 至少一个 | 4 | 0个 | 12 |
标识符使用 | 先说明后使用 | 5 | 未说明就使用 | 13 |
5.1.3 参考测试用例
测试用例序号 | 输入 | 预期结果 | 覆盖范围 |
1 | VAR x,y; REAL;BEGIN x:=3.14; | 通过 | 1,2,3,4,5 |
2 | VAR 2x; REAL; | 不通过 | 6 |
3 | VAR x$; REAL; | 不通过 | 7 |
4 | VAR GOTO; REAL; | 不通过 | 8 |
5 | VAR x,y,; REAL; | 不通过 | 9 |
6 | VAR x123456789; REAL; | 不通过 | 10 |
7 | VAR x123…; REAL;(多余80个字符) | 不通过 | 11 |
8 | VAR ; REAL; | 不通过 | 12 |
9 | VAR x,y; REAL;BEGIN z:=5.20; | 不通过 | 13 |
5.2 15年试题:标识符判断加工
在某程序设计语言的语法中规定:“标识符由字母开头、后跟字母或数字的任意组合构成。有效字符数为8个,最大字符数为80个。”并且规定:“标识符必须先说明,再使用。”“在同一说明语句中,标识符至少必须有一个。”
根据上述的描述,利用等价类划分法,得到下表(表中括号中的数字为等价类编号)。
输入数据 | 有效等价列 | 无效等价类 |
---|---|---|
标识符个数 | 1个(1),多个(2) | 0个(3) |
标识符字符数 | 1-80个(4) | 0个(5),大于80个(6) |
标识符组成 | 字母(7),数字(8) | 非字母数字字符(9),保留字(10) |
第一个字符 | 字母(11) | 非字母(12) |
标识符使用 | 先说明后使用(13) | 未说明已使用(14) |
下面选取了八个测试用例,它们覆盖了所有的等价类,请在下划线中标出相应的等价类编号。
- VAR x, S7654321;
BEGIN x:=6.313;S7654321:=8.953;
(1)(2)(4)(7)(8)(11)(13) - VAR:REAL;
(3) - VAR x,:REAL;
(5) - VAR S7654321…:REAL;(注:标识符字符数超过80个)
(6) - VAR S$:CHAR;
(9) - VAR GOTO:INTEGER;
(10) - VAR 5S:REAL;
(12) - VAR TAR:REAL;
BEGIN…
TAP:=SIN(3.14*0.8)/8
(14)
5.3 12年试题:用户名正确性测试
5.3.1 题目描述
登录用户名由英文字母和数字组成,字符长度8-12位,不能仅有字母,也不能仅有数字,也不能有其他非英文字母。用等价类划分法设计测试用例。
5.3.2 参考等价类划分
输入条件 | 有效等价类 | 编号 | 无效等价类 | 编号 |
用户名长度 | 8~12位 | 1 | <8位 | 3 |
>12位 | 4 | |||
用户名组成 | 英文字母和数字组合 | 2 | 只包含字母 | 5 |
只包含数字 | 6 | |||
包含其他非英文字母 | 7 |
5.3.3 参考测试用例
测试用例序号 | 用户名输入 | 预期结果 | 覆盖类范围 |
---|---|---|---|
1 | zhangsan3 | 有效 | 1,2 |
2 | lisi4 | 无效 | 3 |
3 | wangwudalang12345 | 无效 | 4 |
4 | gebilaowang | 无效 | 5 |
5 | 233333333 | 无效 | 6 |
6 | &&&$$&&& | 无效 | 7 |
7 | zhangsan_3 | 无效 | 7 |
插播一条特别消息…
不要问我为啥没有13年的 ,因为我就是没有13的。
也没得题,也没得答案,自己也菜的不敢瞎写,所以没得2013
5.4 14年试题(一):测试抄错的代码
5.4.1 题目描述
同学A写代码段如下:
{
int T = 0;
if(A>=1) &&(B>=2) T=T+1;
else T=T+2;
if(x>=90)&&(y>=75) T=T+3;
else T=T+4;
printf(“%d”,&T);
]
同学B抄错如下:
{
int T = 0;
if(A>=1) &&(B>=2) T=T+1;
else T=T+2;
if(x>=90)&&(y<75) T=T+3;
else T=T+4;
printf(“%d”,&T);
]
请用白盒测试-分值覆盖法设计测试。写出思路,并进行描述。
5.4.2 参考流程图
5.4.3 参考测试用例
序号 | 输入 | 覆盖分支 | A的正确输出 | B的错误输出 |
---|---|---|---|---|
1 | A=1;B=2;x=90;y=75; | 124 | 4 | 5 |
2 | A=0;B=2;x=90;y=75; | 134 | 5 | 6 |
3 | A=1;B=2;x=90;y=74; | 125 | 5 | 4 |
4 | A=0;B=2;x=90;y=74; | 135 | 6 | 5 |
通过测试,B同学对于测试用例1得到结果T=5,测试用例2得到结果T=6,测试用例3得到结果4,测试用例4得到结果5明显错误,可以测试出问题。
5.5 14年试题(二):电话号码
5.5.1 题目描述
一个地区的电话号码由地区码,前缀,后缀三部分组成。地区码可以是空白,也可以是三个数字。前缀由首位大于等于5的四位数字组成。后缀由四位数字组成。请用等价类划分法设计测试。写出思路,并进行描述。
5.5.2 参考等价类划分
输入条件 | 有效等价类 | 等价类编号 | 无效等价类 | 等价类编号 |
地区码 | 空白 | 1 | 包含非数字字符 | 5 |
长度<3 | 6 | |||
三位数字 | 2 | |||
长度>3 | 7 | |||
前缀 | 5000~9999 | 3 | 包含非数字字符 | 8 |
首位<5 | 9 | |||
长度<4 | 10 | |||
长度>4 | 11 | |||
后缀 | 四位数字 | 4 | 包含非数字字符 | 12 |
长度<4 | 13 | |||
长度>4 | 14 |
5.5.3 参考测试用例
测试用例序号 | 输入 | 预期结果 | 覆盖范围 | ||
区域码 | 前缀 | 后缀 | |||
1 | 空白 | 5000 | 1234 | 有效 | 1,3,4 |
2 | 123 | 5000 | 1234 | 有效 | 2,3,4 |
3 | A12 | 5000 | 1234 | 无效 | 5 |
4 | 12 | 5000 | 1234 | 无效 | 6 |
5 | 1234 | 5000 | 1234 | 无效 | 7 |
6 | 123 | 500A | 1234 | 无效 | 8 |
7 | 123 | 4000 | 1234 | 无效 | 9 |
8 | 123 | 500 | 1234 | 无效 | 10 |
9 | 123 | 50000 | 1234 | 无效 | 11 |
10 | 123 | 5000 | A123 | 无效 | 12 |
11 | 123 | 5000 | 123 | 无效 | 13 |
12 | 123 | 5000 | 1234 | 无效 | 14 |
六、参考资料
[1]软工第五次上机PPT
[2]https://www.cnblogs.com/AlvinZH/p/7055708.html
-
软工第五次上机PPT ↩︎
-
https://www.cnblogs.com/AlvinZH/p/7055708.html ↩︎