其实是没有前七次实验的
因为第八次实验是考试,复习了前七次实验的内容。
所以这个第八次实验是个伪命题hiahiahia
一、软件测试
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