测试工程师多年面试问题整理

一、sql相关
1.mysql存储过程与普通的sql语句区别
存储过程就是多条sql语句的集合,由于它是在数据库端得sql语句,所有执行起来很快

2.sql的常用语句:
1.新增: insert into 表名 values(值1, 值2...)
2.修改:update 表名 set 字段名 = 新值 where 字段名 = 旧值
3.删除:delet from 表名 where 字段名 = 值       删表:drop     清空表中数据:truncate
4.排序:select 字段1,字段2 from 表名 order by 字段1  《asc升序;desc降序》
5.规定返回数目:select * from 表名 limit 数量
6.去重:select distinct * from table(表名) where (条件)
7.联表查询:selec * from a,b (as A) left join c,d (as B) on A.a(主键)=B.c(主键)      左连接(以左表为主)、右连接(以右表为主)、内连接(两表重合部分)、外连接(两表加上重合部分)
8.where和having的区别:where是一个约束声明,使用where来约束来自数据库的数据,where是在结果返回之前起作用的,where中不能使用聚合函数;having是一个过滤声明,在查询返回结果集以后,对查询结果进行的过滤操作,在having中可以使用聚合函数。where和having的执行顺序:where 早于 group by 早于 having。
9.聚合函数和group by:聚合函数就是例如SUM, COUNT, MAX, AVG等;对一组(多条)数据操作的函数,需要配合group by 来使用。(select sum from 表名 group by XX )

3.索引
因为索引是一种优化查询的数据结构,比如MySQL中的索引是B+树实现的,而B+树就是一种数据结构,可以优化查询速度,可以利用索引快速查找数据,所以能优化查询。常见数据结构有哈希表、完全平衡二叉搜索树、B树、B+树等等

4.深拷贝与浅拷贝的区别
假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力

=============================
二、压测相关
1.Linux系统命令:
启动:nohup java -jar 包名(.jar)&(获取编号)
查看:ps -ef| grep 包名      
终止:kill -9 进程号   
运行jmeter脚本:jmeter -n -t jmeter文件存放地址 -l hz002(缓存地址每次换一下名字) -e -o 压测报告存放地址    
查看进程占用系统资源:top
查看网络流量:nload
查看磁盘IO:iostat -d -x -k 1
查看磁盘已占用资源大小:df
统计日志相关纪录数;iftop
查看日志:tail -n 10 test.log(查看最后10行日志)/head -n 10 test.log(查看前10行日志)/cat -n test.log|grep "关键字"(查询关键字日志)/cat test.log|grep "关键字" -A 10(-A:关键字前/-B:关键字后/-C:关键字前后)
查看CPU占用进程:ps -ef(查看所有进程)
显示当前工作目录:pwd
列出目录:ls -a(列出所有文件)/-d(列出目录)/-i(列出每个文件索引号)/-l(较长格式列出)
删除文件或目录:rm  / rmdir(删除空目录)
创建目录:mkdir
解压缩文件:tar
拷贝文件: cp
比较文件差异: diff  -r(递归比较)文件1 文件2 


2.压力测试报告中查看数据:请求数、平均响应时间(包含最大、最小、90%、95%、99%)、吞吐量、上行数据量、下行数据量、报错百分比(通常为0)
QPS:每秒的响应请求数/最大吞吐能力      QPS(TPS)=并发数/平均响应时间
TPS:每秒处理事务数
PV:页面访问量
UV:独立访客
DAU:日活跃用户数量/MAU:月活跃用户数据
查看图表:响应时间、每秒请求数、每秒吞吐量、应用CPU占用率、数据库CPU占用率

=========================
三、接口相关
1.接口要点
(1)接口类型:http、rpc(web service、dubble)
(2)请求方式:get(查)、post(增)、put(改)、delete(http)
(3)http和https的区别:HTTP 是未经安全加密的协议,它的传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造;而 HTTPS 是安全的协议,它通过 密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法 能够解决上面这些问题。
(4)http请求体类型:text/html: HTML格式;text/plain:纯文本格式;image/jpeg:jpg图片格式;application/json: JSON数据格式
(5)post和get的区别
1、传送方式:get通过地址栏传输,post通过报文传输。
2、传送长度:get参数有长度限制(受限于url长度),而post无限制
3、GET产生一个TCP数据包;POST产生两个TCP数据包

2.完整的http请求
域名解析
发起TCP3次握手
建立TCP连接后发起http请求
服务器响应请求,返回结果
浏览器得到html标签代码
浏览器解析html代码中的资源,例如js,css,img等
浏览器对页面进行渲染并呈现给用户

3.cookie 和session的区别
cookie数据保存在客户端浏览器,session数据保存在服务器端;cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session ;session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使COOKIE;单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K;所以将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中。


