一、linux
查看进程、杀进程
ps aux # 查看所有进程ps -ef|grep 服务名 # 查看指定的服务进程top # 以全屏交互式的界面显示进程,三秒刷新一次top -d 4 # 间隔4秒刷新一次pstree -aup # 以树状图的方式展现进程之间的派生关系kill -9 PID # 以PID杀进程killall 进程名 # 以进程名杀进程, -l: 忽略大小写不同
查看端口使用情况(指定的、所有的)
netstat -nultp # 显示tcp、udp的端口和进程等相关情况netstat -ntlp # 显示所有tcp端口的使用情况netstat -nultp | grep 端口号\服务名 # 查看指定端口\服务的端口使用情况lsof -i:端口号 # 查看端口的占用情况
查看内存、cpu、磁盘
cap proc/meminfo # 查看内存信息cap proc/cpuinfo # 查看cpu信息free # 查看内存使用情况top # 实时查看cputop -d 4 # 间隔4秒刷新一次df # 查看磁盘df -h # 带单位查询du -h --max-depth=1 # 查看当前目录下各个子目录所有使用的空间
查看日志(实时、指定时间、关键字、报错信息前多少行、后多少行、统计一共出现了多少次)
seq 20 > nginx.log # 准备20行nginx.log文件tail -10 nginx.log # 查看nginx日志最后10行,不加 -10 默认显示最后10行tail -f 10 nginx.log # 实时查看最新追加的内容sed -n '/2022-04-01 14:12:39/,/2022-04-09 15:23:43/p' nginx.logcat nginx.log | grep '系统测试' # 关键字查找所在整行cat nginx.log | grep '系统测试' -A 10 # -A 后10行 -B 前10行 -C 前后10行cat -n nginx.log | grep '系统测试' # 显示行号cat nginx.log | tail -n +1000 | head -n 500 # 查看日志,从1000行开始,显示500行cat nginx.log | head -n 1400 | tail -n +1350 # 查看日志,显示1350行到1400行cat nginx.log | grep ''|grep '系统测试' | wc -l # 关键查看统计次数# 其他cat:由第一行开始显示文件内容tac:从最后一行开始显示,不知道你是否观察出来,tac是cat倒着写的,所以功能上两个是相反的nl:显示的时候,同时输出行号more:一页一页地显示文件内容less:与more类似,相比于more,可以往前翻页head:只看前面几行tail:只看后面几行
vi命令(模式、末行命令)
命令模式====》通过输入命令可以进入到编辑模式
1. a命令:从命令模式进入到编辑模式,在光标所在位置后进行输入
2. A命令:从命令模式进入到编辑模式,在光标所在行尾进行输入
3. i命令:从命令模式进入到编辑模式,在光标所在位置前进行输入
4. I命令:从命令模式进入到编辑模式,在光标所在行首进行输入
5. o命令:从命令模式进入到编辑模式,在光标所在行下一行输入
6. O命令:从命令模式进入到编辑模式,在光标所在行上一行输
7、p命令:粘贴到光标所在的下一行
8、P命令:粘贴到光标所在的上一行
9、yy命令:复制光标所在的行内容====》结合p/P命令使用
10、2yy命令:复制光标所在行开始往下2行内容====》结合p/P命令使用 11、x命令:删除光标所在的字符
12、X命令:删除光标所在的前一个字符
13、dd命令:删除光标所在行的内容
14、D命令:删除所在行光标开始到行结束所有的内容
末行命令:关键字查询、查看行号、替换、删除
1、w:保存
2、wq:保存并退出
3、wq!:强制保存并退出
4、q!:强制退出
5、set nu:在编辑模式下显示文件的行号
6、set nonu:取消行号
7、/关键字:在编辑模式下查找所有的关键字且高亮显示
①、通过vi+文件:不会将所有的关键字高亮显示、可以通过按n键选取下一个
②、通过vim+文件:将所有的关键字高亮显示
8、noh:取消关键字高亮显示
9、在编辑模式内将file1文件中的1-3行内容写入到新的文件中(新文件可以不存在)
在末行命令模式输入:1,3w dcs100
dcs100:代表将内容写入到dcs100文件中且保存在/目录下
cat、less、more区别
①、cat是一次性查看文件的所有内容
②、less一般是查看文件内容较多的时候,且支持分页查看文件
③、less查看文件最后的内容会显示end
④、less查看文件结束后需要手动退出到命令行(ctrl+z)
⑤、more一般是查看文件更多的时候,且支持分页和百分比显示查看文件
⑥、more查看文件结束后自动退出到命令 more>less>cat
如何配置ip地址、修改临时ip地址
# 修改临时ip地址ifconfig eth0 IP地址 netmask 255.255.255.0# 配置静态ip地址DOOTPROTO=static # dhcp动态修改为static静态IPADDR=IP地址NETMASK=子网掩码GATEWAY=网关# 修改后重启网卡
如何查询指定文件或者目录的权限
ls -l [文件\目录] # 查看指定文件或目录权限
何修改文件或者目录的权限、指定添加执行的权限
chmod 777 [文件\目录] # 修改文件、目录权限chmod [a\u\g\o][+\-][r\w\x] # a:所有用户、u:创建者、g:创建者同组用户、o:其他用户;+:增加权限、-:取消权限;r:读、w:写、x:执行
两个服务器的文件传输
# 两台都需要装有openssh-clientsscp [资源] root@[IP地址]:/mnt/
将一个命令的结果写入到一个文件中
find -name nginx > text.txt # 命令结果覆盖写入text.txt中; >:覆盖、>>:追加
find命令(类型、名字、时间、大小)
find [目录] -[name\size\type\amin\cmin\mmin\atime\ctime\mtime] [条件]find -name nginx # :从 中开始查找名为nginx的文件和目录find -name n* # n*: 模糊匹配,查找开头为n的所有文件和目录find -type d # d: 查找出类型为目录的所有目录、f:查找文件find -size 1000c # 查找1000字节的文件find -size +1000c # +:查找大于1000字节的文件、-:查找小于1000字节的文件find / -amin n # amin:查找最后n分钟、cmin:最后n分钟改变状态、atime:最后n天、ctime:最后n天改变状态、mtime:系统中最后n*24小时被改变文件数据的文件
移动或者重命名文件
mv test.txt text.txt # test重命名textmv test.txt # test移动至 目录
打包、解压(tar包、zip包、tar.gz包...)
zip -r test.zip file1 # 打包带有目录的文件需要加—runzip test.zip # 解压tar -cvf myfile.tar.gz tmp/file etc/ssh # "c" 压缩,将/tmp/file etc/ssh 压缩为myfile.tar.gztar -xvf myfile.tar.gz # "x" 解压到当前tar -xvf myfile.tar.gz -C tmp/www # "x" 解压 "C" 指定解压到/tmp/www/目录
覆盖追加
cat file1 > file1 # >: 覆盖、>>: 追加sed -n '5,10p' file1 > file2 # 将文件1的指定内容追加到文件2中
*二、H模型(研发流程/测试流程/项目组的工作流程)
需求评审:你提过哪些问题
a、例如在登录模块用户名输入那一块需求写着提示请输入用户名,我提的问 题是输入用户名这块是否是支持用户名和手机号两种形式
b、还有在后台商品管理模块的商品列表查询是否支持模糊匹配查询
用例评审:你提过哪些问题、别人给你提过哪些问题
测试报告:有哪些内容、什么时候写、怎么写(文档、工具)
a、测试的功能、范围
b、测试环境、测试时间、测试人员
c、测试阶段:冒烟测试、sit测试、回归测试
d、执行的用例数(全量)、每个测试阶段执行的用例数
e、bug统计:bug总数、L1、L2、L3、L4bug数量及占比
f、完成的功能、修复的bug数、遗留的bug数
g、每个阶段的bug数
h、风险上报(遗留的bug、偶先的bug、未完成的功能)
i、交付的文档、测试结论
j、在企业中,报告一般以邮件的形式发送给领导且抄送组内成员
k、在企业中有些测试报告可以通过工具生成
测试报告在功能测试通过之后写
测试计划:计划包含哪些内容、写过作为初稿
简介(目的、背景、范围)
约束(准入、准出)
资源与环境(人力资源配置、测试环境配置)
测试任务与进度
风险及风险管理(对有可能因为测试不到位的地方打预防针)
测试交付文档(思维导图、用例、报告、方案)
测试的阶段(冒烟测试阶段、SIT测试阶段(SIT1、SIT2....)、回归测试阶段)
风险把控:遇到过哪些风险、如何解决的、如何避免这些风险
开发压缩测试时间(测试时间不足):如何处理
首先确定需求的优先级(优先测试需求级别高的)可以3直接编写测试点、省略编写测试用例(后续添加)及会议形式的用例评审(可以通过邮件的形式)
借人力、加班、SIT测试阶段轮数可以相应的减少
及时将风险进行上报
上线时候出现bug你是如何处理的
给你一个项目或者需求如何开展工作(备注:给你一个需求你是如何进行测试的)
如何快速融入/了解一个新的项目
上线的标准是什么(测试准入准出)
在测试过程加需求你会如何处理
在项目中有没有遇到过经常修改需求、你是怎么处理的?
多久一个版本(平均一个月、半个月、紧急版本)、项目组成员(测试开发比例:1:4)
三、用例编写
编写用例用到了哪些方法、结合项目举个例子
你负责的模块怎么测的(讲解测试点)
如何划分用例的等级、有哪些级别
如何保证/提高用例的覆盖率
用例包含哪些内容/用例有几大要素
如何评判一条用例是高质量用例/如何编写高质量用例
你写过多少条用例(备注:讲最近一个版本写过多条用例)
一天执行多少用例(80条)
购物车、百度、搜索、发朋友圈、红包、点赞、转账、游戏
cd这个命令如何测试、测函数
界面测试、功能测试、弱网测试、性能测试、兼容型测试、安全测试
四、bug相关
bug的流程
一条bug包含哪些内容
bug的级别有哪些、能否举例说明下
如何提一个条高质量的bug
你提了一个bug开发不认可如何处理
你是如何定位bug的:查看服务器日志、抓接口、经验分析、查看数据库、业务逻辑判断
如何判断一个bug是前端的还是后端的
你找到过多少个bug(最近的版本找了多少个bug、记得要合理)
偶现的bug如何处理
你印象最深刻的bug是哪一个(备注:关于业务逻辑的bug、bug的原因、bug解决方案 )
五、搭建环境
搭建环境流程
安装项目所需的环境,部署项目包
tomcat默认端口号 、mysql默认端口号、nginx默认端口号
tomcat:8080 mysql:3306 nginx:80
如何修改tomcat端口号
conf > server.xml > 修改Connector中port=8080的端口
tomcat里面的目录
bin:执行程序目录
conf:配置文件目录
webapps:项目包部署目录
lib:
logs:日志存放目录
temp:
work:
tomcat和nginx、apache区别
apache 静态解析、不支持动态页面
tomcat 只用做java服务器,处理动态请求
nginx 负载均衡、反向代理、处理静态请求,处理速度高于apache
apache和nginx相比,nginx适合做前端服务器,适合做负载均衡
六、项目
项目介绍
项目模块
负责的模块
负责模块的测试点
项目做了多少年
七、mysql数据库
常见的数据类型
char、varchar、int、date、bigint、
常用的一些聚合函数(拼接多个字段:concat())
sum():求和 avg():平均值 max():最大值 min():最小值 count():统计记录数
修改和插入的语句
insert into 表名 values()
update 表名 set 字段=值 where 条件
单表查询的语法:分组、排序、模糊查询、limit、、between...and...
select * from student group by sex;
select * from student order by id asc;
select * from student where name like '张';
select * from student where limit 1,5
select * from student where id between 3 and 8;
多表连接:基本连接、内连接、左边连接、右连接、硬连接
基本连接:select * from student s, class c where s.id=c.sid;
内连接:select * from student s inner join class c on s.id=bb.sid;
左连接:select * from student s left join class c on s.id=c.sid;
右连接:select * from student s right join class c on s.id=c.sid;
硬连接:select * from student s union select * from class c;
左连接、右连接、内连接区别
左连接:左表为主表,右表为从表;优先显示主表;主表内容全部有,从表内没有的显示Null
右连接:右表为主表,左表为从表;优先显示主表;主表内容全部有,从表内没有的显示Null
内连接:显示两个表中相关联字段的记录
char和varchar的区别
区别:
char字段的最大长度为255字符,varchar字段的最大长度为65535个字节;
char类型在空间使用上会有浪费,而varchar类型在空间使用上比较节省;
char类型的查找效率高,varchar类型的查找效率比较低。
备份表、表数据
create table 原表 like 新表
INSERT into 新表 like select * from 原表
三表怎么连接
select * from a left join b on a.id=b.id left join c on a.id=c.id
索引和视图、数据库引擎
sql优化就是优化索引,什么是索引?
索引想相当于书的目录
索引的数据结构是B+树
索引的优势
提高查询效率(降低IO使用率)
降低CPU使用率
索引的弊端
索引本身很大,可以存放在内存或硬盘上,通常存储在硬盘上
索引不是所有情况都使用,比如(少量数据、频繁变化的字段、很少使用的字段)
索引会降低增删改的效率
视图相当于一张虚拟的表,不会存储在数据库中,以动态的形式生成
数据库引擎:innodb,myisam
还有了解过其他的数据库?
关系型数据库
SQL Server
Oracle
SQLLite(嵌入式,占用资源低)
MariaDB
PostgreSQL
非关系型数据库
redis(键值对模型)
MongoDB(文档模型)
hbase(列模型)
查询所有科目都及格的学生姓名

