一.软件测试介绍
1.什么是软件测试
使用人工或者自动手段,来运行或者测试某个系统的过程。
其目的在于检测它是否满足规定的需求或者弄清预期结果与实际结果之间的差别
2.软件测试前景
缺口
薪资
发展
- 技术:手工测试、自动化测试、测试开发、测试架构、测试专家
- 管理:测试组长、测试主管、测试经理、测试负责人、总监-CTO
- 业务方向:测试专家、需求、产品经理、金融等行业精英
3.软件测试需要具备的素质
- 踏实细心
- 好奇心,怀疑一切
- 良好交流能力
- 想进入互联网行业
4.怎么学
- 主动/被动学习
- 复习方式
5.需要的知识体系
软件测试基础知识——软件测试流程——测试用例设计方法——兼容性测试/易用性测试——缺陷管理——测试工具使用——测试文档编写
6.什么是软件
应用软件
系统软件
软件:控制计算机硬件工作的工具
7.软件测试目的
减少软件缺陷(bug),保障软件质量
二.测试原则
-
测试显示缺陷的存在
测试可以显示缺陷的存在,但不能证明系统不存在缺陷。测试可以减少软件中存在缺陷的可能性,但即使测试没有发现任何缺陷,也不能证明软件或系统是完全正确的,或者说是不存在缺陷的。
-
穷尽测试是不可能的
穷尽测试是不可能的,当满足一定的测试出口准则时测试就应当终止。考虑到所有可能输入值和它们的组合,以及结合所有不同的测试前置条件,这是一个天文数字,我们没有可能进行穷尽测试
-
测试的尽早介入
根据统计表明,在软件开发生命周期早期引入的错误占软件过程中出现所有错误(包括最终的缺陷)数量的50%~60%。此外,IBM的一份研究结果表明,缺陷存在放大趋势。如需求阶段的一个错误可能会导致N个设计错误,因此,越是测试后期,为修复缺陷所付出的代价就会越大。因此,软件测试人员要尽早地且不断地进行软件测试,以提高软件质量降低软件开发成本
-
缺陷集群性
Pareto原则表明“80%的错误集中在20%的程序模块中”。实际经验也证明了这一点,通常情况下,大多数的缺陷只是存在测试对象的极小部分。缺陷并不是平均而是集群分布的。因此,如果在一个地方发现了很多缺陷,那么通常在这个模块中可以发现更多的缺陷。因此,测试过程中要充分注意错误集群现象,对发现错误较多的程序段或者软件模块,应进行反复的深入的测试
-
杀虫剂悖论
论杀虫剂用得多了,害虫就有免疫力,杀虫剂就发挥不了效力。在测试中,同样的测试用例被一遍一遍反复使用时,发现缺陷的能力就会越来越差。这种现象的主要原因在于测试人员没有及时更新测试用例,同时对测试用例及测试对象过于熟悉,形成思维定势。
为克服这种现象,测试用例需要经常的评审和修改,不断增加新的不同的测试用例来测试软件或系统的不同部分,保证测试用例永远是最新的,即包含着最后一次程序代码或说明文档的更新信息。
-
测试活动依赖于测试背景
对于每个软件系统,比如测试策略测试技术、测试工具、测试阶段以及测试出口准则等等的选择,都是不一样的。同时,测试活动必须与应用程序的运行环境和使用中可能存在的风险相关联。因此,没有两个系统可以以完全相同的方式进行测试。比如,对关注安全的电子商务系统进行测试,与一般的商业软件测试的重点是不一样的,它更多关注的是安全测试和性能测试。
-
不存在缺陷的谬论
系统的质量特征不仅仅是功能性要求,还包括了很多其它方面的要求比如稳定性、可用性、兼容性等等。假如系统无法使用,或者系统不能完成客户的需求和期望,那么,这个系统的研发是失败。同时在系统中发现和修改缺陷也是没有任何意义的。
三.测试分类
1.按测试阶段划分
- 单元测试:可以理解为单功能测试,是指对软件中最小可测试单元进行检查和验证
- 集成测试:又称接口测试,针对模块之间访问地址进行测试
- 系统测试:指的是将整个软件系统看做一个整体进行测试,包括对功能、性能、兼容、文档以及软件所运行的软硬件环境进行测试
- 验收测试:主要分为内测、公测,使用不同人群来发掘项目缺陷。 正式验收测试是一项管理严格的过程,它通常是系统测试的延续。验收测试一般由用户派出代表和开发方的测试小组一起进行测试验收,但也可能有用户单独验收,总之方式不限,最终的目的还是用户满意并接收
- Alpha测试:把用户请到开发方对软件进行的测试,测试环境受开发方控制,测试人不多,测试时间比较集中,执行者:测试人员、用户、公司内部人员
- beta测试:测试环境不受开发方控制,测试人比较多,测试时间不集中
- 区别:测试场所不一样,一般先做Alpha测试再做beta测试
2.按代码可见度划分(是否查看源代码)
-
黑盒测试---源代码不可见,UI功能可见。 只需要关注外部的输入与输出
-
白盒测试---全部代码可见,UI功能不可见。 需要关注内部逻辑具体实现
-
灰盒测试---部分代码可见,需要关注外部的输入与输出,也需要关注内部逻辑具体实现
3.按是否运行程序划分
-
动态测试:运行被测系统而进行的测试。
-
静态测试:不需要运行被测系统而进行的系统(界面检查、文档检查)
4.按不同的测试手段划分
手工测试
自动化测试(替代手工 工具/写代码)
5.按测试包含的内容划分
-
功能测试:验证软件的业务功能是否符合需求
-
界面测试:被测系统界面与圆形图是否一致
-
安全测试:对被测系统的安全进行测试(对账号多次进行输入用户名密码,是否允许输入、sql注入)
-
兼容性测试:在不同的测试环境下被测系统是否正常(淘宝(b/s))
-
易用性测试:各个功能是否操作方便、是否容易理解、容易上手
-
性能测试:某时间用户数量剧增,软件是否正常(负载测试、压力测试)
6.其他测试
-
冒烟测试:正式测试一个新版本之前,先测试一下软件的主要功能,是否具备可测性。冒烟测试一般可能 开发或者测试主管来负责
-
回归测试:开发对存在问题的功能进行修改后,再一次进行的测试以确认修改没有引入新的错误或导致其他代码产生错误
-
随机测试:根据自己项目经验对软件进行功能和性能抽查
四.软件质量介绍
1.什么是软件质量
经典的“软件质量”定义:软件质量特性的总和,软件满足规定或潜在用户需求的能力。 简单的说,软件质量就是客户的满意度。
2.软件测试与软件质量
1)软件质量与软件过程的关系
-
软件质量:软件产品的特性可以满足用户的功能、性能需求的能力。
-
软件过程:软件生命周期中的活动,一般包括软件需求分析、软件设计、软件编码、 软件测试、交付、安装和软件维护。
-
过程决定质量,软件过程决定软件质量,软件质量是在软件开发过程中逐渐建立起来 的。
-
软件过程的优劣决定了软件质量的高低,好的过程是高效高质量的前提。人员和过程 是决定软件质量的关键因素,高质量的人员和好的过程应该得到好的产品。
•2)软件测试与软件过程的关系
- 在软件过程中注意把握测试的对象
- 软件测试在软件生存周期中的位置
- 软件测试在软件生存周期中占有非常重要的位置,是对软件规格说明、设计和编码 的最后终审。
- 软件测试与软件质量的关系
- 软件测试是软件质量保证的重要手段,是规约、设计和编码的最终检查
3.软件质量特性
- 功能性:软件在指定条件下使用时,满足用户明确和隐含需求的功能的能力
- 可靠性:软件在指定条件下使用时,维持规定的性能级别的能力。
- 易用性:在指定使用条件下,产品被理解、 学习、使用和吸引用户的能力
- 效率性:在规定条件下,相对于所用资源的数量,软件产品可提供适当性能的能力
- 可维护性:软件可被修改的能力。修改可能包括修正、改进或软件对环境、需求和功能 规格说明变化的适应
- 可移植性:软件从一种环境迁移到另一种环境的能力 • 适应性:适应不同平台
4.质量管理体系
-
ISO
-
CMM
-
CMMI
五.软件测试流程
测试编写测试计划
编写测试用例
用例评审
部署测试环境
冒烟、正式测试
提交bug并跟踪
测试通过
发布上线
开发环境:开发人员写代码的环境
测试环境:测试人员进行测试的环境
预发布环境(UAT环境):验收测试(UAT测试)进行的环境
生产环境:真实用户使用环境
六.软件架构
软件架构(software architecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。软件架构是一个系统的草图。软件体系结构是构建计算机软件实践的基础
1.软件介绍
软件架构所指的就是说相应的系列性的抽象模式,可以为设计大型软件系统的各个方面提供相应的指导。从本质上来看,软件架构是属于一种系统草图。在软件架构所描述的对象就是直接的进行系统抽象组件构成。连接系统的各个组件之间就是做到把组件之间所存在的通讯比较明确与相对细致的实施描述。处于相应的系统实现环节,那么就会使得细化这些抽象组件成为现实的组件,比如可以是具体的某个类或者是对象。从面向对象领域进行分析,那么各个组件之前实施的连接实现往往是接口。
软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构件的描述、构件的相互作用、指导构件集成的模式以及这些模式的约束组成。软件架构不仅显示了软件需求和软件结构之间的对应关系,而且指定了整个软件系统的组织和拓扑结构,提供了一些设计决策的基本原理。
2.种类
按照当前我国的各种不同的关注角度,能够将软件架构划分成为三种类型。
1、逻辑架构
软件系统系统当中的各个元件之间所存在的关系,比如外部系统接口、用户界面、商业逻辑元件、数据库等。
2、物理架构
究竟是怎样做到在硬件当中放置软件元件。例如处于上海与北京进行分布的分布式系统的物理架构,这也就是说全部的元件都是属于物理设备,主要的有主机、整合服务器、应用服务器、代理服务器、存储服务器、报表服务器、Web服务器、网络分流器等。
3、系统架构
系统架构一般涉及到两个方面的内容,其一是业务架构,其二是软件架构。业务架构描述了业务领域主要的业务模块及其组织结构。软件架构是一种思想,一个系统蓝图,是对软件结构组成的规划和职责设定。一个软件里有处理数据存储的处理业务逻辑的、处理页面交互的、处理安全的等许多可逻辑划分出来的部分。
3.表现形式
往往表示软件架构则是借助于多种架构视图实施。基于本质上进行分析,那么这样的多种架构视图则是选取相应的图形方式将处于架构领域存在着十分重要意义的模型元素予以摘要性的说明。
(1)实施视图:
这主要包含的内容为包含这实施模型及其从模块到包、层的组织形式实施的概览;而且在这一过程中,还存在着把相应的逻辑视图中的包与类往实施视图中的包与分配模块的状况实施描述。
(2)逻辑视图:
这主要的是最为关键的设计类、从这些设计类到包与子系统的组织形式,另外还有的就是这些包与子系统到层的组织形式。
(3)配置视图:
这主要的是描述最为典型的配置平台的各种物理节点,还有的就是往物理节点分配来自于进程视图的任务的情况,往往这一视图仅仅只是在分布式系统。
(4)用例视图:
这主要的是场景与用例。
(5)进程视图:
这主要的是描述进程与线程的涉及的任务,这些任务的配置与交互,还有的就是把设计分配对象与类向任务,往往这一视图仅仅只是出于系统存在着特别高程度并行过中才使用
4.具体作用
1、开发新产品过程中软件架构所具备的作用分析
所谓的软件架构则是属于在现实的世界与计算机领域所搭建起来的一座沟通的桥梁,具体来说,其作用主要为以下几点。第一点就是进行业务目标的上乘。从本质上来看,软件架构往往存在着出于将业务目标完成而必须开展相应的大局规划的责任;第二点所指的就是进行技术决策的下接。凭借着把面向业务的相关需求往面向技术方向转向的软件架构设计方案,这可以将行之有效的限制与指导提供给后续的技术开发工作;第三点就是有效的将新产品的质量提升;第四点所指的就是进相应的新产品开发过程的组织;第五点所指的就是借助于相应的迭代实施相应新产品开展与增量的交付;第六点则是说控制所具备的复杂性,立足于相应的分而治之的思想,从而能够为金星秀问题所具备的复杂性实施相应的控制。
2、开发软件产品过程中系统架构所具备的作用分析
第一就是将所具备的相应的核心知识予以固化;第二就是可以提供相应的可重用资产;第三就是将产品推出的周期进行有效的缩短;第四就是使得产品开发与维护的总成本得以最大限度的降低;第五就是将产品的质量有效的提升;第六就是为批量控制提供有效的支持。
3、软件产品线架构所具备的特点分析
软件产品线架构就是说根据一个公司或者是某一个组织内部那些一系列的产品所进行设计的相应的通用架构。那么就能够了解到这样的一系列产品存在着特别多的相似之处那么这些能够借助同一个架构或者部分共享来实施具体实现,使得生产率得到最大限度的提升。软件产品线架构主要存在着以下的作用:
第一个作用就是应该将一系列的明确许可的变化进行考虑;第二个作用所指的就是必须做到文档化;第三个作用就是说应该可以存在着相应的产品创建者指南,将实例化架构的整个过程进行描述。
4、维护软件过程中软件架构的作用分析
从本质上来看,相应的软件维护工作主要的来源是Bug与需求变更。往往修复一个Bug与增加一个新的功能,那么通常都会涉及到架构环节的一条模块协作链,针对这样的情况,软件架构比有利于维护工作的开展;反之,如果对于架构并不能了解,相应的进行程序的盲目修改,这也就会存在着可能性对架构设计的思路造成未必,从而导致整个系统所存在的架构逐步显得比较混乱,这也就会存在着可能性导致出现不可思议的Bug与问题。
5、软件升级过程中软件架构的作用分析
相应的软件架构则是通过对软件系统实施持续性的修改,还应该必须做好重构,往往对其实施重构主要是两种状况:第一种状况就是特别混乱的架构,从而导致实施一个比较小的改动就会出现牵动全身;第二种状况所指的就是即将实施的升级软件存在着比较大的力度,之前的软件架构与新的需求根本就不能适应。相应的软件架构予以重构则是属于再工程的一种情况,往往必须实施的步骤为逆向工程、重新规划、正向工程这样的三个步骤
5.常用的软件架构
1)分层架构
分层架构(layered architecture)是最常见的软件架构,也是事实上的标准架构。如果你不知道要用什么架构,那就用它。
这种架构将软件分成若干个水平层,每一层都有清晰的角色和分工,不需要知道其他层的细节。层与层之间通过接口通信。
虽然没有明确约定,软件一定要分成多少层,但是四层的结构最常见。
- 表现层(presentation):用户界面,负责视觉和用户互动
- 业务层(business):实现业务逻辑
- 持久层(persistence):提供数据,SQL 语句就放在这一层
- 数据库(database) :保存数据
有的软件在逻辑层和持久层之间,加了一个服务层(service),提供不同业务逻辑需要的一些通用接口。
用户的请求将依次通过这四层的处理,不能跳过其中任何一层。
优点:
- 结构简单,容易理解和开发
- 不同技能的程序员可以分工,负责不同的层,天然适合大多数软件公司的组织架构
- 每一层都可以独立测试,其他层的接口通过模拟解决
缺点
- 一旦环境变化,需要代码调整或增加功能时,通常比较麻烦和费时
- 部署比较麻烦,即使只修改一个小地方,往往需要整个软件重新部署,不容易做持续发布
- 软件升级时,可能需要整个服务暂停
- 扩展性差。用户请求大量增加时,必须依次扩展每一层,由于每一层内部是耦合的,扩展会很困难
2)事件驱动架构
事件(event)是状态发生变化时,软件发出的通知。
事件驱动架构(event-driven architecture)就是通过事件进行通信的软件架构。它分成四个部分。
- 事件队列(event queue):接收事件的入口
- 分发器(event mediator):将不同的事件分发到不同的业务逻辑单元
- 事件通道(event channel):分发器与处理器之间的联系渠道
- 事件处理器(event processor):实现业务逻辑,处理完成后会发出事件,触发下一步操作
对于简单的项目,事件队列、分发器和事件通道,可以合为一体,整个软件就分成事件代理和事件处理器两部分
优点
- 分布式的异步架构,事件处理器之间高度解耦,软件的扩展性好
- 适用性广,各种类型的项目都可以用
- 性能较好,因为事件的异步本质,软件不易产生堵塞
- 事件处理器可以独立地加载和卸载,容易部署
缺点
- 涉及异步编程(要考虑远程通信、失去响应等情况),开发相对复杂
- 难以支持原子性操作,因为事件通过会涉及多个处理器,很难回滚
- 分布式和异步特性导致这个架构较难测试
3)微核架构
微核架构(microkernel architecture)又称为"插件架构"(plug-in architecture),指的是软件的内核相对较小,主要功能和业务逻辑都通过插件实现。
内核(core)通常只包含系统运行的最小功能。插件则是互相独立的,插件之间的通信,应该减少到最低,避免出现互相依赖的问题。
优点
- 良好的功能延伸性(extensibility),需要什么功能,开发一个插件即可
- 功能之间是隔离的,插件可以独立的加载和卸载,使得它比较容易部署,
- 可定制性高,适应不同的开发需要
- 可以渐进式地开发,逐步增加功能
缺点
- 扩展性(scalability)差,内核通常是一个独立单元,不容易做成分布式
- 开发难度相对较高,因为涉及到插件与内核的通信,以及内部的插件登记机制
4)微服务架构
微服务架构(microservices architecture)是服务导向架构(service-oriented architecture,缩写 SOA)的升级。
每一个服务就是一个独立的部署单元(separately deployed unit)。这些单元都是分布式的,互相解耦,通过远程通信协议(比如REST、SOAP)联系。
微服务架构分成三种实现模式。
- RESTful API 模式:服务通过 API 提供,云服务就属于这一类
- RESTful 应用模式:服务通过传统的网络协议或者应用协议提供,背后通常是一个多功能的应用程序,常见于企业内部
- 集中消息模式:采用消息代理(message broker),可以实现消息队列、负载均衡、统一日志和异常处理,缺点是会出现单点失败,消息代理可能要做成集群
优点
- 扩展性好,各个服务之间低耦合
- 容易部署,软件从单一可部署单元,被拆成了多个服务,每个服务都是可部署单元
- 容易开发,每个组件都可以进行持续集成式的开发,可以做到实时部署,不间断地升级
- 易于测试,可以单独测试每一个服务
缺点
- 由于强调互相独立和低耦合,服务可能会拆分得很细。这导致系统依赖大量的微服务,变得很凌乱和笨重,性能也会不佳。
- 一旦服务之间需要通信(即一个服务要用到另一个服务),整个架构就会变得复杂。典型的例子就是一些通用的 Utility 类,一种解决方案是把它们拷贝到每一个服务中去,用冗余换取架构的简单性。
- 分布式的本质使得这种架构很难实现原子性操作,交易回滚会比较困难。
5)云架构
云结构(cloud architecture)主要解决扩展性和并发的问题,是最容易扩展的架构。
它的高扩展性,主要原因是没使用中央数据库,而是把数据都复制到内存中,变成可复制的内存数据单元。然后,业务处理能力封装成一个个处理单元(prcessing unit)。访问量增加,就新建处理单元;访问量减少,就关闭处理单元。由于没有中央数据库,所以扩展性的最大瓶颈消失了。由于每个处理单元的数据都在内存里,最好要进行数据持久化。
这个模式主要分成两部分:处理单元(processing unit)和虚拟中间件(virtualized middleware)。
- 处理单元:实现业务逻辑
- 虚拟中间件:负责通信、保持sessions、数据复制、分布式处理、处理单元的部署。
虚拟中间件又包含四个组件:
- 消息中间件(Messaging Grid):管理用户请求和session,当一个请求进来以后,决定分配给哪一个处理单元。
- 数据中间件(Data Grid):将数据复制到每一个处理单元,即数据同步。保证某个处理单元都得到同样的数据。
- 处理中间件(Processing Grid):可选,如果一个请求涉及不同类型的处理单元,该中间件负责协调处理单元
- 部署中间件(Deployment Manager):负责处理单元的启动和关闭,监控负载和响应时间,当负载增加,就新启动处理单元,负载减少,就关闭处理单元。
优点
- 高负载,高扩展性
- 动态部署
缺点
- 实现复杂,成本较高
- 主要适合网站类应用,不合适大量数据吞吐的大型数据库应用
- 较难测试