一、软件测试基本概念
1. 软件
1)软件的历史、定义、概念
■ 计算机:1929年,电子管计算机,第一代;1956年,第二代:晶体管计算机,第三代:小规模集成 电路,第四代:大规模集成电路。计算机代表硬件,躯壳。计算机软件:灵魂。
1. 理论奠基(1930-1946)
- 阿兰·图灵提出“图灵机”理论,奠定了计算理论与算法的数学基础。
- 冯·诺依曼设计“存储程序”架构,成为现代计算机体系的核心。
2. 早期阶段(1946-1955)
- 第一台通用计算机ENIAC诞生,编程通过打孔纸和机器语言实现,无明确“软件”概念。
3. 高级语言与软件危机(1955-1970)
- 高级语言(如FORTRAN)的兴起简化了编程,但软件开发缺乏系统方法,导致代码混乱、维护困难,引发“软件危机”。
4. 软件工程诞生(1970-1990)
- 1968年北约会议首次提出“软件工程”概念,强调系统化开发流程与项目管理,推动瀑布模型、增量开发等方法论。
5. 现代发展(1990至今)
- 面向对象编程:提升代码复用性与模块化设计。
- Web与移动时代:动态网页技术(PHP、Java Web)和移动应用兴起。
- 开源与云计算:开源社区(如Linux)推动协作创新,云计算扩展了软件的分布式能力。
■ 软件的发展:
■ 第一代:纸带上打孔,用于科学计算,批处理。
■ 第二代:编程:汇编语言(低级语言)
■ 第三代:面向过程的程序,C、cobol、Fortran
■ 第四代:面向对象的程序,c++、java、ruby、python
■ 第五代:大数据、人工智能
■ 软件定义:
■ IEEE(国际电气化工程师协会)支撑计算机程序运行的代码、文档、数据统称为软件。通常称为:计算机程序
■ 软件工程学
■ 概念:使用特定的方法,流程、工具来解决软件研发的问题的理论体系 ■ 目标:解决软件研发过程中出现的问题
■ 软件危机:预算经常超支、交付延迟、软件质量差、维护困难、软件的可移植性差,两个类似的软件很少能够重用
■ 软件工程7原则:
一、开闭原则(OCP)
定义:软件实体(类、模块、函数等)应对扩展开放,对修改关闭。
作用:
- 提升系统可维护性,避免修改已有代码引入风险。
- 通过抽象层(接口/抽象类)隔离变化,例如Windows主题设计中通过抽象主题类支持动态扩展。
实现方法:
- 定义稳定的抽象接口,将可变逻辑封装到具体实现类中。
- 示例:在电商系统中,支付模块可通过抽象支付接口支持新增支付方式(如支付宝、微信)而无需修改原有逻辑。
---
二、里氏替换原则(LSP)
定义:子类必须能替代父类且不破坏原有逻辑。
作用:
- 确保继承体系的正确性,避免多态场景下的运行时错误。
- 例如“正方形不是长方形”问题,若正方形继承自长方形并重写面积计算方法,会导致面积计算逻辑矛盾。
实现方法:
- 子类仅扩展父类功能,避免重写父类方法。
- 若需改变父类行为,应通过组合而非继承实现。
---
三、依赖倒置原则(DIP)
定义:高层模块不依赖低层模块,二者均依赖抽象;抽象不依赖细节。
作用:
- 降低模块耦合度,例如通过接口定义数据库操作,实现MySQL和Oracle的无缝切换。
实现方法:
- 面向接口编程,将具体实现类通过依赖注入(如Spring框架)解耦。
- 示例:计算机组装时,通过CPU和内存接口定义规范,而非依赖具体品牌。
---
四、单一职责原则(SRP)
定义:一个类/模块仅承担一个职责。
作用:
- 提高代码可读性和复用性,减少修改影响范围。
- 例如用户信息管理模块中,将用户基本信息与地址信息拆分至不同类。
实现方法:
- 按功能拆分复杂类,确保每个类仅因一个原因变化。
- 示例:日志记录模块独立处理日志写入,避免与业务逻辑混合。
---
五、接口隔离原则(ISP)
定义:客户端不应依赖其不需要的接口,接口应最小化。
作用:
- 避免“胖接口”导致实现类冗余,例如打印机接口拆分为打印、扫描和传真三个独立接口。
实现方法:
- 按功能细分接口,例如电商系统中将订单操作拆分为创建、支付、查询等独立接口。
---
六、迪米特法则(LoD)
定义:对象间应减少直接交互,仅与“朋友”通信(如成员变量、方法参数等)。
作用:
- 降低系统耦合,例如通过中介类协调模块交互,而非直接调用。
实现方法:
- 封装中间层,例如GUI界面中按钮点击事件通过控制器转发,而非直接操作数据库。
---
七、合成复用原则(CRP)
定义:优先使用组合(has-a)而非继承(is-a)复用代码。
作用:
- 避免继承破坏父类封装性,例如通过组合引入日志工具类而非继承日志基类。
实现方法:
- 将功能委托给独立对象,例如Java的IO流通过装饰器模式动态扩展功能。
2. 软件的作用
1. 软件的生命周期
1. 软件定义
软件是指一系列按照特定顺序组织起来的计算机数据和指令,它们共同构成了能够使计算机执行特定任务的程序。软件是计算机系统中的逻辑部分,与硬件(即计算机的物理组成部分)相对应。软件不仅包括实际运行的程序代码,还包含相关的文档、数据和其他必要的资源。
2. 软件设计与实现
-
计划阶段:产品计划
需求调研:找用户、找竞品
可行性研究: 经济、技术、政策三层面进行评估
-
技术设计
需求的确认和分析
技术设计:概要设计:技术选型、框架搭建:dev
-
详细设计:定义函数、接口
-
技术实现:编码、调试
-
集成测试:单元测试、接口测试
-
确认测试:系统测试、性能测试
3. 软件的使用、退役
- 发布上线:把软件产品部署到生产环境
- 运营
- 退出江湖:软件 产品不在维护和运行
4.软件危机
1.软件的规模发生巨大的变化,软件研发的管理形式就落后
2.用户的需求不明确,需求容易发生变化
3.不可见性,实现之后维护成本和管理就变得困难的
4.软件的复杂度增加
5.软件研发构成
1)产品经理SA(系统分析师):调研用户的需求,汇总整理出产品的需求规格说明书
2)项目经理:控制项目的进度、资源的调配、对研发结果负责 1.5~3
3)研发部:负责技术设计、实现、调试 40~100
4)测试部|质量部:负责产品的测试,保证产品发布的质量 0.8~1
5)运维部:负责产品发布上线,维护在线环境,保证线网运行指标符合要求 0.8
2. 测试
1. 测试的历史、定义、概念
1. 测试的历史发展
软件测试1951年世界程序大会美国程序员提出测试从研发中分离出来,开发工程师不要测试自己的程序
2. 测试的发展阶段
- 测试等同于调试,在1951年之前,一个登录功能:用户名、密码正确,提示登录成功。
- 测试主要用于确认软件产品是按照需求要求来实现的。关键词:确认
- 测试除了要确认之外,还必须使用破坏性的用例,来验证软件产品没有做不允许做的。关键 词:验证
- 测试是为了预防可能出现的错误。关键词:预防
3. 软件测试定义
(IEEE:电气电子工程师学会)为了发现软件中的问题或者验证软件按照需求实现的而运行软件的过程
- 目的:发现问题,尽可能多的找出bug
- 手段:运行软件
- 本质:过程 -- 》完成某一个事务所必须的步骤统称。
4. 概念【重点】
- 测试用例:一次实际的测试数据和操作组成的集合。比如:测试登录功能.
- bug:缺陷的别名
- 缺陷:软件产品中存在的不符合需求的功能、实现或者错误的描述、实现。
- 缺陷包含:错误、故障、失效,因为错误,所以可能导致故障,故障导致功能失效。
5. 测试工程师的角色扮演:
1. 用户
- 第一种:正常用户,是需要通过对软件进行操作来达成自己某些业务目的的人
- 第二种:粗心的用户:在使用过程中会制造一些小麻烦的人。比如:错误输入,不按照要求操作,心急
- 第三种:破坏者:使用软件的目的是为了破坏软件的运行、窃取数据等等。黑客
2. 工程师
在某个领域里面、掌握处理相关业务的流程规范、方法论、技术体系、工具体系的专业人士。
- 计划
- 流程规范,规范等同于标准
- 方法论、技术
- 工具体系
2. 测试的方法论、技术
纠错:从软件中找bug
破坏性测试:从对软件运行不利的层面去设计测试用例
预防阶段:在软件设计引入以前的经验,对用户可能出现的错误操作进行预防
测试工程师的任务:扮演用户去使用软件
正常用户:依据软件要求的操作或者本着成功的目标去使用软件的人
粗心用户:在使用过程中,出现一些错误操作
破坏者:有明确的破坏动机的使用者
软件测试工程师和研发工程师的关系:战友
备注:来源于蜗牛学院的学习笔记,结合AI查询资料,以及个人总结,仅供个人学习和参考,如有不对欢迎交流学习。