select sname from score_table where sname not in(select sname from score_table where score < 60 group by sname)
查询A表中不在B表中的名字
select name from A where name not in(select name from B)
八、开放性问题
可以接收加班/谈谈你对加班的看法?
职业规划/近几年的规划
为什么离职、离职的原因
你有什么想问我的
你在公司是如何与同事进行相处
你觉得你在项目所处的角色是什么
你觉得你在项目组最有成就感的一件事是什么
你觉得你个人优势是什么
你觉得你有哪些缺点
你手上有没有offer
九、python面试题
常见的数据类型
str、int、bool、tuple、list、dict、set
python2和python3的区别
python3 去除了long类型,只有一种整形-int
新增了bytes类型
输出:print 改成了函数
输入:raw_input() 改成input()
range()函数返回的是一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表
列表和元组的区别
列表可变,元组不可变
列表元素可重复,元组元素不可重复
有序序列、无序序列有哪些
有序列表:list(可变对象)、tuple(不可变对象)、str(不可变对象)
无序序列:dict、set、控制集合数据的对象
可变对象、不可变对象
当对象的值发生变化,但内存地址没有改变时,则说明是可变类型
当对象的值发生变化,内存地址也发生改变时,则说明是不可变类型
可变对象有:列表、字典、集合
不可变对象有:元组、字符串、数值
深浅拷贝
①、copy.copy():浅拷贝 浅拷贝只能拷贝最外面的一层不可变对象、里面的一层可变对象引用的还是同一个内存地址 ②、copy.deepcopy(): 深拷贝 深拷贝相当于把所有的值拷贝过来后存储到一个新的内存地址,相互之间不受影响
九九乘法表
for i in range(1, 10):
for j in range(1, i+1):
print(‘{} * {} = {}’.format(j, i, j*i), end=‘ ’)
print()
冒泡排序
num_list = [2,3,54,6,3,5,1,4]
for i in range(0, len(num_list) - 1):
for j in range(j, len(num_list) - i -1):
if num_lsit[j] > num_list[j+1]:
num_list[j], num_list[j+1] = num_list[j+1], num_list[j]
print(num_list)
字典中键必须是什么类型
必须是不可变类型
使用 dir() 函数查看方法,要有 __hash__ 方法
常用的第三方模块
selenium、requests、pymysql、xlrd、pyYMAL、ddt、
给你一个列表如何取最后两个元素的值
num_list = [23,45,65,7,34,6,8]
print(num_list[-2:])
给你一个列表如何进行排序、根据元素的长度如何进行排序
sorted()函数:针对于所有的可迭代对象进行排序
使用列表对象中的sort函数 key参数为len reverse为False 来升序
str_list = [‘sdfsdf’, ’ssddfgfgdfsdf‘, ‘sdffdgfdg’]
str_list.sort(key=len, reverse=False)
is和==的区别
is:判断内存地址
==:判断值
sort和sorted区别
①、sort只能对列表进行排序②、sort没有返回值、是在原列表的基础上进行排序③、sorted可以对所有的可迭代对象进行排序 ④、sorted有返回值,排序后会返回一个新的列表⑤、sort和sorted既可以升序、也可以降序(备注:reverse=False(升序)、reverse=True(降序))
如何获取字典中键和值
获取键:dist1.keys()
获取值:dist1[‘key’]
append和extend区别
append():方法向列表的尾部添加一个新的元素。只接受一个参数
extend():方法只接受一个列表作为参数,并将该参数的每个元素都添加到原有的列表中。也是只接受一个参数
字符串、列表、字典常用的方法
字符串:split、lstrip、rstrip、strip、replace、count、join、find
列表:append、pop、sort、extend、remove、count、index、insert、reverse、copy
字典:keys、get、pop、values、items、fromkeys、copy
去除ab字串、查询指定目录下的所有文件包括子目录
content = ‘aabbsdfskdjfab’
while ‘ab’ in content:
content = content.replace(‘ab’, ‘’)
print(content)
os模块:如何获取当前执行模块的路径、上级路径
os.path.dirname(__file__)
os.path.dirname(os.path.dirname(__file__))
迭代器和生成器的区别
可迭代对象包含迭代器。
如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。
类的三大特性
封装、继承、多态
类方法、实例方法、静态方法的区别
①、定义类方法需要添加装饰器classmethod
②、定义实例方法不需要添加任何装饰器
③、定义静态方法需要添加装饰器staticmethod
④、类方法自带一个形参cls
⑤、实例方法自带一个形参self
⑥、静态方法不带任何参数,相当于类里面的一个普通函数
⑦、类方法中可以用用类变量、调用类方法
⑧、实例方法中可以应用类变量、实例变量,调用类方法,实例方法
⑨、静态方法中既不可以应引用实例、类变量,也不可以调用实例、类方法
self代表的是什么、object代表的是什么
self:类的实例,非类
object:基类、父类、超类
有用过装饰器?用过哪些、装饰器的原理是什么、装饰器的作用是什么
类方法装饰器:classmethod,静态方法装饰器:staticmethod,
python怎么连接数据库
导入pymsql库
使用pymsql的Connection类进行连接,连接需传入参数:host主机地址、user数据库用户名、password数据库密码、database库名、port数据库端口号(默认3306)
手撕代码
十、UI自动化
常见元素定位方法
xpath中的单斜杠和双斜杠代表的是什么意思
selenium的优缺点、原理、使用的是什么协议
selenium2和selenium3的区别
什么样的项目适合做自动化、不适合做自动化
谈谈你对自动化的理解
什么时候开展自动化工作、什么时候编写自动化用例
自动化用例的占比
写了多少条自动化用例、执行一次花费多久时间(403条用例、15-20分钟)
找不到元素有哪些原因、如何处理的
如何提高脚本运行的效率
如何提高脚本运行的稳定性
平常是如何去维护脚本的
自动化运行的策略(回归测试、定时任务、集成)
你在自动化过程中遇到过哪些问题(难点)、你是怎么处理的
selenium中的三种等待方式
如何判断元素是否是唯一的
UI自动化是怎么做的:怎么定位、页面操作、框架、po分层
动态的元素如何进行定位
隐藏的元素如何进行定位
如何保证你的脚本兼容所有的浏览器
做自动化的时候数据是怎么处理
unittest框架中的四个方法区别、执行用例的规则+顺序
还有了解过其他的框架?unittest和pytest区别
十一、接口理论知识
1、什么是接口:
统称api,程序与程序之间的对接、交接。接口测试主要时为了检验不同组件之间的数据的传递是否正确,同时接口测试还要测与第三方系统的对接
2、为什么要做接口测试?
3、怎么做接口测试?
测试接口是主要通过工具或者代码模块向http请求发送接收,来实现手工接口测试和自动化接口测试
在公司的实际情况:
前台开发和后台开始发是独立进行,一个项目是由前后台组成,最终我们要进行前后台联调,这时候我们就使用接口,那么在前后台联调前,我们需要对不同接口进行测试
4、什么时候测试接口?
前端:前台、后台
后端:数据库、接口、服务器
添加一个用户:
5、接口测试流程:
6、接口常见的请求方法有哪些?
get 向特定资源发出的请求(请求指定页面信息,并返回实体)
post 向指定资源提交数据进行处理请求(表单)
put 向指定资源位置上传最新内容(从客户端向服务器传送的数据取代指定文档的内容
head 与服务器和get请求一致的响应,响应体不会返回,获取包含在消息头中的原信息
dalete 请求服务器删除所标示的资源
一、你使用最多请求有哪些?
7、get请求和post请求的区别?(面试常问)
get请求的参数是存放在Url地址栏中,post请求的参数是放在body表单中
get是可见的在Url地址栏中,post不可见所以post要比get更安全
get一般它是用来获取数据,post是提交数据
get产生一个tcp数据包,post是产生两个tcp数据包
get在参数数据类型中,是直接收ASCII字符,post是没有限制
get方式提交的数据大小是有限制的,因为是在url地址栏中入参,而post由于是在body中所以没有限制
get请求只能进行url编码,post支持多种编码方式
get请求会被浏览器主动缓存,post不会主动缓存需要自己手动设置
get在浏览器回退时是无害的,post会自动再次去提交请求(因为post每次调用时都会创建一个新的资源)
8、如何分析一个BUG是前端还是后端的?(面试常问)
通过抓包工具或者F12先抓此接口
对抓到的接口对着接口文档看请求报文有没问题,有问题肯定就是前端的数据问题(前端BUG)
如果请求报文没问题,那就看返回报文(响应报文)返回的数据不对,那就是后端BUG
9、TCP、IP五层模型(强制记住)
应用层:负责应用程序之间的沟通,网络编程主要是针对的就是应用层
应用层协议:
http超文本传输协议
Telnet远程登录协议
Ftp文件传输协议
DNS域名协议
smtp邮件协议
wals网络通讯协议
传输层
网络层
数据链路层
物理层




