1. 为什么要对软件测试进行分类
软件测试是软件⽣命周期中的⼀个重要环节,具有较⾼的复杂性,对于软件测试,可以从不同的⻆度
加以分类,使开发者在软件开发过程中的不同层次、不同阶段对测试⼯作进⾏更好的执⾏和管理测试
的分类⽅法
2. 按照测试目标分类
- 界面测试
- 功能测试
- 性能测试
- 安全性测试
- 易用性测试
上述在之前的文章中有提及;
2.1 可靠性测试
可靠性最好要达到 99.99%;
- 4个9:
- 3652460*0.9999 = 52557(可用时间min)
525600 - 52557 = 53 (即一年)
3. 按照执行方式分类
3.1 静态测试
所谓静态测试(statictesting)就是不实际运行被测软件,而只是静态地检查程序代码、界面或文档
中可能存在的错误的过程。
SonarQube很多企业都在用的静态扫描工具
3.2 动态测试
动态测试(dynamictesting),指的是实际运行被测程序,输入相应的测试数据,检查实际输出结果
和预期结果是否相符的过程,所以判断一个测试属于动态测试还是静态的,唯一的标准就是看是否运
行程序。
大部分软件测试工作都属于动态测试
4. 按照测试方法分类
4.1 白盒测试
白盒测试又称为结构测试或逻辑测试,它一般用来分析程序的内部结构,针对程序的逻辑结构来设计
测试用例进行测试。
4.1.1 语句覆盖
每个语句至少执行一次
- 示例:
if A and B
then action1
if C or D
then action2
A: T B:T
C:T D:T;C:T D:F;C:F D:T;
//只有这样才能保证每条语句都执行一次
4.1.2 判定覆盖
在该案例中 if 就是判定语句
if 语句:既要测试为T也要测试为F
4.1.3 条件覆盖
4.1.4 判定条件覆盖
4.1.5 条件组合覆盖
4.1.6 路径覆盖
总结:
- ⽩盒测试主要应⽤于单元测试阶段
- 先执⾏静态设计⽤例的⽅法,再执⾏动态设计测试⽤例的⽅法
- 设计⽤例⼀般使⽤路径测试,重点模块追加使⽤逻辑覆盖⽅法
4.2 黑盒测试
又称为数据驱动测试,只注重功能测试,不关心具体怎么实现(系统测试)
⿊盒测试⽤到的测试⽅法有,等价类,边界值,因果图,场景法,错误猜测法等
优点:
- 不需要了解程序内部的代码以及实现,不关注软件内部的实现。
- 从用户角度出发设计测试用例,很容易的知道用户会用到哪些功能,会遇到哪些问题,锻炼测试人员的产品思维
- 测试用例是基于软件需求开发文档,不容易遗漏软件需求文档中需要测试的功能。
缺点:
- 不可能覆盖所有代码。
4.3 灰盒测试(开发人员使用)
结合了白盒测试和黑盒测试,但又不完全复制
但是,灰盒测试没有⽩盒测试详细和完整,⿊盒测试是覆盖产品范围最⼴的测试,因此灰盒测试基本是不能够替代⿊盒测试,否则需要很⼤的代价,设计⾮常多的⽤例。
常见面试问题: 你知道的测试⽅法有哪些?哪种⽤的⽐较多?
常⻅的测试⽅法有⿊盒测试,⽩盒测试和灰盒测试。开发⼈员主要⽤⽩盒测试和灰盒测试,测试⼈员主要⽤⽩盒测试和⿊盒测试。对于测试⼈员来说,相较于⽩盒测试,⿊盒测试⽤的更多⼀些。
5. 按照测试阶段分类
5.1 单元测试
最小单元,“最小单元”是人为规定的,主要采⽤⽩盒测试⽅法,从被测对象的内部结构出发设计测试⽤例
到底怎么才算“最小单元”呢,最小单元实际是认为定义的,一个方法,一个类都可以理解为“最小单元”
- 测试阶段:编码后或者编码前(TDD)
- 测试对象:最小模块
- 测试人员:白盒测试工程师或开发工程师
- 测试依据:代码和注释+详细设计文档
- 测试方法:白盒测试
- 测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试
public class Main {
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
Test01();
Test02();
Test03();
Test04();
}
private static void Test01() {
int[] act_array1 = {64, 34, 25, 12, 22, 11, 90};
int[] expect_array1 = {11, 12, 22, 25, 34, 64, 90};
bubbleSort(act_array1);
System.out.println("Test01结果:" + (Arrays.equals(act_array1, expect_array1) ? "通过" : "不通过"));
}
private static void Test02() {
int[] act_array1 = {1, 2, 3, 4, 5};
int[] expect_array1 = {1, 2, 3, 4, 5};
bubbleSort(act_array1);
System.out.println("Test02结果:" + (Arrays.equals(act_array1, expect_array1) ? "通过" : "不通过"));
}
private static void Test03() {
int[] act_array1 = {};
int[] expect_array1 = {};
bubbleSort(act_array1);
System.out.println("Test03结果:" + (Arrays.equals(act_array1, expect_array1) ? "通过" : "不通过"));
}
private static void Test04() {
int[] act_array1 = {1, 4, 29, 12, 12, 9};
int[] expect_array1 = {1, 1, 9, 12, 12, 29}; // 注意这里存在期望值错误
bubbleSort(act_array1);
System.out.println("Test04结果:" + (Arrays.equals(act_array1, expect_array1) ? "通过" : "不通过"));
}
}
5.2 集成测试
5.3 系统测试
对通过集成测试的系统进⾏整体测试,验证系统功能性和⾮功能性需求的实现。
- 测试阶段:集成测试通过之后
- 测试对象:整个系统(软、硬件)
- 测试⼈员:⿊盒测试⼯程师
- 测试依据:需求规格说明⽂档
- 测试⽅法:⿊盒测试
- 测试内容:功能、界⾯、可靠性、易⽤性、性能、兼容性、安全性等
5.3.1 冒烟测试
冒烟测试的对象是每⼀个新编译的需要正式测试的软件版本,⽬的是确认软件主要功能和核⼼流程正常,在正式进⾏系统测试之前执⾏。冒烟测试⼀般在开发⼈员开发完毕后提交给测试⼈员来进⾏测试时,先进⾏冒烟测试,保证基本功能正常,不阻碍后续的测试。
5.3.2 回归测试
回归测试是指修改了旧代码后,重新进⾏测试以确认修改没有引⼊新的错误或导致其他代码产⽣错误。
即所有的页面所有功能测试完整之后要整体再回归一遍。
5.4 验收测试(交付测试)
⽤⼾在选择汽⻋的过程中也会对⻋外观以及性能等⽅⾯进⾏校验(验收测试)
6. 是否手工测试
6.1 手工测试
⼿⼯测试就是由⼈去⼀个⼀个的输⼊⽤例,然后观察结果,和机器测试相对应,属于⽐较原始但是必须的⼀个步骤。
另一个则是自动化测试
7. 按照实施组织划分
⼤型通⽤软件,在正式发布前,通常需要执⾏Alpha和Beta测试
7.1 α 测试
α测试⼜叫内测或者叫a测,其实都是⼀个涵义
α测试通常是公司内部的⽤⼾在模拟实际操作环境下进⾏的测试。α测试的⽬的是评价软件产品的FLURPS(即功能、可使⽤性、可靠性、性能和⽀持)。 α测试不能由程序员或测试员完成。
7.2 β 测试
β测试⼜叫公测或者叫b测
β测试由软件的最终⽤⼾们在⼀个或多个场所进⾏,这⾥就可以理解为,β测试是正式⽤⼾中的⼀部分,他们在任意的场合来使⽤软件,⽬的是为了发现软件是否存在⼀系列的问题
α测试与β测试的区别:
- 测试的场所不同: α测试是在公司内部进⾏测试的,但是β测试是在⽤⼾环境下进⾏测试的 α测试的环境是受开发⽅控制的,⽤⼾的数量相对⽐较少,时间⽐较集中。β测试的环境是不受开发 ⽅控制的,⽤⼾数量相对⽐较多,时间不集中。
- 测试执⾏时机不同: α测试先于β测试执⾏。通常是α测试通过后,在进⾏β测试
- 测试持续时间⻓短不同: α测试时间没有β测试持续时间⻓
7.3 第三方测试
第三⽅软件测试是指由独⽴的第三⽅公司或组织进⾏的软件测试活动。
8. 按照测试地域划分
般会将测试划分为国际化测试和本地测试