为什么要进行测试?
为什么要进行测试呢?测试可能会伴随一个程序员的一生,那么到底是为什么要进行测试呢,主要从以下五个方面来分析:
1、程序员的难题
- 开发的模块出现问题,很难定位,已经熬了几个通宵了
- 刚改正了一个BUG,过没几天,又发现了新问题
- 程序总在出问题,联调了几个月,还是问题不断
2、高质量程序
- 高质量的设计
- 规范的编码
- 有效的测试
3、程序员的职责
程序员可能会有一个疑问,我是程序员,除了编码我还需要做些什么?
(1)传统的开发观念
- 开发人员的任务是完成编程,让系统正确运行起来。
- 程序调试通过任务就完成了。
- 自信自己的程序不会出错。
(2)实际上
-
开发人员的任务是完成程序,直到交付和维护。
-
人的失误是不可避免的,无论多小心,都会有错误
4、开发部的压力
开发部的现状是:一个承担多个角色的团队。比如如下:
一个团队既要进行设计还要进行编码,最后还要进行测试。也就是既要参与或部分参与高层设计;还要承担低层设计;还要程序实现;最后还要承担低层测试;
5、开发部的测试
然而开发部的测试一般效果不好,原因有以下几点: -
没有时间测试
-
不知道怎样测试
-
不好组织
-
缺乏方法和工具
这样的情况下,往往就会把单元测试的任务堆积到系统测试阶段。
然而把单元测试的任务堆积到系统测试阶段,会出现以下这些问题: -
大量的故障堆积在项目中后期:项目后10%的工作,占用了项目90%的时间。
-
故障难以定位
-
故障飘忽不定
-
开发、测试人员疲于奔命
所以就在这几种情况下,才有了测试开发这个工作,这也就是为什么要进行测试。下面我们按照软件测试的过程来分析软件测试。
软件测试的过程一般分为:单元测试–》集成测试–》系统测试–》验收测试
它们所花费的时间如下图所示:
单元测试
一、为什么要进行单元测试
- 最高的成本收益比
- 减少联调和后续测试的时间
- BUG更容易定位
- 更有信心去修改老代码
二、单元测试的执行
- 单元测试可以是开发者本人执行,也可以是独立的专业测试人员执行。
- 两者各有优势。
- 建议开发人员必须完整地做单元测试,同时测试人员针对重点模块实施独立的单元测试。
三、单元测试是什么
单元测试,对单个的软件单元或者一组相关的软件单元所进行的测试,是代码级的测试。
把测试比作是清洗一台机器:
系统测试
就是清除机器外面的尘土。集成测试
就是保证机器各个部件的接头处干净单元测试
就是清洗各个零件的内部。
四、为什么要进行单元测试
- 尽早发现错误
- 错误发现越早,成本越低.
- 发现问题比较容易
- 修正问题更容易
- 检查代码是否符合设计和规范
五、单元测试的主要内容
目标
:确保模块被正确地编码。依据
:详细设计描述。过程
:经过设计、脚本开发、执行、调试和分析结果等环节。执行者
:由程序开发人员和测试人员共同完成- 采用那些测试方法:包括代码控制流和数据流分析方法,并结合参数输入域的测试方法。
测试脚本的管理
:可以按照产品代码管理的方法进行类似的配置(并入代码库),包括代码评审、版本分支、变更控制等。如何进行评估
:通过代码覆盖率分析工具来分析测试的代码覆盖率、分支或条件的覆盖率。
六、单元测试的一般准则
- 软件单元功能与设计需求一致。
- 软件单元接口与设计需求一致。
- 能够正确处理输入和运行中的错误。
- 在单元测试中发现的错误已经得到修改并且通过了测试。
- 达成了相关的覆盖率的要求。
- 完成软件单元测试报告。
七、单元测试的工具列表
集成测试
一、什么是集成测试
集成测试又称“组装测试”、“联合测试”。
集成测试遵循特定的策略和步骤将已经通过单元测试的各个软件单元(或模块)逐步组合在一起进行测试,以期望通过测试发现各软件单元接口之间存在的问题。
二、集成测试的对象
集成测试的对象为模块级的集成和子系统间的集成,其中子系统集成测试称为组件测试。
三、集成测试的内容
- 集成功能测试
- 接口测试
- 全局数据结构测试
- 资源测试
- 任务优先级冲突测试
- 性能和稳定性测试
四、集成测试的目的与意义
与单元测试相比
:单元测试具有不彻底性,对于模块间接口信息内容的正确性、相互调用关系是否符合设计无能为力。只能靠集成测试来进行保障。同系统测试相比
,由于集成测试用例是从程序结构出发的,目的性、针对性更强,测试项发现问题的效率更高,定位问题的效率也较高。定位问题较快
,发现问题后比较容易定位,所以能够有效地加快进度,减少隐患。
五、集成测试的分类
几种集成方法性能的比较
系统测试
一、系统测试的概念
系统测试是软件交付前的最重要且全面的测试活动之一。根据其测试对象的性质可以粗略划分为功能性测试
和非功能性测试
。
二、系统测试的分类
1、性能测试
(1)概念:性能测试通过测试以确定系统运行时的性能表现,如得到运行速度、响应时间、占有系统资源等方面的系统数据。一般在真实环境、特定负载条件下,通过工具模拟
实际软件系统的运行及其操作,同时监控性能各项指标,最后对测试结果进行分析来确定系统的性能状况。
(2)一些常见的性能问题
- 资源耗尽:如CPU使用率达到100%
- 资源泄漏:如内存泄漏,最终会导致资源耗尽
- 资源瓶颈:如线程、GDI、DB连接等资源变得稀缺。
(3)目的
为了验证系统是否达到用户提出的性能指标,同时发现系统中存在的性能瓶颈,起到优化系统的目的。
(4)性能测试需求
用户对各项指标提出的明确需求;如果用户没有提出性能指标,则根据用户需求、测试设计人员的经验来设计各项测试指标。(需求+经验)
(5)主要性能指标
响应时间
:应用系统从请求发出开始到客户端接收到最后一个字节数据所消耗的时间,是作为用户视角的软件性能的主要体现。并发用户数
:系统用户数、同时在线用户人数。 吞吐量:单位时间内系统处理的客户请求的数量,直接体现软件系统的性能承载能力。表示方法
:请求数/秒、页面数/秒、人数/天、处理的业务数/小时。 资源占用率:体现软件的面向用户特性。
(6)性能测试的步骤
- 根据测试需求,选择测试工具和开发相应的测试脚本
- 建立性能测试负载模型,就是确定并发虚拟用户的数量、每次请求的数据量、思考时间、加载方式和持续加载的时间等
- 执行性能测试
- 结果分析,并提交性能测试报告
(7)性能测试的方法
负载模拟
: 一般由并发用户+思考时间+每次请求的数据量和负载模式。压力测试
也叫作强度测试、负载测试。主要就是模拟实际应用的软硬件环境以及用户使用过程的系统负荷,长时间或超大负荷的运行测试软件,来测试被测系统的性能、可靠性、稳定性等。
分类:并发性能测试、疲劳强度测试、大数据量测试容量测试
:反映的是软件系统应用特征的极限值,例如:最大并发用户数、数据库记录数等。安全性测试
:检查系统对非法侵入的防范能力。安全测试期间,测试人员假扮非法入侵者,采用各种办法试图突破防线。例如:SQL注入式漏洞、缓冲区溢出、不安全的配置管理、暴露的端口或入口。
2、可靠性测试
软件的可靠性表明了一个软件系统按照用户的要求和设计的目标,执行其功能的可靠程度。理论上来说,可靠的软件系统应该是正确的、完整、一致和健壮的。
3、容错性测试
该测试主要就是检查软件在异常条件下自身是否具有防护性的措施或者某种灾难恢复手段。包括了两个方面。
一方面是输入异常数据或进行异常操作以检验系统的保护性
另一方面是灾难恢复性测试,通过各种手段,让软件强制性地发生故障,然后验证系统已保存的用户数据是否丢失、系统和数据是否能尽快恢复。
4、回归测试
指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
5、冒烟测试
冒烟测试对象是每一个新编译的需求正式测试的软件版本,目的是确认软件基本功能正常,可以进行后续的正式测试工作。
一般在开发人员开发完毕后送给测试人员来进行测试时,测试人员会先进行冒烟测试,保证基本功能正常,不阻碍后续的测试。