4.WebService接口是如何测试的:webService接口用SoapUI
模拟弱网测试:fiddler和charles都可以模拟弱网测试,平常说的模拟丢包,也是模拟弱网测试

5.BeanShell的内置变量和语法规则
1)log打印日志
用法:log.info<打印所有日志>/log.error<打印错误日志>
System.out.prinbtIn<这是在JAVA控制台打印>

2)vars标识JmeterVariables,操作Jmeter变量(用户定义变量、正则表达式、JSON提取器、定义变量),只可用于当前线程组。
获取变量值:log.info(vars.get("mashang"));/log.info(vars.get("access_token"));/vars.put("www","yyy");<设置变量,可相互取用>

3)props用于获取jmeter的全局静态变量(可跨线程组)
用法:log.info(props.get("jmeter.save.saveservice.output_format"));/props.put("xxx","yyy");

4)prov获取到前面一个取样器返回的信息
用法:log.info(prev.getResponseCode());<获取响应码>/log.info(prev.getResponseDataAsString());<获取响应date>

5)ctx上下文
用法:System.out.println(ctx.getProperties());<获取上下文所有的变量>


=======================
四、java与python
1.java
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等

2.Python和java区别
python是全动态性的,可以在运行时自己修改自己的代码,java只能通过变通方法实现;python虚拟机没有java强,java虚拟机是java的核心;python有很多程序用的是面向过程设计方法,很多概念是从c语言过来的,而java是为了实现没有指针的c++,主要采用面向对象的设计方法等

3.python列表和元祖的区别
列表是动态数组,它们可变且可以重设长度(改变其内部元素的个数);元组是静态数组,它们不可变,且其内部数据一旦创建便无法改变。元组缓存于Python运行时环境,这意味着我们每次使用元组时无须访问内核去分配内存。

4.python的内置模块
sys模块:系统文件模块
time模块:包含各种提供日期、时间功能的类和函数
datetime模块:时间处理模块
random模块:随机
OS模块:系统操作
json某块:数据结构转化
re模块:正则匹配
loggin模块:日志处理
requests模块:接口访问
unittest模块:单元测试
hashlib模块:字符加密功能模块
hmac模块:密钥相关的哈希运算消息认证码

===========================
五、安全测试
1.API接口的安全性流程:
1、客户端通过用户名密码登录服务器并获取Token
2、客户端生成时间戳timestamp,并将timestamp作为其中一个参数
3、客户端将所有的参数,包括Token和timestamp按照自己的算法进行排序加密得到签名sign
4、将token、timestamp和sign作为请求时必须携带的参数加在每个请求的URL后边(http://url/request?token=123×tamp=123&sign=123123123)
5、服务端写一个过滤器对token、timestamp和sign进行验证,只有三个参数都正确且在规定时间内,本次请求才有效

2.加密方法:
1,对称加密:AES,3DES,DES等,适合做大量数据或数据文件的加解密。
2,非对称加密:如RSA,Rabin。公钥加密,私钥解密。对大数据量进行加解密时性能较低。

3.加密算法:对称加密、非对称加密、哈希算法、数字签名

4. HTTP 传输面临的风险有:
1) 窃听风险:黑客可以获知通信内容。
2) 篡改风险:黑客可以修改通信内容。
3) 冒充风险:黑客可以冒充他人身份参与通信。

5.HTTPS 缺点:
1)SSL 证书费用很高,以及其在服务器上的部署、更新维护非常繁琐
2)HTTPS 降低用户访问速度(多次握手)
3)网站改用HTTPS 以后,由HTTP 跳转到 HTTPS 的方式增加了用户访问耗时(多数网站采用302跳转)
4)HTTPS 涉及到的安全算法会消耗 CPU 资源,需要增加大量机器(https访问过程需要加解密)

6.安全测试方法
1)web安全测试:登录安全性验证、口令要求、用户权限、敏感数据加密与数据存储安全性的验证、cookies 和 Session 的有效期验证等多种机制的验证、验证系统的日志文件是否得到保护、sql注入
2)认证测试:登录验证码、密码的一次性、校验码的随机性
3)会话管理测试:用户登录后,身份信息不再由客户端提交,而不是以服务器会话信息中保存的身份信息为准;URL中不能携带SessionID信息;登陆后的页面有明确的“退出”或“注销”按钮,注销时会话信息要清除
4)权限管理测试:横向和纵向越权
文件和目录测试:禁止获取敏感目录或者文件信息、所有对目录的访问均不能打印处文件列表、禁止访问和下载文档的备份、不能越权获取到不该获取的文件

