🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快
1、什么是自动化测试
自动化测试是软件测试活动中一个重要分支和组成部分,随着软件行业发展,市场对软件周期及软件质量要求越来越高,催生出来各种开发模式,比如常见开发模式敏捷开发,同时对我们测试人员提更高的要求,此时,产生自动化测试,即通过工具或者脚本来达到测试的目的,没有人工或者很少人工参与的软件测试活动叫自动化测试
自动化测试就是将测试流程从手工转换为自动化实现形式
自动化测试技术是目前业内特别流行也是特别主流的一个测试技术,是目前测试人员最为核心的能力之一
2、自动化测试框架是什么?
参考文档: 聊聊自动化测试框架 - 老_张 - 博客园
WEBUI中最主流的自动化测试框架是基于selenium+wendriver实现的
3、为什么要进行自动化测试?
①、黑盒测试回归效率低
②、手动测试的偶然性和不确定性
③、回归的覆盖率不足
④、交付的产品质量无法保证,全靠评估
⑤、系统越复杂,问题越多
⑥、上线时间长、构件失败率高导致的蝴蝶效应(迭代快,加班多)
4、自动化测试能解决什么问题?
①、提高出现问题后的响应速率
②、降低回归成本
③、提高回归覆盖率
④、提高回归效率
⑤、提高回归的稳定性
5、自动化测试优势
1)更方便对系统进行回归测试,当软件的版本发布比较频繁时,自动化测试的效果就更加明显
2)可以自动处理原本繁琐、复杂的任务,提供更准确测试,提供人员积极性
3)自动化测试具有一致性和复用性,测试脚本可以在不同版本进行重复测试,可以保证测试内容的一致性
这也就是,为什么在软件测试领域,自动化测试已成为趋势的原有,也越来越多互联网企业都把自动化测试作为测试活动重要组成部分,极大解放生产力
6、自动化测试的不足有哪些?
①、无法减少成本投入,而是为了加快测试结果反馈,提升测试质量
②、自动化适用于回归和冒烟,而不是发现BUG
③、录制回放功能是鸡肋,可视化并不是一个很好的做法
ps:主要是appium做AAPUI自动化的时候
④、不是所有所有系统所有功能都适合做自动化测试
7、自动化测试分类
1)web自动化测试
让程序代替人为验证WEB项目功能的过程
测试工具很多
ATP(UFT)付款
Robot framework
Selenium主流:
特点:1)可以支持多语言,java/python/ruby等多语言
2)免费开源的框架
3)可以支持多浏览器,比如firefox/chrom/ie
4)可以执行多并发测试,selenium可以在多台机器来执行并发测试,从而提高测试效率。增加资源利用
Winrunner
Testcomplete
Waiter...
场景:网页-比如:携程
携程登录中的滑块验证
2)app自动化测试
工具:
Monkeyrunner AndroidSDK自带的测试工具,可以支持自定义数据和事件进行测试,只支持Android4.1版本及以上
Monkey AndroidSDK自带的测试工具,只支持随机数据和事件,一般对软件进行压测
Ui automator Android自带的测试框架,基于java,代码结构比较简单,但是sdk16(Android4.1版本)
Appium 是ios,android测试框架,支持多语言,可以支持多平台,并且可以调用selenium的api
3)接口自动化测试
工具:postman/jmeter/soapui
代码:python+requests
8、自动化测试的应用场景
UI自动化:主要用于回归测试,对系统流程进行校验
rf、airtest、selenium IDE4
功能测试:校验所有的流程所有的功能模块,通过边界值通过等价类通过各种场景来做功能的校验,确保功能是符合需求的
在这个过程中,更多的是做流程的验证,每一次的版本发布新的版本回归,做回归测试
产品从开发环境到测试环境,从测试环境到仿真环境,从仿真环境到生产环境,整个过程中每一次发布到新的环境都要做的是,校验流程是否是正常实现
有了流程的确保实现之后,再看其他的功能的分支是不是正确的
第一步第二步是固定的
接口自动化:主要用于后端接口地逻辑测试,确保系统内不运行是有一定质量保障的
接口测试:在测试中要尽早的不断地进行测试,尽早地发现Bug越早修复成本九月底
9、主流自动化测试技术介绍
主流自动化技术:selenium
代表了测试行业唯一的自动化测试技术
selenium在ui自动化测试领域内,是绝对的技术应用
结构就是基于selenium+webdriver来实现的自动化测试
移动端appium来实现,就是基于selenium来实现的
接口自动化:python+requests来实现的(80%)
UI自动化包含WebUI和AppUI,
目前主流的web自动化实现:
基于Selenium+WebDriver来实现
app自动化实现:基于Appium+driver来实现
10、selenium的自动化测试实现
1、环境部署
搭建编程环境 python
搭建selenium环境 pip install selenium
如果安装失败,一般有两种:
1、升级你的pip指令
黄色警告
2、遇到超时
红色 timeout
pip install selenium --default-timeout=1000
搭建webdriver环境
浏览器驱动安装,主流的chrome/firefox/safari/ie/
Downloads | Selenium
如果想要下载旧版本
CNPM Binaries Mirror
(python要和webdriver版本要一一对应)
将下载的driver文件放到python的安装根路径下即可
Ps:自动化执行,所有的浏览器安装在默认路径
这个只是单纯的省去了配置环境变量的工作
实现测试
安装pycharm作为代码编辑工具,安装的时候用社区版就可以了,专业版与社区版最大的区别就是Django框架的使用
11、使用pycharm新建项目时,怎么选择虚拟环境和本地环境
方便于不同的项目切换,不然一个项目中安装太多库,有些还需要卸载不需要的库,再安装需要的库,比较麻烦,所以就有了虚拟环境,虚拟环境和本地环境的库互不干扰,独立存在的。
实体环境和虚拟环境怎么安装库
实体环境安装库直接可以直接使用pip命令安装(也可以在本地环境目录下安装库),
虚拟环境安装第三方库可以再虚拟环境安装目录下用cmd命令行使用pip安装第三方库
要在venv/Scripts下
或者通过项目file-setting安装库
在新建项目时,选择虚拟环境或本地环境,当setting时安装的库就在对应环境中
12、selenium+webdriver工作原理
13、线性代码可以实现的功能为什么要通过框架(selenium+webdriver+关键字驱动+数据驱动)来实现
线性代码没有任何可以被优化被复用的价值的东西
企业:请一个自动化测试开发的目的是研发出公司可复用的自动化测试框架,而不是写一个只有自己可用的测试框架
1、能够复用到各种需要的项目中的
2、能够让其他的测开人员可以一同维护
3、能够以最低的使用成本和学习成本来上手
4、能够方便于后期维护和更新修改
而要实现这样的效果,就需要测试框架的设计和研发。
14、一个简单的selenium+webdriver线性代码
Ps:代码中的find_element_by_xpath/id/name方法已经被禁用了,统一改成find_element()
案例:
fromselenium.webdriver.common.byimportBy
element_agree=driver.find_element(By.CSS_SELECTOR,'div.pop_footer>a.reg_btn.reg_agree')
15、关键字驱动+数据驱动形式下实现的自动化测试框架的设计模式
读取到数据,基于固定格式的数据内容进行拼接,拼接后的内容作为关键字所需要的参数,进行传入,从而执行对应的关键字,再将结果与预期进行对比,从而获得单条测试用例执行是否通过的结果
16、设计理念和设计思路
基于关键字驱动结合数据驱动,然后将主要常用的一些内容把它封装起来,形成一个类对象,然后将这个类对象作为一个工具提供的类,然后结合unitTest或者ddt或者是pyTest来进行测试用例的一个整合,或者通过Excel或者yaml的形式去做这个数据驱动的文件,通过这种文件读写的形式,来结合到关键字的调用,去实现的一系列的流程,再通过一个写入的操作,做断言,那我们就完成了一套基本的测试用例。
17、quit与close的区别
quit是关闭浏览器,并且关闭ChromeDriver进程
close是关闭当前标签页
18、企业主流po模式的实现 pageObject
po原理讲解
PageObject模式:
PO模式,是目前测试行业公认最佳的自动化设计模式,取自关键字驱动模式来做的一次升级
完全基于页面实现的模型
PO设计原理:
1.提取selenium公用的方法,作为基本对象
2.页面业务流程的关联设计
3.调用业务流程实现自动化测试
优势:
1.将不同的页面封装成不同的页面对象,分别进行管理
2.进一步降低冗余
3.对于代码的阅读性和维护性有进一步提升
4.测开针对公司的系统,结合需求与业务,结合实际项目情况,设计对应的测试框架与测试工具,提供测试人员进行功率提升,并且进行维护
po模式实现
po模式+unitTest实现自动化
19、自动化测试目的
对系统中存有的流程进行回归和自动执行
20、现阶段测试行业主流的测试框架封装形式
1.关键字驱动形态
将所有常用的Selenium.Appium.Request的模块的函数进行二次封装,结合数据驱动来实现关键字的调用,从而实现的自动化测试。
web的关键字驱动类:主要用于二次封装Selenium中的常用函数。
Selenium就相当于一个大型超市,二次封装的行为就相当于是去超市购物,将常用的函数全部采购回家,以便于在使用的时候直接从家中调用
常用函数:
1.访问url
2.创建webdriver
3.定位元素
4.输入
5.点击
......
2.页面对象模型
POM.PO,是目前广泛应用在ui层的自动化测试设计模式,基于这种形态来进行的封装框架主要用于单个系统的自动化测试覆盖。
21、你如何将实现的自动化测试框架在公司落地推广?
自动化测试框架的应用对象不是你自己,而是其余的测试执行人员以及研发团队的开发人员进行使用。
1.demo演示会议,用于介绍现有框架的使用规范和情况
2.部署框架,结合到指定的项目进行试点
3.生成规范化文档,将使用流程规范化定义,对所有的需要推行的角色进行学习和培训。
4.基于公司的实际业务需求和项目需求,来不断优化框架。
所有的推广行为一定要拉一个有话语权的领导垫背。
22、了解过哪些数据驱动的形式,分别的优劣是什么?
Yaml:
优点:易于维护,数据轻便。
缺点:学习成本过高,数据编写不直观。
Excel:
优点:维护好,当你的框架成型之后,基本不用再动源码,只需要了解规范格式,就可以零成本使用自动化。
缺点:所有的行为都需要固化内容来进行设定,相对死板且复杂。
Json:-
类:-与yaml类似
Text
......
23、如何优化现有的测试框架?
可以从测试框架的分布式结构设计与多用例并行处理的效率角度来进行优化。
将原有的测试框架运行过程从线性改为并行处理的模式。
24、Selenium三大等待
等待的作用:
为了提升自动化运行的成功率
自动化是由机器来进行操作,将手工测试所执行内容转换为机器执行
在指定的地方,进行等待,以便于系统响应,再继续进行
等待的三大方式:
1.强制等待
所有自动化学习者,最先接触的等待就是强制等待(Sleep)
作用:当代码运行到强制等待这一行的时候,无论出于什么情况,都强制性等待指定的时间
需要通过time模块中的sleep进行导入来使用
From time import sleep - sleep(2)
Import time - time.sleep(2)
优势:简单入门,调试的一把好手
劣势:只能够对单次生效,无法做有效的判断,会浪费大量的时间
2.隐式等待
直接通过WebDrive对象的implcitly_wait()方法进行设置
implcitly_wait(10)
藏起来的等待,一次设置,终生有效,针对当下的WebDriver对象,进行的等待时长的设置
作用:对WebDriver对象设置全局等待,每一次操作,如遇到页面加载,则默认进入到隐式等待
如遇元素无法找到,则进入隐式等待,当达到等待最大时长,则继续进行后续的代码
优势:设置一次即可,而且不会报错
劣势:必须等待页面加载完成才会进入后续的操作,或者等待超时再进入后续的操作
3.显式等待
光明正大的等,专门用于指定的元素和对象
WebDriverWait(driver,10,0.5)每0.5查找一次dirver对象,直到寻找时间达到10s
通过导入fromselenium.webdriver.support.waitimportWebDriverWait
优势:专门用于对指定的某一个元素进行等待
劣势:必须声明,只对单次生效,复杂程度相对其他等待而言,更高
WebDriverWait(driver,10,0.5).until(条件)查到元素进入筛选条件
WebDriverWait(driver,10,0.5).until_not()查不到元素进入筛选条件
当多个等待一同被调用时,系统的等待时间取决于最长的时间等待
25、自动化过程中应该避免的坑有哪些?
1.元素找不到(考虑是否有iframe和句柄的切换,元素定位技术不熟练,等待添加是否合理)
自动生成的id,复制没用,需要手写
2.代码成功率不高
3.不清楚什么时候该用什么技术
学完主流技术
26、selenium八大元素基本定位
元素定位:
所有的ui层的自动化都是基于元素定位来实现的。
所有的被操作的元素,都是WebElement对象(网络元素对象)
元素=HTML标签
基本格式:
<tagName attribute1="" attribute2="" >text</tagName>
标签:
a: 超链接
img:图片
Input:输入框,文件上传
Button:按钮
通用:div li span ...
实际系统中,元素的标签类型不是由表象来决定的,是通过CSS样式表来决定的。
而自动化时,就是基于标签的属性来定位标签。
如何定位精准你需要操作的元素:
八种元素定位
1.id,基于元素属性中id的值来进行定位
id类似于人们身份证上的身份证号,不出意外都不会重复。
2.name,基于元素属性中name的值来进行定位
name类似于人们身份证上的名字,不会重复。
3.link text,主要基于超链接进行定位
4.partial link text,link text 的模糊查询版本,类似于数据库中的like %
当模糊查询匹配到多个符合条件的元素,选取第一个
5.classname,基于元素样式来进行定位,非常容易会遇到重复。
6.tagname,标签名来进行定位,重复度最高,只有在需要定位后进行二次删选的情况
7.cssselector,应用相对较多的一种行为,最初ie浏览器不支持xpath,完全基于class属性来实现的定位
网页f12,选中右键copy selector
8.xpath,目前应用最多的一种行为,基于页面结构来进行的定位
网页f12,选中右键copy xpath
绝对路径:不写
相对路径:基于匹配制度来查找元素,依照xpath语法结构来查找
例如://*[@id="kw"]
//表示从根路径下开始查找
*任意元素
[]表示筛选条件(查找函数)
@表示基于属性来筛选,例如id="kw"表示基于id属性值为kw的条件来进行筛选。
确认xpath路径是否正确:
1.在开发者工具element页面使用crl+f查找,进行判断
2.在console中输入$x()进行校验
如果是基于text来定位元素
在[]中添加text()="文本内容"进行查找,例如://a[text()='登录'
当你定位元素,无法直接定位时,可以通过定位子级元素返回父级来获取元素
//a[text()='登录'/..通过子级定位上一级
Linux返回上一级../
//input[@id="kw"]
函数写法://input[contains(@id,'kw')]
contains表示进一步查找,匹配项模糊查找
//input[contains(text(),'ddddd')]
在input标签中进一步查找文本中包含ddddd
27、Selenium理解
目前业内最核心的技术就是自动化测试。
最为主流的自动化测试技术就是Selenium
Appium是基于Selenium继承实现的。
Selenium核心是基于JS Core来实现的。
在现阶段的测试中,只会使用Selenium+WebDriver来实现自动化测试。
28、环境搭建
安装Selenium
1.通过Pip install selenium
2.通过Pycharm中的interpreter来进行安装(setting- project-...)
Mac :pip3 install selenium
安装WebDriver
通过百度下载安装
FileFox:geckodrover,适配考虑到Selenium版本与浏览器版本
不管是什么类型的浏览器,一定记得关闭自动更新
29、Python+Selenium的实操讲解
WebDriver+Selenium运行原理:
WebDriver是一个服务端,启动时就是启动一个服务,由该服务上传下发基于HTTP协议下的指令。
WebDriver是服务端代理,当自动化结束时,需要记得释放资源
Driver.quit()
30、Driver.get()怎么能访问url?
因为get()中封装了一个execute方法
通过Http网络协议,传递一个请求到浏览器驱动,而这个命令是基于selenium中的command指令,名为GET,通过这个GET指令去下发指令到WebDriver,请求时访问url
31、构成框架的组件,应该具备哪些功能?
**Log:**日志记录和管理功能,针对不同的情况,设置不同的日志级别,方便定位问题;
**Report:**测试报告生成和管理以及即时通知,测试结果快速响应;
**Source:**配置文件、静态资源的管理,遵循高内聚低耦合原则;
**Common:**公共函数、方法以及通用操作的管理,遵循高内聚低耦合原则;
**TestCase:**测试用例管理功能,一个功能点对应一个或者多个case,尽可能的提高覆盖率;
**TestData:**测试数据管理功能,数据与脚本分离,降低维护成本,提高可移植性;
**TestSuite:**测试组件管理功能,针对不同场景不同需求,组装构建不同的测试框架,遵循框架的灵活性和扩展性;
**Statistics:**测试结果统计管理功能,每次执行测试的结果统计、分析、对比以及反馈,数据驱动,为软件优化和流程改进,提供参考;
**Continuous:**持续集成环境,即CI环境,包括测试文件提交、扫描编译、执行测试、生成报告及时通知等功能,持续集成是自动化测试的核心!
常见框架都拥有共同特性:编程语言+单元测试框架+扫描编译工具+持续集成工具+数据库+项目管理工具。
python+selenium+unittest+Git+Jenkins+MySQL+testlink/redmine
编程语言:编写测试脚本、日志记录和输出;python
单元测试框架:提供测试脚本运行、异常校验等一些列的配置;unittest
扫描编译工具:测试文件扫描编译,一般配合持续集成工具使用效果更佳;
持续集成工具:Jenkins,经典的持续集成工具;
数据库:测试数据管理;mysql
项目管理工具:测试结果统计管理;git
32、自动化测试框架的设计?
参考文档: 浅谈自动化测试框架设计 - Andrew213 - 博客园
从架构层面设计,采用java开发常用MVC框架思想,分为逻辑控制层(Controller)、数据持久层(Model)、页面展示层(View)
ps:个人理解的逻辑控制层(Controller)一般处于项目的中间部分,接口层,起到一个承上启下的作用,可以连接到持久层通过持久层里面的sql语句获取到需要的数据,然后将数据经过一些逻辑处理,通过接口传到页面展示
数据持久层(Model)处于项目的底层,连接到数据库,对数据库进行一些简单的增删改查,主要是写一些方法对数据库进行操作
页面展示层(View)从逻辑控制层,也就是我理解的接口层级通过后台传过来的接口获取到数据,在页面上进行样式的输出
MVC框架是在java上,目前python中没有这种说法,python中关键字驱动+数据库驱动和POM架构等理解含义都是一样的
自动化测试领域python使用的比较多,所以我以python为例:
逻辑控制层:Selenium适用于Web自动化,真实模拟用户操作浏览器;request应用于接口自动化;unittest是一个目前很流行实用的单元测试框架,有完善的用例管理模块。
数据持久层:用例测试数据的管理,可以通过csv文件,yaml等文档形式去管理测试数据,可以通过MySQLdb+MySQL的方式管理数据库。
#数据库连接
import MySQLdb
# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取一条数据
data = cursor.fetchone()
print "Database version : %s " % data
# 关闭数据库连接
db.close()
Python 操作 MySQL 数据库参考文档: Python 操作 MySQL 数据库 | 菜鸟教程
操作数据库还有哪些具体的?
页面展示层:主要是测试报告的展示,采用HTMLTestRunner实现测试报告的展示。
ps:HTMLTestRunner是HTMLTestRunner.py文件,不是框架也不算插件
上面只是理解,具体设计,下篇文字详说。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。