目录
接着上文的测试分类 _7,我们提到了 按是否看代码,是否运行代码,测试的部分来分类,这篇文章我们继续来看
四、按开发阶段划分
测试金字塔
1、单元测试(Unit Testing)(重点)
单元测试是对软件组成单元进行测试,其目的是检验软件基本组成单位的正确性。
测试的对象是软件设计的最小单位:模块,又称为模块测试。
- 测试阶段:编码后或者编码前(TDD)。
- 测试对象:最小模块(在 C 语言中是一个函数,Java 中是一个类方法)。
- 测试人员:白盒测试工程师或开发工程师。
- 测试依据:代码和注释+详细设计文档。
- 测试方法:白盒测试。
- 测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试。
Java 如何进行单元测试?
利用工具 Junit / TestNG。
2、集成测试(Integration Testing)
集成测试也称联合测试(联调)、组装测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。
集成主要目的是检查软件单位之间的接口是否正确。
- 测试阶段:一般单元测试之后进行。
- 测试对象:模块间的接口。
- 测试人员:白盒测试工程师或开发工程师。
- 测试依据:单元测试的模块+概要设计文档。
- 测试方法:黑盒测试与白盒测试相结合。
- 测试内容:模块之间数据传输、模块之间功能冲突、模块组装功能正确性、全局数据结构、单模块。
- 缺陷对系统的影响。
3、系统测试(System Testing)
新买手机都会有一个合格标签,在出厂前手机厂会所某型号的手机上的所有功能全部测试一遍。包括手机硬件本身,手机上自带的 APP。
将软件系统看成是一个 系统的测试 。包括对功能、性能以及软件所运行的软硬件环境进行测试。
- 测试阶段:集成测试通过之后。
- 测试对象:整个系统(软、硬件)。
- 测试人员:黑盒测试工程师。
- 测试依据:需求规格说明文档。
- 测试方法:黑盒测试。
- 测试内容:功能、界面、可靠性、易用性、性能、兼容性、安全性等。
4、回归测试(Regression Testing)
接着上边的美颜功能不可用的例子,拿去维修点进行了维修,拿到手机后第一件事情是先看美颜功能修好了没有,第二事情就是看看手机的其它常用功能是否正常。
- 回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
- 在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。随着系统的庞大,回归测试的成本越来越大,通过选择正确的回归测试策略来改进回归测试的效率和有效性是很有意义的。
5、冒烟测试(Smoke Testing)
冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件主要功能和核心流程正常,在正式进行系统测试之前执行。
冒烟测试一般在开发人员开发完毕后提交给测试人员来进行测试时,先进行冒烟测试,保证基本功能正常,不阻碍后续的测试。
如果冒烟测试通过,则测试人员开始进行正式的系统测试,如果不通过,则测试人员可以让开发人员重新修复代码直到冒烟测试通过,再开始进行系统测试,也就是在系统测试之前完成。
回归测试和冒烟测试都属于系统测试。
6、验收测试(Acceptance Testing)
买到新手机,一般会有 7 天包退,一个月包换,我们会尽量在 7 天内把手机的所有功能都试一遍。
验收测试是部署软件之前的最后一个测试操作,它是技术测试的最后一个阶段,也是产品上线之前最后一个流程,也称为交付测试。验收测试的目的是确保软件准备就绪,按照项目合同、任务书、双方约定的验收依据文档,向软件购买都展示该软件系统满足原始需求。
- 测试阶段:系统测试通过之后。
- 测试对象:整个系统(包括软硬件)。
- 测试人员:主要是最终用户或者需求方。
- 测试依据:用户需求、验收标准(测试人员写的)。
- 测试方法:黑盒测试。
- 测试内容:同系统测试(功能... 各类文档等)。
五、按测试实施组织
大型通用软件在正式发布前,通常需要执行 Alpha 和 Beta 测试。
1、α 测试(Alpha Testing)
手机出厂前最后一次测试,开发和测试人员不参与。
α 测试又叫内测或者叫 a 测,其实都是⼀个涵义。α 测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试。
- α 测试的目的是评价软件产品的 FLURPS(即功能、局域化、可使用性、可靠性、性能和支持)。
- α 测试不能由程序员或测试员完成。
2、β 测试(Beta Testing)
β 测试又叫公测或者叫 b 测。
Beta 测试是一种验收测试。
- β 测试由软件的最终用户们在⼀个或多个场所进行,这里就可以理解为:β 测试是正式用户中的⼀部分,他们在任意的场合来适用软件,目的是为了发现软件是否存在一系列的问题。
- 通常会发送⼀些邀请码,来邀请用户参与项目测试。
- 新手机购买回来,参与测试的人是购买者,使用的场所及环境已不再是手面厂商的环境及场所。
3、α 测试与 β 测试的区别(重点)
- 测试的场所 / 环境不同:Alpha 测试是指把用户请到开发方的场所来测试(在公司内部进行测试,是公司的内部人员),Beta 测试是指在一个或多个用户的场所进行的测试。
- Alpha 测试的环境是受开发方控制的,用户的数量相对比较少,时间比较集中,周期较短。Beta 测试的环境是不受开发方控制的,用户数量相对比较多,时间不集中,周期较长。
- 测试执行时机不同:Alpha 测试先于 Beta 测试执行。通用的软件产品需要较大规模的 Beta 测试,测试周期比较长。
- 测试持续时间长短不同:α 测试时间没有 β 测试持续时间长。
4、第三方测试
第三方软件测试是指由独立的第三方公司或组织进行的软件测试活动。
软件测试系统检测性能压力测试价格,第三方专业服务公司_卓码软件测评
通过第三方测试可以确保软件的质量,节省成本,确保软件尽快上线。
4、第三方测试
介于开发方和用户方间的组织的测试。
六、按是否运行划分
大多数软件测试工作都属于动态测试。
1、静态测试(Static Testing)
静态测试(static testing)就是不实际运行被测软件,而只是静态地检查程序代码、界面或文档中可能存在的错误的过程。
不以测试数据的执行而是对测试对象的分析过程,仅通过分析或检查源程序的设计、内部结构、逻辑、代码风格和规格等来检查程序的正确性。
2、动态测试(Dynamic Testing)
动态测试(dynamic testing),指的是实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符的过程。
所以判断一个测试属于动态测试还是静态的,唯一的标准就是看是否运行程序。
七、按是否手工测试划分(重点)
1、手工测试(Manual testing)
手工测试就是由人去一个一个的输入用例,然后观察结果,和机器测试相对应,属于比较原始但是必须的一个步骤。
(1)优点
- 自动化无法替代探索性测试、发散思维结果的测试。
- 对测试⼈员技术要求没有自动化技术要求高,可以进行发散性测试。
(2)缺点
- 执行效率慢,量大易错。
- 人员,时间成本比起自动化测试都比较高。
2、自动化测试(Automation Testing)
就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。简单说自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。
自动化测试比如功能测试自动化、性能测试自动化、安全测试自动化。
自动化测试按照测试对象来分,还可以分为接口测试、UI 测试等。接口测试的 ROI(产出投入比)要比 UI 测试高。
(1)自动化实施步骤
- 完成功能测试,版本基本稳定。
- 根据项目特性,选择适合项目的自动化工具,并搭建环境。
- 提取手工测试的测试用例转化为自动化测试的用例。
- 通过工具、代码实现自动化的构造输入,自动检测输出结果是否符合预期。
- 生成自动测试报告。
- 持续改进,脚本优化。
(2)优点
- 节省成本
- 提高测试人员执行工作效率
- 保障软件的质量
(3)缺点
- 对测试人员技术要求较高
- 不能发散性测试
自动化测试能否完全替代手工测试?
不能,只能代替一部分,通常是可以替代一些操作重复性高的。
自动化测试和手工测试哪个更好?
不能说哪个更好,具体得看场景需求。
八、按测试地域划分
按照测试地域划分,⼀般会将测试划分为国际化测试和本地测试。
什么是软件国际化?
- 简而言之,测试人员需要测试软件在不同语言和地区是否能正常工作。
- 是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,使创建不同语言版本时,不需要重新设计源程序代码的软件工程方法。
2、国际化测试
国际化测试需要已关注软件的哪些特性:
- 布局
- 时间
- 日期
- 数字格式
- 货币
- 机器型号
- ... ..
软件的国际化和软件的本地化是开发面向全球不同地区用户使用的软件系统的两个过程。
- 而本地化测试和国际化测试则是针对这类软件产品进行的测试。
- 由于软件的全球化普及,还有软件外包行业的兴起,软件的本地化和国际化测试俨然成为了一个独特的测试专门领域。
- 本地化和国际化测试与其他类型的测试存在很多不同之处。
下面是本地化和国际化测试 的一些要点。
- 本地化后的软件在外观上与原来版本是否存在很大的差异,外观是否整齐、不走样。
- 是否对所有界面元素都进行了本地化处理,包括对话框、菜单、工具栏、状态栏、提示信息(包括声音的提示)、日志等。
- 在不同的屏幕分辨率下界面是否正常显示。
- 是否存在不同的字体大小,字体设置是否恰当。
- 日期、数字格式、货币等是否能适应不同国家的文化习俗。例如,中文是年月日,而英文是月日年。
- 排序的方式是否考虑了不同语言的特点。例如,中文按照第一个字的汉语拼音顺序排序,而英文按照首字母排序。
- 在不同的国家采用不同的度量单位,软件是否能自适应和转换。
- 软件是否能在不同类型的硬件上正常运行,特别是在当地市场上销售的流行硬件上。
- 软件是否能在Windows或者其他操作系统的当地版本上正常运行。
- 联机帮助和文档是否已经翻译,翻译后的链接是否正常。正文翻译是否正确、恰当, 是否有语法错误。
软件本地化和国际化测试是一个综合了翻译行业和软件测试行业的测试类型。
它要求测 试人员具备一定的翻译能力、语言文化,同时具备测试人员的基本技能。
3、本地化测试
前面讲到的全是本地化测试。
九、按照测试阶段分类
1、单元测试
与编码同步进行,针对软件最小组成单元进行测试,主要采用白盒测试方法,从被测对象的内部结构出发设计测试用例。
最小单元实际是认为定义的,⼀个方法,一个类都可以理解为 “最小单元”。
- 测试阶段:编码后或者编码前(TDD,Test Driven Development,测试驱动开发)
- 测试对象:最小模块
- 测试人员:白盒测试工程师或开发工程师
- 测试依据:代码和注释 + 详细设计⽂档
- 测试方法:白盒测试
- 测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试
针对上面给出的冒泡排序,下面尝试实现⼀个简单的单元测试。
#include <iostream>
#include <vector>
using namespace std;
// 冒泡排序
void bubbleSort(int arr[], int n) {
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;
}
}
}
}
// 打印数组(调试用)
void printArray(int arr[], int n) {
cout << "[";
for (int i = 0; i < n; ++i) {
cout << arr[i];
if (i != n - 1)
cout << ", ";
}
cout << "]";
}
// 检查两个数组是否相等
bool arraysEqual(int arr1[], int arr2[], int n) {
for (int i = 0; i < n; ++i) {
if (arr1[i] != arr2[i])
return false;
}
return true;
}
// 测试用例 1:排序无序数组
void Test01() {
int act_array1[] = {64, 34, 25, 12, 22, 11, 90};
int expect_array1[] = {11, 12, 22, 25, 34, 64, 90};
int n = sizeof(act_array1) / sizeof(act_array1[0]);
bubbleSort(act_array1, n);
if (arraysEqual(act_array1, expect_array1, n)) {
cout << "Test01: 测试通过" << endl;
} else {
cout << "Test01: 测试不通过" << endl;
cout << "实际结果: ";
printArray(act_array1, n);
cout << endl;
}
}
// 测试用例 2:排序有序数组
void Test02() {
int act_array1[] = {1, 2, 3, 4, 5};
int expect_array1[] = {1, 2, 3, 4, 5};
int n = sizeof(act_array1) / sizeof(act_array1[0]);
bubbleSort(act_array1, n);
if (arraysEqual(act_array1, expect_array1, n)) {
cout << "Test02: 测试通过" << endl;
} else {
cout << "Test02: 测试不通过" << endl;
cout << "实际结果: ";
printArray(act_array1, n);
cout << endl;
}
}
// 测试用例 3:排序空数组
void Test03() {
int act_array1[] = {};
int expect_array1[] = {};
int n = 0;
bubbleSort(act_array1, n);
if (n == 0) {
cout << "Test03: 测试通过" << endl;
} else {
cout << "Test03: 测试不通过" << endl;
}
}
// 测试用例 4:排序包含重复元素的数组
void Test04() {
int act_array1[] = {1, 1, 29, 12, 12, 9, 9};
int expect_array1[] = {1, 1, 9, 9, 12, 12, 29};
int n = sizeof(act_array1) / sizeof(act_array1[0]);
bubbleSort(act_array1, n);
if (arraysEqual(act_array1, expect_array1, n)) {
cout << "Test04: 测试通过" << endl;
} else {
cout << "Test04: 测试不通过" << endl;
cout << "实际结果: ";
printArray(act_array1, n);
cout << endl;
}
}
// 主函数,运行所有测试
int main() {
Test01();
Test02();
Test03();
Test04();
return 0;
}
如果用java的话,有很多单元测试框架,如Junit,Junit 提供了非常多注解和断言函数
有效提升开发单元测试脚本的效率。
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
public class BubbleSortTest {
@Test
public void testBubbleSort() {
// 测试⽤例:正常情况下的冒泡排序
int[] arr = {5, 3, 9, 1, 7};
int[] expected = {1, 3, 5, 7, 9};
BubbleSort.bubbleSort(arr);
assertArrayEquals(expected, arr);
}
@Test
public void testBubbleSortEmptyArray() {
// 测试⽤例:空数组的冒泡排序
int[] arr = {};
int[] expected = {};
BubbleSort.bubbleSort(arr);
assertArrayEquals(expected, arr);
}
@Test
public void testBubbleSortAlreadySorted() {
// 测试⽤例:已经有序的数组,排序后应该保持不变
int[] arr = {1, 2, 3, 4, 5};
int[] expected = {1, 2, 3, 4, 5};
BubbleSort.bubbleSort(arr);
assertArrayEquals(expected, arr);
}
@Test
public void testBubbleSortWithDuplicates() {
// 测试⽤例:包含重复元素的数组
int[] arr = {4, 2, 4, 1, 3, 2};
int[] expected = {1, 2, 2, 3, 4, 4};
BubbleSort.bubbleSort(arr);
assertArrayEquals(expected, arr);
}
}
2、集成测试
集成测试也称联合测试(联调)、组装测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。集成主要目的是检查软件单位之间的接口是否正确。
- 测试阶段:⼀般单元测试之后进行
- 测试对象:模块间的接口
- 测试⼈员:白盒测试工程师或开发工程师
- 测试依据:单元测试的模块 + 概要设计文档
- 测试方法:黑盒测试与白盒测试相结合
- 测试内容:模块之间数据传输、模块之间功能冲突、模块组装功能正确性、全局数据结构、单模块缺陷对系统的影响
3、系统测试
对通过集成测试的系统进行整体测试,验证系统功能性和非功能性需求的实现。
- 测试阶段:集成测试通过之后
- 测试对象:整个系统(软、硬件)
- 测试⼈员:⿊盒测试工程师
- 测试依据:需求规格说明⽂档
- 测试方法:黑盒测试
- 测试内容:功能、界面、可靠性、易⽤性、性能、兼容性、安全性等
4、冒烟测试
检查当前已经开发好的程序是否具备可测试性。
这⼀术语源自行业。对一个或硬件组件进行更改或修复后,直接给设备加电。如果没有冒烟,则该组件就通过了测试。在软件中,“冒烟测试” 这一术语描述的是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过程。在检查了代码后,冒烟测试是确定和修复的最经济有效的方法。冒烟测试设计用于确认代码中的更改会按预期运行,且不会整个版本的稳定性。
冒烟测试的对象是每一个新编译的需要正式测试的软件版本,目的是确认软件主要功能和核心流程正常,在正式进行系统测试之前执行。冒烟测试一般在开发人员开发完毕后提交给测试人员来进行测试时,先进行冒烟测试,保证基本功能正常,不阻碍后续的测试。
如果冒烟测试通过,则测试人员开始进行正式的系统测试,如果不通过,则测试人员可以让开发人员重新修复代码直到冒烟测试通过,再开始进行系统测试。
- 在生活中,购买一个电视,首先会通电,查看电视是否能够运行。购买一个水杯,首先会灌水,查看水杯是否漏水。
- 在工作中,假如有一个博客系统项目提测了,冒烟测试即只需要测试系统是否能够成功打开,主流程是否可以走通即可。
5、回归测试
回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。随着系统的庞大,回归测试的成本越来越大,通过选择正确的回归测试策略来改进回归测试的效率和有效性是很有意义的。
回归测试主要由人工测试和自动化测试进行。
- 在实际工作中,回归测试需要反复进行,当测试者一次又一次地完成相同的测试时,这些回归测试将变得非常令人厌烦,而在大多数回归测试需要手工完成的时候尤其如此
- 因此,需要通过自动测试来实现重复的和一致的回归测试。
- 通过测试自动化可以提高回归测试效率。为了支持多种回归测试策略,自动测试工具应该是通用的和灵活的,以便满足达到不同回归测试目标的要求。
我们能够想象出来人工回归的流程,但是自动化测试又是什么样的呢?
回归测试和冒烟测试都属于系统测试。
【回归测试和冒烟测试之间的区别】
(1)冒烟测试(Smoke Testing)
- 阶段:通常在软件开发的早期阶段进⾏,主要⽤于验证基本功能是否正常工作。
- 目的:确保软件的主要功能能够基本运⾏,以便在后续的详细测试阶段发现更深层次的问题。
(2)回归测试(Regression Testing)
- 阶段: 在软件开发的后期,通常在每次代码修改或新增功能后执行。
- 目的: 确保已有的功能仍然正常工作,并且新的更改没有引入新的错误。目的是防止已有功能因为代码修改而出现问题。
虽然它们都属于系统测试,但冒烟测试注重最基本的功能,而回归测试已关注全面的功能,包括已有功能和新添加的功能。这两种测试类型在测试策略中起到了不同的作用,帮助确保软件质量和稳定性。
6、验收测试
针对用户需求,对通过系统测试的软件进行交付性测试,以确定系统是否满足验收标准,由用户或其他授权机构决定是否接受系统。 验收测试 是部署软件之前的最后一个测试操作。它是技术测试的最后⼀个阶段,也称为交付测试。验收测试的目的是确保软件准备就绪,按照项目合同、任务书、
双⽅约定的验收依据⽂档,向软件购买都展示该软件系统满足原始需求。
- 测试阶段:系统测试通过之后
- 测试对象:整个系统(包括软硬件)。
- 测试人员:主要是最终用户或者需求方。
- 测试依据:用户需求、验收标准
- 测试方法:黑盒测试
- 测试内容:同系统测试(功能... 各类文档等)
单元测试,集成测试,系统测试,回归测试之间的关系:(关于⻋企⽣产⻋到客⼾开上⼩汽⻋的过程中)
- 造车需要原材料,如⻋轮、发动机等零部件不是车企自己制造出来的,而是通过购买零部件来造⻋。对买来的零部件进行检查,零部件是否符合造⻋标准。(单元测试)
- 零件确认完毕,接下来就是复杂的造车工艺,将零部件集成起来构成了⼀辆车,并初步检查拼车的车是否能正常运作。(集成测试)
- 一辆车成型之后并不意味着就可以直接销售给客户了,需要车企专业的测试人员进行详细而完整的测试。(系统测试)
- 专业的测试⼈员对企业测试完毕,通过测试的汽车将会在车展或者 4S 店进行展示,供用户进行选择和购买。用户在选择汽车的过程中也会对车外观以及性能等方面进行校验。(验收测试)
除了以上阶段外,还有两个非常重要:冒烟测试和回归测试。
相当于测试阶段 是有 4个