面试题(三)
前言
最近面试过程中对自己的状态不是很满意,很多知识感觉了解那么一点点,但非常不深入,导致别人一问,我的表达连我自己都不信任。可我自己还要装在很平静,及时遇到不会的问题的时候,也要心平气和,说一下自己的理解和看法。现在将这些问题记录一下,顺便重新整理下思路
面试题汇总
先简单做个自我介绍
我叫xxx,毕业于xxx大学,从xx年开始做软件测试,然后分别描述自己前面几份工作的经历即可,不要太长,不要太短,我觉得后面要重点突出一下亮点,比如说在上家公司使用Python+Requests+Excel+ddt+Unittest+Flask完成xx项目的接口自动化,使用Python+Appium+Yaml+Pytest+Allure完成xx项目的APP自动化
请介绍一下你最近的一个项目
感觉我答的不太好,因为在上家做专职的自动化测试,导致我对业务知识停留在浅薄的认知上,所以这一块没有任何亮点
介绍一下接口自动化怎么做的
xx项目是2019年3月份开始的,在项目开始的时候,参加产品的需求评审和开发的技术评审,然后在会议上确定接口和业务状态码的管理方式,接着开始逐步搭建接口自动化的框架。当时考虑到测试用例和测试数据如果耦合在一起的话,后期维护起来不太方便,因此使用Excel单独保存测试数据
Excel中分为两种类型的测试数据,一种是单接口,一种是接口场景,对于单接口,一条测试数据对应着一个用例,对于测试场景,多个测试数据组成的合并单元格对应着一个用例。将这些用例读取出来后,组合成列表里嵌套字典的形式(读取合并单元格比较复杂,不建议说,要不然扯不清楚,但是如果面试官问的话,记住两点,一是通过self.sh.merged_cells将合并单元格的范围读出来,然后使用set.difference和max_row_range求差集,得到的是非合并单元格的范围,最后分别读取两个范围的数据,作为字典存到列表中,这时候使用sorted中的key=lambda case_data:case_data["case_id"][0]排序),作为读取函数的返回值,这时候在测试方法中,调用读取Excel类的读取函数,然后通过ddt.data(*all_case_data)解包,将每个字典传递给请求方法,最终拿到响应结果再做断言
最后定义一个入口函数main,通过实例化TestSuite、TestLoader、HtmlTestRunner,将结果输出到html测试报告
怎么处理接口依赖
(这里最好举个简单的例子),比如查询接口要用到登录接口返回值里的token,需要在Excel中加一列response_context,使用${token}=.*token:(.*?),
这样的形式,并且在查询接口的请求数据中使用${token}做参数化替换。在登录接口发送请求之后,拿到响应结果,判断这条测试数据的response_context的值是否非空,如果非空,则使用split函数将其用=号分隔开来,前面的是key,后面的是正则表达式的pattern,然后使用re.findall去提取响应结果中的值作为value。此时要提前定义一个全局变量,是空字典,接着将key和value存储到字典中。在查询接口请求之前,用key, value遍历字典,通过使用find方法判断请求数据中有没有字典中的key,如果有的话,使用字典的value来替换请求数据中的key
还有一种方法,使用Python中的反射动态的为反射类添加属性,比如同样的在Excel中加一列response_context,使用token=.*token:(.*?),
这样的形式,并且在查询接口的请求数据中使用${token}做参数化替换。在登录接口发送请求之后,拿到响应结果,判断这条测试数据的response_context的值是否非空,如果非空,则使用split函数将其用=号分隔开来,前面的是key,后面的是正则表达式的pattern,然后使用re.findall去提取响应结果中的值作为value。引入反射类Context后,通过setattr(Context, key, value)来动态生成反射类的属性。在查询接口请求之前,如果请求数据中包含"${token}",则使用eval("Context.token")将${token}替换掉
接口自动化中怎么切换不同的环境
一种方法比较粗暴,就是在配置文件里直接改,改成啥就是啥
[host_test]
test_host=http://localhost:8099
sql_host=http://localhost:5000
另一种方法可以定义一个env.py的配置文件,里面根据envFlag来做判断
envFlag = "test"
if envFlag == "test":
host = "http://test_host:8099"
elif envFlag == "develop":
host = "http://develop_host:8099"
测试用例类只需要引入即可from conf.env import *
,然后在里面直接使用host
介绍一下TCP协议
按层次分,TCP位于传输层,提供可靠的字节流服务
所谓的字节流服务是指,为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理。而可靠的传输服务是指,能够把数据准确可靠地传给对方。一言以蔽之,TCP协议为了更容易传送大数据才把数据分割,而且TCP协议能够确认数据最终是否送到对方
为了准确无误地将数据送达目标处,TCP协议采用了三次握手策略。用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对象确认是否成功送达。握手过程中使用了TCP的标志——SYN和ACK
发送端首先发送一个带SYN标志的数据包给对象。接收端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息。最后,发送端再回传一个带有ACK标志的数据包,代表"握手"结束
若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包
网络延迟导致丢包还是丢包导致网络延迟
相互影响
用户浏览器访问一个网页背后的步骤
使用DNS协议进行域名解析-->建立TCP协议三次握手过程-->客户端发出访问网站相应页面请求(发出HTTP协议请求报文)-->服务端发出相应访问页面的请求信息(发出HTTP)-->断开TCP协议四次挥手过程
详细的情况请见:https://www.cnblogs.com/root0/articles/8682658.html
什么是json
json是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。它的优点是便于阅读和编写,便于程序解析