题记:
整理一下网络上的热门自动化面试题,跟大家一起分享一下(可能和第一章部分内容重复)
1.selenium的原理?
python的第三库,当前是3.0版本,是操作浏览器的一个框架,包含了3个模块:IDE(录制和回放UI自动化)、grid(结合docker实现分布式自动化)、webdriver(操作浏览器的api)就像出租车司机等待我们给它发布指令去操作浏览器。
2.selenium熟悉的类
webdriver
driver = webdriver.Chrome()
driver.get()
driver.maximize_windows()
driver.switch_to.windows()
driver.switch_to.frame()
driver.find_elenment_by_id().click()
driver.find_elenment_by_link_text().clear()
driver.find_elenment_by_xpath().sendkey()
driver.find_elenment_by_css().get_attribute()
driver.find_elenment_by_css().is_select()
driver.find_elenment_by_css().is_enabled()
driver.find_elenment_by_css().is_displayed()
driver.quit()
3.元素定位常用方式?
先顺便总结下常用定位的优先级:
(1)有id点id
(2)有文本值用文本值
xpath=“//a[text()=‘新闻’]” > 文本值是新闻的元素
xpath=”//a[contains(text(),‘新闻’)]” > 文本值包含新闻的元素
(3)link_text()
(4)CSS定位
(5)定位半天不出来??? >>> 右键xpath试下
(6)还不出来??? >>> js定位试下
(7) chrome推荐一款插件 Chropath
4.说下CSS定位
单一属性定位("#id")(".s_class")(’[name=“wd”]’)
组合属性定位,模糊匹配很少用^=,~=,$=,
("[name1=‘wd’][name2=‘xd’]")、
(“input#kw”)(“input.s_class”)
5.如何处理弹框?
(1)div伪弹框,直接find_elenment就可以了
(2)win弹框(上传地图),标签是input类型,直接send_keys(),非input类型的挺麻烦
(3)alert、confirm、prompt弹框。driver.switch_to.alert(),driver.accept() driver.dismiss()
6.鼠标操作:
(1) def move_offset_click(self, canvas, *element):
return ActionChains(self.driver).move_to_element(canvas).move_by_offset(*element).release().click().perform()
7.class有空格,怎么定位?
不管是否空格,直接前面加点号就行:(“input.s_class.x_class”)
8.你是怎么做接口自动化的?
首先基于公司的基本业务筛选主要部分的用例,然后按照主流程梳理编写测试用例,然后结合正常场景/异常场景进行用例覆盖
基本上是自己搭建测试框架采用的是python+request+pytest+allure报告能够直观的看到用例执行的情况
9.你是怎么做UI自动化的?
先从基本用例中抽取正向用例,然后进行元素的提取,脚本的编写
然后采用Python+selenium+pytest+allure的关键字框架进行脚本编写
最后输出测试报告进行查看
10.你认为有必要开展UI自动化吗,原因是什么?
1.首先根据公司的项目来判断,如果是一个迭代版本周期太过频繁的项目不太适合,类似敏捷开发,一个星期迭代两次,界面大改或者更新
这种项目没有必要开展ui自动化,一个是维护脚本的成本太高,一个是浪费时间,有写脚本的时间,功能测试都测完了
2.如果项目迭代周期比较久,或者已经持续稳定,这个时候可以开展ui自动化测试,一个是页面基本固定元素都不太会变动,可以开展ui自动化
解放更多的测试生产力去执行其他的测试任务.也能覆盖到更多的场景(例:一个人测试一个模块可能会有固有思想,也可能会漏测,所以设计时就覆盖好用例的所有场景
方便日后的回归)
3.自动化的根本目的是解放更多的测试资源来完成其他的事情,有必要引入
11.你UI自动化执行下来BUG多吗?
首先,这个问题是个坑啊,千万不能说bug多.
因为ui自动化基本上是项目稳定下来才开始做的,基本上bug不多,要不就是可能元素变动了.导致元素找不到的报错
12.说一说token跟session的区别
Cookie 和 Session 的区别
安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。
存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。
有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。
存储大小不同: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。
具体可以查看此博客 https://segmentfault.com/a/1190000021810849
13.你说你做自动化用的都是些什么框架?
根据自己的实际情况来
笔者是unittest跟pytest都使用,基本上是结合python+selenium/request+pytest+allure进行测试框架的搭建
14.常用的接口工具有?
postman/jmeter/自己搭建的接口自动化框架
15.什么是接口?
前台来看是功能点的实现,数据传输的通道
后台来看:是一个实现了http协议和映射机制的函数。接口参数就是:前台传入的数据,接口的响应:函数的返回值
16.get与post的区别?
(1)get的参数是以?开头放在url里面的,项目中界面获取token的接口用到了get请求
(2)post请求占大多数,入参放在了body中,数据量比较大。
(3)从python的request库中看,get请求的源码也是基于post请求去实现的,当然他们都是基于request的类
17.你在写自动化框架的时候,测试用例保存到哪里?用什么去读取?
笔者基于自己写的关键字框架,测试用例保存在excel中使用xlrd3去读取excel之后,将数据在转换成字典格式,
再将字典格式的内容转换成一个列表包含他们,组成一条测试用例
也可以使用yaml文件去读取数据
还可以使用mysql读取数据库中的文件进行测试
18.什么是lambda函数?它有什么好处?
lambda只是一个表达式,函数体比def简单很多。
#!/usr/bin/python # -*- coding: UTF-8 -*- # 可写函数说明 sum = lambda arg1, arg2: arg1 + arg2 # 调用sum函数 print "相加后的值为 : ", sum( 10, 20 ) print "相加后的值为 : ", sum( 20, 20 )
19.*args, **kwargs是什么东西? 我们为什么会用它?
我们用 *args 当我们不知道要有多少个参数传给函数,或者我们想把一个列表或者tuple存起来以后传给函数。
我们用**kwargs当我们不知道有多少个关键字参数要传给函数,或者我们想把字典存起来以后传给函数。
20.python里面的深拷贝,浅拷贝
在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。
浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。
1.深浅拷贝都是对源对象的复制,占用不同的内存空间。
2.不可变类型的对象,对于深浅拷贝毫无影响,最终的地址值和值都是相等的。
3.可变类型:
=浅拷贝: 值相等,地址相等
copy浅拷贝:值相等,地址不相等
deepcopy深拷贝:值相等,地址不相等
21.实现一个字典数据结果的深拷贝
copy浅拷贝
deepcopy深拷贝
from copy import deepcopy
深拷贝和浅拷贝的例子:
data = {'user':'admin','num':[1,2,3]}
data2 = data.copy()
data3 = deepcopy(data)
查看结果:
data['user']='root'
data['num'].remove(1)
print(data)
print(data2)
print(data3)
输出结果:
{'user': 'root', 'num': [2, 3]}
{'user': 'admin', 'num': [2, 3]}
{'user': 'admin', 'num': [1, 2, 3]}
总结:
如果源拷贝对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
如果源拷贝对象不止一级目录的话,源对一级目录的子目录做任何改动,都会影响浅拷贝,但不影响深拷贝
22.class类中(self)指的是什么
self指的是类本身
23.rang函数的作用
函数语法:
range(start, stop[,step])
参数说明:
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
24.一个程序有n个变量采用边界值分析可以产生几个测试用例
4n+1
25.给你一个支付流程你是如何测试的?
功能测试。
用等价类和边界值,判断支付的金额;
如果没有登陆能否支付,支付成功后是否可以正常跳转;
支付方式是否支持扫码支付,第三方平台支付(支付包,云网等),语音支付,指纹支付;
支付时是否需要身份验证,支付后有无手机短信提示,是否可以找他人代付;
用边界值法有无支付额度限制,余额不足时有无提示,支付时是否是动态加密支付;
待支付状态:订单是否可以正常支付;是否可以取消;
有相同订单是否可以支付两次;
是否可以扫码支付,输入错误的密码会怎样显示,有无错误次数限制;
若支持扫码支付,二维码是否支持支付包和微信扫码,若两人同时扫描怎么处理;
有无最小支付金额限制,无意义的支付金额0,重复支付如何处理;
如果支付包含优惠金额,该怎么处理优惠额度;
性能测试 弱网,无网时是否可以支付;
退款到账时间,耗电量的多少;
带负载情况下的响应时间和吞吐率,在某个时间段内同时访问系统的用户数量 ;
压力测试 多人同时付款;
界面测试; 支付界面有无错别字,排版是否合理,颜色搭配是否合理; 兼容性测试 是否可以跨平台,不同电脑机型下显示有无区别;
安全性测试; 若支付不成功是否原路退款,若支付成功,有无支付信息提示;用fiddler抓包尝试修改价格,对订单金额有无效验; 直接输入需要权限的页面地址可用访问;
接口测试 第三方平台支付
26.分布式架构分为(B/S C/S)?
B/S架构(浏览器、web版)
C/S架构:客户端(先进行安装)
27.公司没有接口文档的情况下你能够开展接口测试吗?
可以开展,可以使用fiddler或者是charles进行抓包,或者用jmeter进行脚本自动录制.
28.测试的策略有哪些?
黑盒/白盒,静态/动态,手工/自动,冒烟测试,回归测试,公测(Beta测试的策略)
29.单元测试的策略有哪些
一般的单元执行策略有三种:孤立的单元测试策略(Isolation Unit Testing),自顶向下的单元测试策略(Top Down Unit Testing)和自底向上的单元测试策略(Bottom Up Unit Testing)。需要注意的是:在集成测试中也有自顶向下和自底向上的测试策略,但是测试对象不同。
1、孤立的单元测试策略(Isolation Unit Testing)
方法:不考虑每个模块与其它模块之间的关系,为每个模块设计桩模块和驱动模块,每个模块进行独立的单元测试。
优点:这个方法比较简单,最容易操作,可以达到很高的结构覆盖率,可以并行开展,该方法是纯粹的单元测试。
缺点:桩函数和驱动函数工作量很大,效率低。
2、自顶向下的单元测试策略(Top Down Unit Testing)
方法:先对最顶层的单元进行测试,把顶层所调用的单元做成桩模块,其次对第二层进行测试,使用上面已经测试过的单元做驱动模块,以此类推,直到测试完所有模块。
优点:可以节省驱动函数的开发工作,效率高。
缺点:随着被测单元一个一个被加入,测试过程将变得越来越复杂,并且开发和维护的成本将增加。
3、自底向上的单元测试策略(Bottom Up Unit Testing)
方法:先对最底层的模块进行单元测试,将模拟调用该模块的模块设置为驱动模块,然后再对上面一层做单元测试,用下面已经测试好的模块做桩模块,以此类推,直到测试完所有模块。
优点:可以节省桩函数的开发工作量,测试效率较高。
缺点:不是纯粹的单元测试,底层函数的测试质量对上层函数的测试将产生很大影响。
30.什么是事务,知道事务提交、回滚
事务是并发控制单位,用户定义的一个操作序列。这些操作要么都做,要么都不做,是不可分割的的工作单位。通过事务,sql server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性,主要用于一些对操作过程的完整性比较高的程序。(事务的特性:原子性、一致性、隔离性、持久性)。
事务提交是提交事务的所有操作:具体来说就是将所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束。
事务回滚是数据库返回到事务开始的状态;事务在运行过程中发生某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的更新操作全部撤销,使数据回滚到事务开始时的状态。
部分内容引入文章如下,不分先后:
原文链接: https://blog.csdn.net/weixin_45451320/article/details/117794309
原文链接: https://blog.csdn.net/u013354486/article/details/80602229
原文链接: https://blog.csdn.net/hard_days/article/details/110388559
原文链接: https://blog.csdn.net/qq_36595013/article/details/88231747
原文链接: https://blog.csdn.net/weixin_39621185/article/details/109618701