===========================
六、自动化测试
1.selenim测试框架分层设计:
框架层:配置文件、日志、页面元素数据、测试数据等
用例层:测试用例集和测试用例
业务层:单页面方法包、多页面方法包
基础层:page包、基础封装包、查找封装包、操作封装包

2.selenium工具构成:selenium IDE、selenium RC、selenim Webdirver、 selenium Grid、FireBug(辅助工具)、FirePath(辅助工具)

3.基本的接口功能自动化测试流程为:需求分析–>用例设计–>脚本开发–>测试执行–>结果分析

4.自动化测试校验结果:断言 ,预期结果与实际结果对比;数据库校验,根据测试场景来查询数据库里的数据和请求之前的数据进行比对。

5.自动化测试定位和识别元素:谷歌浏览器开发者工具打开之后,用鼠标选中元素去识别元素信息。元素定位使用定位 api,可以根据 id/name/classname/tagname/link_text/xpath/css

6.元素无法识别原因:页面加载元素过慢,加等待时间。页面可能会有 frame 层,需要进行跳转。可能该元素是动态元素,识别方式需要优化。
可能识别了元素,但是不能操作,先把前置的操作完成。

7.元素定位方法:熟悉定位方式有:id、name、classname、link_text、xpath、css。常用 xpath 来进行定位,xpath 算是万能的,但缺点就是定位速度相比其他方式要慢。

8.遇到frame层如何处理:使用 api 函数跳转进去 frame,frame 中页面操作完成,再跳转出来。

9.pytest中函数装饰器@pytest.fixture() :如果测试函数的参数列表中包含了fixture这个名字,在执行pytest的时候,会先检测到,并且在运行测试函数之前先执行fixture,fixture会将数据返回给测试函数。fixture函数中包含了yield关键字,那么pytest会在yield处停止,转而运行测试函数,等测试函数执行完毕后再回到fixture,继续执行yield后面的代码。

============================
七、压测
1.状态码命令
100 继续发送请求   200  请求成功  202 接受请求未处理   204 处理请求未返回实体内容  301 永久移动新位置   404  请求失败   500 服务器未知错误  503  服务器过载或维护

2.接口测试中依赖登录状态的接口如何测试?
依赖登最状态的接口,本质上是在每次发送请求时需要带上存储有账户有效信息的Session或Cookie才能发送成功,在构建POST请求时添加必要的Session或Cookie

3.依赖于第三方数据的接口如何进行测试?
可以利用一些MOCK工具(如:JSON Server、Easy Mock)来模拟第三方的数据返回,最大限度的降低对第三方数据接口的依赖

4.如何从上一个接口获取相关的响应数据传递到下一个接口?
先从上一个接口中的响应数据获取对应的返回值,然后使用正则表达式or使用JSON解析来提取需要获取的值,然后存储在一个变量中,最后在下一个接口中直接引用该变量即可

5.当一个接口出现异常时,你是如何分析异常的:抓包,用fiddler工具抓包,或者浏览器上f12,app上的话,那就用fiddler设置代理,去看请求报文和返回报文了;查看后端日志,xhell连上服务器,查看日志

6.jmeter常用组件:测试计划、线程组、取样器、逻辑控制器、前置处理器、后置处理器、断言、定时器、配置元件、监听器
顺序:测试计划》线程组》配置元件》前置处理器》定时器》取样器》后置处理器》断言》监听器

7.全链路压测平台压测流程:链路整理》探针接入》探针探活》业务活动创建》脚本上传》压测场景配置》开启压测》生成报告

8.探针安装
1)虚拟机探针安装:进入opt目录》下载并解压探针包》删除压缩包》进入config目录查看文件agent.properties(确认url、压测机ip和端口)》进入scan目录改造启动文件并保存》查看进程并启动探针
2)git中选择分支》找到run.sh》放入启动文件并保存》风火轮编译并打包》进入rancher进行更新部署》项目更新完成查看日志(会显示探针包安装完成字样)

========================
八、python基础
1.字符反转 :print(“字符”[::-1])
2.删除list中发重复元素:print(list(set([列表])))
3.A、B中相同元素:print(set(A)&set(B));A、B不同元素:print(set(A)^set(B))
4.python内置的数据结构:整型 int、长整型 long、浮点型 float、复数 complex b、字符串 str、列表 list、元祖 tuple、字典 dict、集合 set
5.实现1-100之和:print(sum(range(0,101)))
6.可变类型有list、dict;不可变类型有string、number、tuple
7.is:比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象。是否指向同一个内存地址。
  ==:比较的两个对象的内容/值是否相等,默认会调用对象的eq()方法
8.生成公差为11的等差数列: print ([x*11 for x in range(10)])
9.列出列表中所有奇数: print([i for i in 列表 if i%2==1])
10. 计算1+2+3+4的总和:print(sum[1,2,3,4])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340