接口自动化面试
1、json和字典dict的区别?
json本质上还是字符串,只是按key:value这种键值对的格式来的字符串,而字典是{key:value}的一种数据类型
2、测试的数据你放在哪?
1.对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如ini)
2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
3.对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理
5.对于邮箱配置的一些参数,可以用ini配置文件
6.对于全部是独立的接口项目,可以用数据驱动方式,用excel/csv管理测试的接口数据
7.对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到py脚本的开头
3、在手工接口测试或者自动化接口测试过程中,上下游接口有数据依赖如何处理?
用一个全局变量来处理依赖的数据
4、依赖于登录的接口如何处理?
登录接口依赖token的,可以先登录后,token存到一个yaml或者json或者ini的配置文件里面,
后面所有的请求去拿这个数据就可以全局使用了。如果是cookies的参数,可以用session自动关联
5、接口产生的垃圾数据如何清理?
造数据的数据清理,需用python连接数据库,做增删改查操作, 测试用例前置,setUp做数据准备, 后置操作,tearDown做数据清理
6、python如何连接数据库操作?
- 首先导入模块(提前pip安装) import pymysql
- 打开数据库连接 db = pymysql.connect("localhost", "username", "psw", "db_name")
- 创建一个游标对象 cursor = db.cursor()
- sql查询语句 sql = "select * from emp"
- 执行sql语句 cursor.execute(sql)
- 获取所有记录列表 cursor.fetchall() 然后for循环遍历
- 关闭数据库连接 db.close()
7、get和post的区别?
http是上层请求协议,主要定义了服务端和客户端的交互规格,底层都是tcp/ip协议,
Get会把参数附在url之后,用?分割,&连接不同参数,Get获取资源,post会把参数放置在http请求体中,Post发送请求数据,Get产生一个tcp数据包,post产生两个tcp数据包l Get请求,
浏览器会把http header和data一起发送,服务器返回200响应码。Psot请求,浏览器先发送header,服务器响应100(continue),然后再发送data,服务器返回200响应码。
Post的安全性比get高,如果浏览器缓存了,会把get参数留在缓存中,用户可以看到参数信息
8、常见的http状态码分别代表什么?
302:临时重定向到某一个页面,比如要登录之后才能进入的页面,他首先会临时重定向到登录界面
403:权限不够 服务器理解客服端的请求,但拒绝此请求
503:服务端目前无法使用,过载或者维护中
500:服务端异常
404:请求失败,请求所希望得到的资源未被在服务器上发现
401:请求身份验证
9、依赖第三方的接口如何处理?
这个需要自己去搭建一个mock服务、模拟接口返回数据。mock是一个开源的框架,在github上可以下载到。
mock可以用在单元测试过程中,还有一个用途,当前端开发在开发页面的时候,需要服务端提供API接口,此时服务端还没开发完成,或者说没搭建测试环境,这时候前端开发会自己mock一个api服务端,自己给自己提供调用接口的返回数据。
10、 post请求的四种参数形式是什么
application/x-www-form-urlencoded
multipart/form-data
application/json
text/xml
11、 具体的在这个项目中自动化怎么应用到实际的,您对自动化结果的分析
完成所有的自动化测试框架的设计和实现后,进行接口测试,然后集成到jenkins,配置定时执行,生成html报表,查看测试通过率,查看接口的功能。
每次发版时,进行回归测试,新功能开发未提测前
12、cookie与session的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:<br>将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中
13、 JSON的两种结构
对象:用大括号表示,对象由属性组成,属性由键值对组成,键和值对之间用冒号隔开,属性之间用逗号隔开,另外键必须用双引号。如:{"姓名":"姚明","年龄":38},
数组:用中括号表示,如:["小鸡","小鸭","小狗"]
14、requests 库响应消息体四种格式
r.text:文本响应内容
r.content:字节响应内容
r.json():Json解码响应内容
r.raw:原始响应内容
15、 requests发出的请求,fiddler抓不到,怎么办?
proxies = {'http': 'http://127.0.0.1:8888', 'https': 'http://127.0.0.1:8888',}
requests.你的请求方法('你的请求',data=你的payload, proxies=proxies)
16、当一个接口出现异常,你是如何分析异常的?
用fiddler工具抓包或者浏览器上按F12调试。app上就用fiddler设置代理,去看请求报文和返回报文。查看后端日志,xshell连上服务器,查看日志。
17、怎么分析bug是前端的还是后端的?
先抓包看请求报文,对着接口文档,看请求报文有没问题,有问题就是前端发的数据不对。请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题。
18、http接口和web service接口测试区别是什么?
传统web service: 有一套完整的协议标准,其中有soap协议,用来进行消息的传递。
soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式 Content-type设置为:text/xml任何数据都可以xml化。
web service的好处是:不用担心大小写问题,不用担心中文urlencode问题,代码中不用多次申明认证(账号、密码)参数,传递参数可以为数组、对象等
由于web service要进行xml解析,速度可能会有所降低。现在HTTP完全可以替代web service。
19、接口测试用例的编写要点有哪些?
1)必填字段:请求参数必填项、可选项
2)合法性:输入输出合法、非法参数
3)边界:请求参数边界值等
4)容错能力:大容量数据、频繁请求、重复请求(如:订单)、异常网络等的处理
5)响应数据校验:断言、数据提取传递到下一级接口…
6)逻辑校验:如两个请求的接口有严格的先后顺序,需要测试调转顺序的情况
7)性能:对接口模拟并发测试,逐步加压,分析瓶颈点
8)安全性:构造恶意的字符请求,如:SQL注入、XSS、敏感信息、业务逻辑(如:跳过某些关键步骤;未经验证操纵敏感数据)
20、 说说接口测试的流程和接口自动化流程,介绍一下request有哪些内容?
1)流程:获取接口文档,依据文档设计接口参数,获取响应,解析响应,校验结果,判断测试是否通过。
2)request 内容:1,封装了get、post等;
2、以关键字参数的方式,封装了各类请求参数,params、data、headers、token、cookie等;
3,封装了响应内容,status_code、json()、cookies、url等;
21、 postman的使用方式?高级用法?mock的应用场景和基础用法?
A,基础使用:入参出参校验返回;
b,Environment–配置不同的环境参数,Globals即设置全局变量,Pre-request Script–配置使用环境变量或进行前置脚本处理;
c,团队可以更好地并行工作,前后端人员只需要定义好接口文档就可以开始并行工作,互不影响,只在最后的联调阶段往来密切,开启TDD(Test-Driven Development)模式,即测试驱动开发;
22、对pytest的理解程度?使用规范?参数化方法?说说常用装饰器?
pytest是一个非常成熟的全功能的的Python测试框架,主要特点有以下几点:
1,简单灵活,容易上手,文档丰富;
2,支持参数化,可以细粒度地控制要测试的测试用例;
3,能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/ appnium等自动化测试,接口自动化测试(pytest +请求);
4,pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest - selenium(集成selenium),pytest-HTML(完美的HTML测试报告生成),pytest-rerunfailures(失败情况下重复执行),pytest -xdist(多CPU分发)等;<br>5,测试用例的跳跃和xfail处理;<br>使用规范:<br>测试文件名必须以“test_”开头<br>测试类以Test开头,并且不能带有 init 方法<br>测试方法必须以“test_”开头<br>除了有setup/teardown,还能更自由的定义fixture装载测试用例<br>参数化方法:<br>pytest支持在多个完整测试参数化方法:<br>pytest.fixture(): 在fixture级别的function处参数化<br>@pytest.mark.parametrize:允许在function或class级别的参数化,为特定的测试函数或类提供了多个argument/fixture设置。<br>pytest_generate_tests:可以实现自己的自定义动态参数化方案或扩展。<br>
23、举例说明pytest.mark标记的使用?
1,无条件跳过测试pytest.mark.skip
2,有条件跳过测试pytest.mark.skipif
3,标记测试功能按预期失败pytest.mark.xfail
4,将测试功能标记为使用给定的夹具名称pytest.mark.usefixtures
5,向特定测试项添加警告过滤器,以便更好地控制应在测试,类甚至模块级别捕获哪些警告@pytest.mark.filterwarnings
6,自定义标记:标记指定标签
24、自动化测试报告生成方式?如果是allure详述?
@allure.severity(“critical”) # 优先级,包含blocker, critical, normal, minor, trivial 几个不同的等级
@allure.feature(“测试模块_demo1”) # 功能块,feature功能分块时比story大,即同时存在feature和story时,feature为父节点
@allure.story(“测试模块_demo2”) # 功能块,具有相同feature或story的用例将规整到相同模块下,执行时可用于筛选
@allure.issue(“BUG号:123”) # 问题表识,关联标识已有的问题,可为一个url链接地址
@allure.testcase(“用例名:测试字符串相等”) # 用例标识,关联标识用例,可为一个url链接地址<br>