2023自动化测试岗位面试题分享(部分给出答案,持续更新中。。。)
技术类问题-linux
- 常用的liunx命令
- 查看日志文件的最后100行(tail -n 100)
- 查看网卡ip地址(ipconfig)
- 查看剩余内存(free)
- 查看磁盘剩余容量(df -h)
- 查看文件大小(du -sh)
- 日志存放的位置(/var/log/)
- bin目录和sbin目录的区别
- core dump file是什么?(核心转储,当程序运行过程中发生异常退出时,由操作系统把程序当前的内存情况存储在core文件中叫做core dump)
- 755的分别是什么权限
- vi怎么查找文件内容
和less&tail一样 用/ ?去加上关键字搜索,N向上搜索,n向下搜索;分页展示log内容用more - find 查找不同类型的文件(find -typef)
- 用grep拿取文件中第一行的数据(grep -m1
tail -n 1
awk/sed) - liunx如何部署环境
- 如何在看日志的时候筛选关键字;筛选文件
- 查看主机端口占用情况(netstat)
- 查看cpu(top)
- 查看进程(ps)
- 查看文件第六行(sed -n ‘6p’ filename)
技术类问题-sql
- 常见的sql命令
- 缓慢查询的问题怎么去定位
如何进行慢查询 - 多表查询用哪些命令
- 左连接和右连接的区别
- 将表的前十条展示(limit)
- union和union all的区别
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。 - 去重有几种方式(group by;distinct;union)
- 数据库迁移怎么写
- sql查询第八大数据
select * from table order by sales desc limit 7,1 - 怎么把重复的数据筛选出来(having)
技术类问题-python(UI&API)
python常见问题
1、什么是列表什么是元组
2、什么是可变什么是不可变
3、列表和元组的区别
4、before class和before method的区别
5、@的作用
6、/和//的区别(前者是浮点数结果 后者是整数结果)
/就是正常除
//是取整
%是取余数
7、 _和__和__name__的区别
(1)单下划线用于定义私有属性和方法,可以用类名.get_privatemethod()进行调用
(2)双下划线用于定义类的实例,类变量,全局变量等,用来防止父类的方法被子类的方法覆盖;可以使用对象.类名__方法名(),在外部调用它
(3)前后下划线用于python内部定义的方法可以被重写比如__init
8、装饰器的作用
装饰器的解释与使用
(1)增强函数的功能,确切的说,可以装饰函数,也可以装饰类;可以在原有的逻辑上新增功能而不需要修改源代码
(2)使代码更加的简洁 便于维护不冗余
9、init方法和new方法的区别
(1)首先new是创建对象,而init是初始化对象,所以new方法会在init方法之前运行;
(2)其次new创建完对象会return这个对象给init方法,也就是self;而init方法没有返回值
10. 实例方法和静态方法的区别
11、python命名规则
命名规则为:
(1)可以包含字母数字下划线但是不可以以数字开头且不能包含空格;
(2)不可以是python关键字但是可以包含python关键字
12、基本数据类型
基本数据类型分为 数值,字符串,列表, 字典, 集合,元组,
其中只有列表字典集合可以进行修改
13、进程和线程的区别
进程是操作系统进行资源分配和调度的基本单位,多个进程之间相互独立不影响
稳定性好但是进程消耗资源大,开启的进程数量有限
线程是进程的一部分,是由cpu进行资源分配和调度的基本单位,多个线程共享一个进程的所有资源,缺点是如果一个线程崩溃都会造成进程的崩溃
14、对字符串去重并从小到大输出
set去重;sorted排序
15、从D盘下面创建文件并输入内容
16、打印斐波那切数列
17、Flask作用
flask框架是一个后端服务框架,能够部署服务,比如接口测试的时候,第三方接口调不通,我们可以使用它去写mockserver。
一般我们会
第一步:先用pip install安装flask框架。
第二步:模块中导入flask,并且创建服务对象,
第三步,在我们写的接口上指定路由,并且运行该服务。
这样我们的接口就可以通过http请求来调用了。
18、python如何实现拷贝对象
copy模块实现
19、元组可以作为字典的键嘛?
可以
在 Python 中,元组是可以作为字典的键的,前提是元组中的元素必须是不可变的。字典中的键必须是不可变类型,这是因为字典使用哈希表来实现键-值对的存储和查找。
不可变类型包括数字、字符串和元组。其中,元组是一种有序的、不可变的数据类型,可以包含多个元素,可以作为字典的键使用。
20、冒泡排序怎么写
21、用python随机生成身份证怎么做
22、python如何遍历json对象
23、json模块怎么使用
常用的是
使用自带的json官方库的json.dumps()和json.loads()可以把字典数据格式转json,或把json数据格式转字典。使用json.dump()和json.load()可以处理文件流数据的json格式对字典格式正逆向转换。
24、浅拷贝和深拷贝的区别
两者都是用的copy模块
区别是
(1)浅拷贝是对对象的内存地址进行复制只能够复制到对象的第一层;而深拷贝是递归的去对所有子对象进行复制,相当于完全创建一个新的对象不会被原来的对象影响;
(2)除此之外,深拷贝会比浅拷贝占用更多的内存的时间
25、输出奇数的列表利用列表推导式
list(map(lamda x: x if x%2 != 0 , seq))
26、python处理文件文本,该文件大于本机的内存,该如何进行处理
27、类方法和实例方法的区别
(1)类方法用@classmethod修饰且第一个参数是cls类本身;可以直接通过类名或者实例来调用
(2)实例方法的第一个参数是self实例本身;;并且只能通过势力来调用
28、break和conntinue的区别
29、迭代器、可迭代对象、生成器的区别
(1)可迭代对象即 可迭代的对象 例如list tuple dict str等
(2)迭代器是访问集合元素的一种方式;而生成器是用于生成元素的
(3)迭代器的创建需要iter()和next()两个函数,并且在可迭代对象被输出结束后会报一个stopiteration的异常
(4)生成器的创建可以用推导式或者函数加上yeild进行创建,生成器可以在生成器内定义方法;而迭代器不可以;生成器可以理解为是一种特殊的迭代器
附:一般当数据量较大的时候用生成器,数据量较少的时候用迭代器
30、python中的值传递和引用传递怎么实现的
值传递: 传递的是变量的值而非变量本身,变量的值不会被改变
引用传递: 传递的是变量本身,被传递的变量的值会被改变
在python里边
(1)可变类型(list/dict/set为可变类型)用的是 引用传递
(2)不可变类型(number/str/tuple)用的是 值传递
31、python里面的内存管理如何实现,什么样的内存可以释放?什么时候释放?
32、遍历文件夹找某个文件如何实现(os模块)
33、去重但是不改变原有顺序怎么实现(for循环/set+sort(key=))
34、dict中的key或者value怎么排序
(1)直接用sort排序
(2)sort搭配lamda函数进行排序
35、类方法和实例方法的区别
36、a is b和a= =b区别
is是比较两个对象的内存地址是否一致,而a==b是比较对象的值是否一致
37、json和dict的区别
1 首先json是js的一种数据格式;而dict是python的一种数据结构
2 dict里面的key是唯一的且无序的,而json的key是有序排列的而且是可以重复的,但是只能用字符串
3 最后是格式,dict中可以用单引号也可以用双引号,但是json只能用双引号
4 取值的话,json只能用第三方库jsonpath去取值,dict可以用python自带的方法,dict.get/dict.value等
38、对字符串翻转有几种方法
for循环;reverse;sorted
39、mock怎么使用的?
40、*args和kwargs的区别
前者表示不定长参数;后者表示关键字参数;在传入参数的时候,*args会将参数打包成tuple传给函数使用;而kwargs是打包成字典
自动化
1、CI的流程
2、功能测试&自动化测试的流程
3、自动化的好处
4、一般在项目中什么时候跑自动化
5、实现自动化中最大的挑战是什么,又在这次的事情中提出了什么建议
6、自动化框架是什么
7、用什么工具管理自动化的脚本
8、自动化在工作中的占比是多少
9、自动化实现的场景举例
10、ui和接口框架且常用到的库
11、说明对敏捷思想的了解
12、说明对PO设计模式的理解
13、 python+unittest+selenuim该框架的优势
方便重构代码;方便二次封装维护
会把每个模块,业务逻辑层的code,公共模块会放在另外一层;避免代码的冗余
14、框架中用例设计和数据驱动是怎么做的
15、Jenkins怎么用的
16、多进程,多线程,多协程怎么做
进程:mutipleprocessing
线程:threading
协程:asyncio+threading)
17、死锁怎么处理
18.、pytest和unittest的区别
19、为什么要做自动化
20、自动化实现的效果以及覆盖率
21、会用到unittest里面的哪些组件
testfixture
setupclass/ teardownclass
testcase
是最小的测试单元,具有独立性,主要检测输出结果是否满足期望值
testsuit
放testcase;可以简单理解为testcase的集合,主要用于对于集成管理要在一起执行的测试用例
testrunner
用于输出测试报告
22、公共模块层都放了什么东西
23、用什么方法能够提高自动化脚本的稳定性
保证自动化测试环境的稳定
专门的环境做自动化,不可以让别人破坏这个环境
UI里面元素的定位方法
竟可能保证xpath要短
如果一次定位不到竟可以能不变的元素去定位我们需要的元素
多元素的话多用find elements去返回元素集合用下标去取
加入脚本异常处理
比如如果失败了就重新跑一次;在except里面定义;try用于捕获正常代码,except用于遇到异常的操作+重新触发
sum
避免使用固定数据;降低用例耦合性;提升依赖环境稳定性,可以采用mock的形式屏蔽第三方环境的影响;脚本的异常处理;考虑可能出现的异常情况,尽量对每种可能出现的异常情况都有对应的处理方法,避免失败后程序的退出
note:
什么是BDD
BDD思想详解
BDD(behavior driven development)也叫行为驱动开发,行为驱动说白了就是框架的使用,更多的是为了项目相关的比如说需求提出方服务;目的是为了在业务和开发之间达成共识。
什么是TDD?
TDD也叫测试驱动开发
测试驱动是针对敏捷开发思想,实际实现是像微软那样 测试就坐在开发旁边看 测试和开发同步写代码,开发进代码之前要自动化测试通过
从解决问题分析:TDD是用于解决开发和测试之间脱节问题;BDD是用于解决需求和开发之间脱节问题。 从使用人群分析:TDD是开发人员和测试人员;BDD是客户和开发者。 从侧重点分析:TDD是侧重测试;BDD是侧重引导关注行为和规范。
怎么理解CICD?
CICD是持续集成,平时工作中自动化脚本结合Jenkins去跑 开发去定时的打包
UI自动化
- 元素无法定位可能的原因
- 如何进行断言?断言什么内容
- 动态元素怎么定位
- testrunner原理
- 怎么写xpath
- 某一个节点定位下一节点怎么写
- 子节点定位父节点怎么写
- 兄弟节点怎么定位(xpath/css/following-sibling&preceding-sibling)
- 写UI自动化某个case的步骤
- click某个button之前需要做什么步骤
- 定位到button但是没有反应,会怎么去分析问题
- 如果等待时间给的够还是无法定位到元素(click by js)
- alert怎么定位
首先确认是弹窗,然后利用自带的方法切换到 alert = driver.switch_to.alert;
接下来就可以正常的对该弹窗进行操作:
#点击弹窗中的确认
alert.accept()
#点击弹窗中的取消
alert.dismiss()
#获取弹出框的信息内容
alert.text - APP的自动化如何实现
- 手机端自动化测试用例和PC端的难点
- 看到手机端的对象无法识别怎么去处理
- 不同页面的元素怎么去进行管理的
- 如何测试图形验证码
- selenuim定位元素的几种方式
- app常用的定位方式
- app自动化测试要准备哪些数据
- APP测试和web测试自动化有哪些区别?
- app启动一个应用怎么写
- 包名或者activity怎么获取(adb命令获取)
- 用哪些方法做的自动化
元素定位
元素操作
click/sendkeys()/弹窗处理/下拉框
数据驱动(数据被打包到指定的文件里面)
ddt(python第三方的库)的形式:dataprovider/主要用的是ddt这个库
页面的验证;
断言
比如说assert - selenuim常用的方法
元素定位&元素操作 - 弹窗如何处理
- Selenium如何模拟鼠标键盘的操作(利用actionchains进行操作)
接口自动化
-
http请求有哪些方法
-
post和get的区别
-
post和put的区别
-
常见的http状态码
-
cookie和session的区别
cookie是存储在本地客户端的,而session是存储在服务端,这两者都是用于记录用户的状态,且都是由服务器端生成;
两者之间存在的联系是session会话保持需要依赖cookie,因为session id是存储在cookie中的 -
加密的接口如何测试
-
response怎么去断言
-
文件上传和文件下载用什么类型去判断
-
如何做用例设计,会从哪些点进行考虑
-
request中的json和data的内容区别
-
request写一个请求需要的参数
-
如何保持会话
构造一个全局的session对象
S = request.session()#构造一个全局的session对象
S.get =(url,headers).text #直接用session.method进行接口调用即可 -
dict如果没有给默认值怎么取值
dict.setdefault(key,default=None)
技术类问题-git
- 常用的git命令
- git reset和git hard的区别
- git rebase什么情况下会用到
- git版本回退怎么操作
- git拉取指定分支的命令是什么?(git checkout)
- 提交代码怎么做用哪些命令
- 遇到冲突怎么解决
- 有一个文件,别人修改了,你本地也修改了,你想保留本地版本不让他去更新别的文件怎么做
- git共有几个分区
- git的子模块常用命令
性能测试
- Jemter平时用来做什么
- jmeter如何实现参数化
- 性能测试的流程
- 登陆接口,创建订单的接口,登录接口会返回一个object的数据,里面有一个字段是token,需要放到创建订单的接口中去使用,创建订单的接口还需要有两个字段,一个是订单号,一个是订单时间,订单号需要随机生成一个十位数字,时间需要生成当前时间
- jmeter怎么做断言
- 怎么做关联接口的处理(jmeter数据如何存储的)
- 一般哪些接口会去做性能测试
- 压测和负载测试的区别
- 稳定性测试的目的
- 响应时间过长是什么原因
- 数据库性能问题怎么解决
- 内存泄露怎么解决
- 如何判断是内存泄漏
- 性能测试关注指标
- 如何生成性能测试报告
其他问题
- 在上家公司最自豪的事情是什么,主要职责是什么,遇到的最大挑战是什么
- 时间紧张的情况下怎么处理手上的任务
- 自己导致项目延期如何处理
- 如何完美地完成领导派发的任务
- 离职原因
- 你觉得是个bug开发不觉得是个bug怎么处理
- 个人职业发展规划
- 如何进行自我学习
- 怎么判断是前段还是后端的bug
- 团队合作方面有什么沟通技巧
- 个人的优势和劣势
编程题
将一个字符串中重复最多次的字符找出并打印出重复的次数
使用unittest框架验证两个变量之和是否等于2