软件测试定义
软件测试就是验证软件产品特性是否满足用户的需求。
优秀的软件测试人员具备的素质
1)综合能力(沟通能力,学习能力,开发能力,文字能力)
2)掌握自动化测试技术(软件更新测试历史功能)
3)测试用例的设计能力
4)探索性思维
概念篇
用户需求:没有经过合理的评估的需求
软件需求:有具体步骤的合理的需求
开发模型
软件的生命周期就是软件的开发模型
需求分析——计划——设计——编码——测试——运行维护
瀑布模型
start——>需求分析——>计划——>设计——>编码——>测试——>End
特点:每个流程只执行一次,线性的开发流程,运行的产品很迟才能看到
适用场景:需求固定的小需求场景
螺旋模型
螺旋模型中各个阶段都引入了风险分析+原型
适用场景:规模庞大,复杂度高,风险大的项目
缺点:额外增加了成本
增量模型,迭代模型
增量模型:将大需求拆分成小需求,每个小需求独立开发上线
迭代模型:在基础版本上层层优化
敏捷模型
敏捷宣言:
个体与交互重于过程和工具
可用的软件重于完备的文案
客户协作重于合同谈判
响应变化重于遵循计划
总结敏捷模型的四个特点:轻文档,轻流程,重目标,重产出
Scrum
三个角色和五个重要会议
三个角色:产品经理,项目经理,研发团队
五个会议:发布计划会议,迭代计划会议,每日例会,演示会议,回顾会议
测试模型
V模型
未将测试前置
W模型(双V模型)
开发V模型并不是单单指编码阶段,而是 为产品开发流程而实施的各个阶段
特点:测试的对象不仅是程序,需求和设计同样要测试,测试与开发是同步进行的
缺点:
需求,设计,编码等活动被视为串行的;
测试和开发活动也保持着一种线性的前后关系,上一阶段完全结束才能开始进行下一个阶段
重流程,无法自持敏捷开发模式
BUG篇
bug 等级:崩溃,严重,一般,次要
软件测试贯穿于软件的整个生命周期
当且仅当规格说明是存在的并且正确,程序与规格说明之间的不匹配才是错误
当程序没有实现其最终用户合理预期的功能要求时,就是软件错误
如何避免和开发产生争吵
1:先检查自身,bug是否描述的不清楚(先反省自己)
2:站在用户角度考虑并抛出问题
3:BUG定级要有理有据(拿出bug定级描述文档,然后将bug的表现和bug定级描述文档进行匹配,说服程序员)
4:提高自己技术和业务水平,做到不仅能提出问题,最好也能给出解决方案
测试用例
笔试的时候编写测试用例题,需要按照Excel表格的方式来答题
面试的时候回答测试用例题,按照思维导图的方式来
常规思考+逆向思维+发散性思维
设计测试用例的万能公式
功能测试+界面测试+性能测试+兼容性测试+易用性测试+安全测试
功能测试:从产品功能角度出发,验证功能是否是正确的
界面测试:界面所有的元素都需要测试(大小,颜色,形状,材质)
性能测试:通常为一些极端情况
兼容性测试:
易用性测试:具备简单易上手的属性(引导教程)
安全测试:保证产品的安全性
特殊测试:弱网测试,安装卸载测试
软件的生命周期
需求分析——计划——设计——编码——测试——运行维护
软件测试贯穿于软件的生命周期
软件测试的生命周期
需求分析——测试计划——测试设计——测试执行——测试评估——上线——运行维护
如何进行弱网测试
抓包工具:fiddler
基于需求的设计方法
设计等价类
确定有效等价类和无效等价类
编写测试用例,设计具体的测试数据
边界值
边界值+次边界值
有效的边界值选无效的次边界值
无效的边界值选有效的次边界值
正交法
正交法的目的是为了减少用例数目,用尽量少的用例覆盖输入的两两组合
L4(2³)
L:正交表
4:行数
2:水平数
³:因素数
正交表的性质:
每一列中不同的数字出现的次数相等
任意两列数字的排列方式齐全而且均衡
借助工具来实现正交表:allpairs
判定表法
错误猜测法
对被测试软件设计的理解,过往经验以及个人直觉,推测出软件可能存在的缺陷
测试文档
1.项目背景
2.项目功能
3.对项目进行测试
3.1编写测试用例
(用例截图)
3.2执行测试
(选取几个用例的步骤截图)
4.测试总结
(覆盖了多少个页面,用例是否全部执行通过,发现了多少bug)
打开开发者界面
ctrl+shift+i
对接口进行测试
请求方法,URL,请求参数,响应
接口测试工具:postman
Cookie:当前用户的登录状态
测试分类
按照测试目标分类
1:界面测试
2:功能测试
黑盒设计测试
3:可靠性测试
可靠性=正常运行时间/总运行时间
按照执行方式分类
静态测试:不实际运行的被测软件,静态的检查程序代码,界面或文档
动态测试:实际运行被测程序,输入相应的测试数据,检查实际输出结果和预期结果是否相符
4:按照测试方法
4.1白盒测试
动态测试方法主要分为六种测试方法:
语句覆盖:每个语句至少执行一次
判定覆盖:既要测试T的情况,也要测试F的情况
条件覆盖:
判定条件覆盖:结合判定覆盖和条件覆盖来设计测试用例,用例既可以覆盖到条件,也可以覆盖到判定
条件组合覆盖:
路径覆盖:
4.2 黑盒测试
黑盒测试有:等价类,边界值,因果图,场景法,错误猜测法
4.3 灰盒测试
5.按照测试阶段分类
5.1单元测试
5.2集成测试
5.3系统测试
冒烟测试:检查主流程是否能走通
5.4回归测试
所有的页面所有功能测试完成之后整体再回归一遍
7.按照实施组织划分
α测试(内测)
β测试(公测)
自动化测试
自动化测试能够取代人工测试吗?
自动化测试是测试人员手工编写 ,后续如果有功能的变更自动化也需要进行不定期的维护和更新
自动化测试可以大幅度降低工作量?
错误,自动化测试只是测试工作种的一小部分测试行为
自动化测试金字塔
UI:界面,精力较多,回报较少
API:接口测试,精力较少,回报较高
单元测试:对程序最小单元执行测试,精力很少,回报很高
web自动化测试
创建驱动
不同浏览器有不同的驱动
1.元素定位
打开页面的开发者工具
Ctrl+shift+i
选中箭头
cssSelector
选择器
copy——》copy select
XPath
如果是动态元素怎么办?
选择到他的上一层标签,然后手动加上直接子集,加上下一个标签
注意:登录状态下和非登录状态下,自动化打开的页面不相同,要注意一致性
findElement(By) 在页面查找元素,返回值 WebElement
findElements(By) 在页面查找元素,返回值是List<WebElement>
2.操作测试对象
点击:
click()
看每个标签的样式,除了hidden,绝大多数都能点击
模拟按键输入:
sendKeys(" ")
清除文本内容
clear();
获取文本信息
getText()
获取属性值
getAttribute()
获取当前页面标题
getTitle()
获取当前页面URL
getcurrentUrl()
报错了找Exception
窗口
窗口大小的设置
窗口切换
返回值是String
切换句柄
屏幕截图
能够把当时执行的场景保存下来
关闭
driver.close()关闭当前标签页
driver.quit()关闭浏览器,释放 driver 对象
等待
Thread.sleep();
假如写自动化代码出现NoSuchElement错误
第一步:在报错的代码前添加Thread.sleep(秒),设置的时间长一点
第二步:执行自动化,在自动化打开的页面里打开前端开发者工具,手动检查元素是否真的不存在
(1)自动化打开的页面确实不存在该元素
——手动打开的页面和自动化打开的页面不一样(登录和未登录状态下页面不一样)
——元素为动态元素(解决办法:先定位动态元素的前一级标签,再增加要定位的元素标签)
(2)自动化打开的页面确实存在该元素
——代码执行的速度比页面渲染的速度快(解决方法:等待)
强制等待
直接添加Thread.sleep(秒)
优点:写法简单 缺点:极大的增加了自动化执行的时间
隐式等待
可以规定查找元素时,在指定时间内不断查找元素,如果找到了代码继续执行,没找到,直到超时才会报错
implicitlyWait() 参数:Duration类中提供的毫秒,秒,分钟等方法
优点:智能等待,作用于全局
缺点:只能查找元素,不能确定元素是否是要找
显试等待
智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码
显式等待只作用在当前的条件上
混合使用等待了话等待时间不可预测
浏览器导航
打开网站
浏览器的前进,后退,刷新
弹窗
警告弹窗,确认弹窗,确认弹窗
弹窗特殊点:不能通过元素定位
输入文本信息
alert.sendKeys(" ");
文件上传
把文件路径上传到该元素
sendKeys( );
浏览器参数设置
设置无头模式(默认为有头模式)
不用打开浏览器,后台执行
浏览器加载策略