2022年7月6日面试题
1|0ssh分布式自动化测试框架是怎么做的?
详情见《使用pytest-xdist实现分布式APP自动化测试:基于SSH》
2|0接口自动化测试框架介绍
x项目上线周期较短,任务较重,从立项到上线只有半年的时间,因此希望能够提前介入到接口测试,尽早发现项目底层的一些bug,保障功能测试能够平稳进行,以及做好迭代阶段的回归测试,因此公司安排我做项目的接口自动化测试
1、为了便于代码的可维护性,采用数据和用例分离的设计思想。数据存储在excel中,通过openpyxl读取数据,封装成一个字典列表的形式,列表中的每一个字典都对应着一条case,通过ddt.data进行拆包,将每个元素分别传给封装好的request方法去做请求,拿到响应之后,将结果提取出来和期望结果做断言,最后通过unittest,先生成一个TestSuite对象,然后生成一个TestLoader对象,通过TestLoader对象的discover方法发现测试用例,将最终发现的测试用例通过TestSuite对象的addTests方法放在测试套件下,再过runner对象的run方法运行测试套件对象
2、对于参数替换,在excel中使用${}标记随机数的变量,使用{{}}标记关联接口的变量,在公共目录下定义随机数类存放生成随机数的方法,定义Context类作为反射类,同时还会定义一个变量替换方法,这个方法通过判断是excel数据否包含${}或者{{}}来决定如何替换,如果数据是${}的形式,则通过eval(随机数方法)来替换,如果数据是{{}}这样的形式,则会通过eval(反射类.属性值)来替换。在测试用例类中,发送请求之前,先会调用变量替换方法,将请求数据中需要替换的数据做个替换,然后通过封装好的requests方法来做接口请求,拿到响应结果后,先判断excel数据中是否有response_extract字段,如果有就通过分割字符串的方法,将{{key}}=$..jsonpath表达式,分割开来,=前面的是key,=后面的是value,再通过反射方法将key和value赋予Context类的类属性和属性值。
对于接口里数据库的断言,通过flask将数据库的查询语句封装成接口,然后和业务接口放在一起,最终将数据库的查询结果取出来再去和业务接口的响应结果做断言
3、此外,还可以介绍一下日志、发送邮件、环境配置以及jenkins持续集成
3|0接口自动化断言都是断言哪些内容
code、关键字段、还有数据库
4|0面向对象三大特征是什么
面向对象三个基本特性
面向对象思想有三个基本特性:封装性、继承性和多态性。
封装性
面向对象的封装使外部访问者不能随意存取对象的内部数据,隐藏了对象的内部细节,只保留有限的对外接口。外部访问者不需要关心对象的内部细节,操作对象变得简单。
继承性
举例,轮船与客船的关系,客船具有轮船的全部特征和行为。
在面向对象中,轮船是一般类,客船是特殊类,特殊类拥有一般类的全部数据和操作,称为特殊类继承一般类。一般类称为“父类”或“超类”,特殊类称为“子类”或“派生类”。
多态性
多态性是指在父类中成员被子类继承之后,可以具有不同的状态或表现行为
5|0一个province表,一个city表,city.pid = province.id,求出广东省的城市数量
select count(*) from province left join city on city.pid = province.id where city.name = '广东省';
6|0linux常用命令
cd、ls、top、mkdir、ps -f、tail -f、mv、chmod、vim、uptime等
7|0python中的重写和重载
override就是重写,不改变函数的输入和输出,重写函数的代码块功能
overload就是重载,改变函数的输入和输出。即同一个方法名可以支持多种类型的参数输入
8|0性能指标有哪些
-
并发
指同一个时间点执行相同的操作(秒杀) -
并发用户数(重要指标)
同一时间点,执行相同请求的用户数
系统用户数、在线用户数(系统用户数、在线用户数和性能没关系)、线程数(模拟出成千上万的人员,虚拟用户数,线程数,与开发的线程不同)
- 事务(Transaction)
指一个客户机向服务器发送请求然后服务器做出反应的过程
注意:这里的线程数指的是虚拟用户数,与开发的线程不太一样
jmeter里通常理解为:一个接口从发起请求到响应称为一个事务,LR中多个接口的请求到响应可以看做一个事务,多个接口写在一个事务包里
- 响应时间(RT)(重要指标)
从发起请求到收到响应的时间。发起请求网络传输时间 + 服务器处理时间 + 返回响应网络传输时间
- TPS\QPS(最主要指标)
TPS(Transactions per Second):服务器每秒处理事务数,衡量服务器处理能力的最主要指标
QPS(Queries per Second):每秒查询数
差异:一个Transactions 可能有多个Queries,比如访问网页
注意:TPS高,说明代码复杂度低,CPU好,内存消耗低,数据库运算能力快
一个事务可能包括多个查询,因此可能QPS大一些,TPS小一些,比如百度一下,有可能调用多个查询接口
RT:想要真正的服务器处理时间,因此实际做测试时尽量不要使用堡垒机、跳转机
- 吞吐量(Throughput)
单位时间内处理的请求数量(事务/s)
如:港口吞吐量,1年5千万标准集装箱
- 吞吐率
单位时间内通过的数据的平均速率(kb/s)
如:港口日吞吐率,年吞吐量/365天
- 点击数(Hit per Second)
每秒点击数
- 资源利用率
指系统资源的使用程度,比如服务器(网络以及数据库)的CPU利用率,内存利用率,磁盘利用率,网络带宽利用率等
CPU利用率
内存利用率
磁盘I/O
一般都不要超过80%
9|0TPS和QPS的区别
TPS:(Transactions Per Second),即每秒执行的事务总数。
首先一个事务包括三个动作,即客户端请求服务端,服务端内部进行处理,服务端对客户端进行响应。
将这三个动作看成一个整体,并将之称为一个事务,若在一秒内,服务端可以完成N个事务,则这个服务端的TPS为N。
一般来说,评价系统的性能主要看系统的TPS,系统的整体性能取决于性能最低模块的TPS值。
(木桶的容量取决于最短板,当然你不能把木桶斜着放,斜着放虽然能够改变木桶容量的依赖,此时依赖变为最长板,但会产生额外的消耗,比如需要一直扶住木板,或者产生木桶歪倒的风险)
QPS:(Queries Per Second),及每秒执行的查询总数(每秒有多少的请求响应)
客户端请求一个地址时,比如百度首页,其实会产生很多的请求,比如js、css、png等,像这样的每个单个请求都可以算作查询次数。
若在一秒内,客户端请求服务端的首页,服务端返回了N个内部链接(js、css、png、html等),那么服务端的QPS就为N。
QPS反映系统的吞吐能力,更偏向于读取文件,查询数据
10|0算法:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
解答:
11|0linux的解压缩命令
如果是.gz格式的:
压缩:gzip test.txt
解压缩:gunzip test.txt.gz
如果是.tar.gz格式的:
压缩:tar -zcvf text.tar.gz test.txt
解压缩:tar -zxvf test.tar.gz
如果是.zip格式的:
压缩:zip test.txt.zip test.txt
解压缩:unzip test.txt
12|0常用的http请求类型
1、GET方法
用于使用给定的URI从给定服务器中检索信息,即从指定资源中请求数据。使用GET方法的请求应该只是检索数据,并且不应对数据产生其他影响。
在GET请求的URL中发送查询字符串(名称/值对),需要这样写:/test/demo_form.php?name1=value1&name2=value2
说明:GET请求是可以缓存的,我们可以从浏览器历史记录中查找到GET请求,还可以把它收藏到书签中;且GET请求有长度限制,仅用于请求数据(不修改)。
注:因GET请求的不安全性,在处理敏感数据时,绝不可以使用GET请求。
2、HEAD方法
与GET方法相同,但没有响应体,仅传输状态行和标题部分。这对于恢复相应头部编写的元数据非常有用,而无需传输整个内容。
3、POST方法
用于将数据发送到服务器以创建或更新资源,它要求服务器确认请求中包含的内容作为由URI区分的Web资源的另一个下属。
POST请求永远不会被缓存,且对数据长度没有限制;我们无法从浏览器历史记录中查找到POST请求。
4、PUT方法
用于将数据发送到服务器以创建或更新资源,它可以用上传的内容替换目标资源中的所有当前内容。
它会将包含的元素放在所提供的URI下,如果URI指示的是当前资源,则会被改变。如果URI未指示当前资源,则服务器可以使用该URI创建资源。
5、DELETE方法
用来删除指定的资源,它会删除URI给出的目标资源的所有当前内容。
6、CONNECT方法
用来建立到给定URI标识的服务器的隧道;它通过简单的TCP/IP隧道更改请求连接,通常实使用解码的HTTP代理来进行SSL编码的通信(HTTPS)。
7、OPTIONS方法
用来描述了目标资源的通信选项,会返回服务器支持预定义URL的HTTP策略。
8、TRACE方法
用于沿着目标资源的路径执行消息环回测试;它回应收到的请求,以便客户可以看到中间服务器进行了哪些(假设任何)进度或增量。
以上介绍了HTTP的8种请求方式,其中常用的是GET和POST。可以说,GET是从服务器上获取数据,POST是向服务器传送数据,至于选择哪种,就需要根据实际情况来选择了。
13|0get和post请求的区别
get和post的区别主要有以下几方面:
1、url可见性:
get,参数url可见
post,url参数不可见
2、数据传输上:
get,通过拼接url进行传递参数
post,通过body体传输参数
3、缓存性:
get请求是可以缓存的
post请求不可以缓存
4、后退页面的反应
get请求页面后退时,不产生影响
post请求页面后退时,会重新提交请求
5、传输数据的大小
get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)
post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大
6、安全性
这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的,防君子不防小人就是这个道理。对传递的参数进行加密,其实都一样。
7、数据包
GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
14|0python连接数据库的方法
看这一篇:https://www.cnblogs.com/my_captain/p/9294420.html
__EOF__

本文链接:https://www.cnblogs.com/my_captain/p/16451914.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?