您的位置:首页 > 编程语言 > Python开发

关于python接口自动化的相关知识点整理(持续更新)

2020-07-14 04:53 274 查看

1,json和字典的区别

Json是轻量级的数据交互格式,以key-value的键值对形式来保存数据,结构清晰,可以说是目前互联网项目开发中最常用的一种数据交互格式。
字典,同样是以key-value的键值对来保存数据,是python中的一种数据类型。

首先python里面的基础数据类型有:int、str、 float、list、bool、tuple、dict、set这几种类型,里面没json这种数据类型。

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
由于你的代码是python写的(也有可能是php,java,c,ruby等语言),但是后端接口是java写的(也有可能是其它语言),不同的语言数据类型是不一样的(就好比中国的语言和美国的语言数据类型也不一样,中国的一般说一只羊,一头牛,美国都是 a /an这种单位),所以就导致你提交的数据,别的开发语言无法识别,这就需要规范传输的数据(传输的数据都是一个字符串),大家都遵循一个规范,按一个标准的格式去传输,于是就有就json这种国际化规范的数据类型。

json本质上还是字符串,只是按key:value这种键值对的格式来的字符串

2.接口自动化的测试数据存放

测试数据存放总结:
1.对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如ini)
2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
3.对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理
5.对于邮箱配置的一些参数,可以用ini配置文件
6.对于全部是独立的接口项目,可以用数据驱动方式,用excel/csv管理测试的接口数据
7.对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到py脚本的开头,十年八年都不会变更的

3.什么是数据驱动

1.数据驱动就是通过excel,或者xml,数据库等数据结构来维护测试数据,通过相应的技术去处理,拿到测试数据用于测试,从而实现测试数据与代码的解耦,数据驱动测试的本质是高级的参数化。
2.python里面用unittest框架
3.unittest框架还有一个paramunittest也可以实现
4.如果用的是pytest框架,也能实现参数化
5.pytest里面还有一个更加强大的功能,获得多个参数化参数的所有组合,可以堆叠参数化装饰器

4.excel中如何设计你的用例?

1.所有的接口信息维护在一个表单
2.关于接口的用例数据维护在一个表单
3.接口传参一列来传,通过构造json格式的字符串即可解决传多个参数的问题,同时提升了用例的可维护性

05excel中的数据怎么拿出来?

通过第三方库openpyxl来完成,项目只需要引入openpyxl库,通过它提供的api即可完成对于excel的操作,甚至于我们自己也可以做一些二次封装,使得操作更方便。一行数据就是一个用例。

06如果有些接口做了鉴权(需要鉴定权限),怎么实现这些接口的自动化测试?

首先需要明确接口是通过什么机制来实现的鉴权

1.如果是通过会话id(JSESSIONID)来实现鉴权的,那么先调用完登录接口–》拿到它返回的这个数据–》存储起来–》后面再调用其他接口的时候直接带上这个数据过去就可以了。
2.如果是通过token来实现鉴权的,那么同样只需要在调用完登录接口–》拿到它返回的这个数据–》存储起来,后面操作同上。

先回答上面的一个基本实现步骤,然后再补充以下一些实现细节:

a
怎么取到这个JSESSIONID或者token

这个信息怎么取首先得明白它是怎么返回来的,可能为以下两种方式:
1.登录接口的响应头
2.登录接口的响应报文
需要找开发确认,不同方式不同取法。

b
怎么存储这个JSESSIONID或者token

1.文件中(excel、properties文件都可以)
2.数据库
3.代码里面自己定义的公共静态变量,作为一个共享的数据

c
请求其他需要鉴权的接口时,怎么带过去这个数据

先找开发人员确认,再调用需要鉴权的这些接口怎么携带这个鉴权的信息(票)。一般不外乎这么几种:

1.拼接在url上传过去用于服务器验证
2.设置到请求体中
3.通过请求头带过去

弄明白怎么传过去以后,就设法从保存了这个鉴权信息的地方取出来–》传过去

07什么是会话?

所谓会话就是session,而session是一种服务器的缓存技术,由服务器端创建,用户登录了系统,一般就会把登录用户的信息保存到这个session对象中,然后把此会话对应的id(JSESSIONID)返回,因此大部分系统都会用到session机制来实现鉴权。Session保存数据方式也是以key-value的形式。

08什么是token?

所谓token其实就是服务器端返回的一个字符串(有点类似于:xys73494954sdhcdr83435这么一串),这个数据是基于什么算法生成的需要找开发确认,一般这个数据是唯一的,服务器每次返回的token都会不一样。Token之所以可以用来做鉴权,原理如下:

用户a调用了登录接口–》登录了系统b–》服务器端生成了一个唯一的token信息(假设为c),然后会拿用户的编号id(假设为d)做了一个映射:c-d,然后将这样的映射关系存到数据库或redis等缓存中,然后再返回这个token给客户端–》客户端再调用其他需要鉴权的接口时,只需要将缓存起来的这个token带过去验证–》服务器根据此token检查是否有登录用户信息来判断此请求是否是一个已登录授权的用户。(这里客户端怎么取到这个token,怎么存,再次请求时怎么带过去,上面接口鉴权部分已解释)。

09某个接口请求,参数依赖上个接口的返回数据,怎么处理(接口关联)?

不同的接口封装成不同的函数或方法,需要的数据return出来,用一个中间变量a去接受,后面的接口传a就可以了

01
处理方案
a接口调用完–》从响应中取出b依赖的这个参数–》保存起来–》b调用的时候,取出这个信息–》当做参数传过去即可。

02
保存方案
参考问题5中的数据保存方式

10接口调用依赖第三方的接口b,而b接口还未提供给你,如何处理


通过mock框架搭建自己的mock系统/平台(其实就是自己开发接口),模拟这个第三方接口mock一个出来即可,这样就解决了这个依赖。

11接口测试的垃圾数据如何清理?

造数据和数据清理,需用python连数据库了,做增删改查的操作
测试用例前置操作,setUp做数据准备
后置操作,tearDown做数据清理

可以自己准备单独的环境(独立的数据库),这样接口调用产生的数据可以在整个套件执行完后(@AfterSuite)通过执行sql脚本来完成数据删除。

12你做接口自动化,项目用的是什么数据库,用什么来操作的这个数据库

Mysql,可以通过jdbc来实现数据库的增删查改等操作。

13你做接口自动化时怎么做的数据验证

数据验证主要包括两个方面:

01
接口响应报文的验证
利用jsonpath取出响应数据(大多数情况是json)中的关键字段的值,通过Assert断言这些关键字段的值是否符合预期。预期值和jsonpath取值表达式可以配置在excel中。

02
数据库表数据的验证
做表数据验证要先明白两点:
a. 表数据验证首先得明白这个接口的基本业务,会影响到哪些表,哪些字段的数据,然后才能准备查询sql去有针对性的查数据。
b. 并不是所有用例的执行都会操作数据库,影响到表数据,因此只有影响到了表数据的用例,才准备查询脚本。

03
具体做法
Excel用例准备aa,bb,cc三列,aa传脚本,bb,cc两列分别用来回写用例执行前的sql查询结果和用例执行后的sql查询结果,两个数据对比即可知道数据变化是否满足预期。

14如何提升测试套件的执行效率

1.减少excel读写,减少不必要的io操作

2.excel数据读取测试数据,全部存储到静态变量中)。

3.excel数据回写,尽量通过批量方式去写。

15你用过单元测试框架吗,是什么框架,有哪些常用操作?

用过,unittest,pytest,这些测试框架都支持我们去定义测试套件,达到管理我们测试用例代码的作用,同时这些测试框架提供的一些丰富注解不仅能很方便的控制测试用例的执行顺序来控制整个测试流程,还能为各种测试场景的实现提供支撑。

常用操作
seutp,teardown,适合单个测试用例的初始化、环境清理。 seutpClass,teardownClass:适合测试类的全局初始化、环境清理。
assertXXXX: 各种断言方式
testLoader的discover: 用来发现测试用例
testSuite的addTests: 用来装载测试用例
@ddt 数据驱动
htmlTestRunner:用来生成html测试报告

16说说你对接口的理解

接口是服务,是功能点实现,是数据传递的通道,也是服务器端的一个实现了某种协议(比如http协议…)和映射机制(当访问一个url时就会通过服务器端的映射处理机制解析后,落到对应的处理函数)的函数,接口参数就是函数的参数,接口的响应数据就是函数的返回值。

17做过接口测试吗,有哪些熟悉的工具。

做过(即时你之前没有用过可视化工具做过接口测试,但你现在学了接口自动化测试就算有经验了)。

熟悉的工具

可视化工具比如:jmeter,postman,soapui等(用过哪些说哪些)
代码:requests发包技术来实现接口测试。

18接口常见的请求方法有哪些?

GET、POST、PUT、DELETE等

19请简单说一说get、post这两种请求方法的区别?

Get

a. 一般对于从服务器取数据的请求可以设置为get方式
b. Get方式在传递参数的时候,一般都会把参数直接拼接在url上(例如:http://xxx?id=1&type=2)
c. Get请求方法可以传递的参数数据量是有限的(因为一般参数是拼接在url上,而浏览器对于url的长度是有限制的)
d. Get请求因为是直接将数据拼接在url上,所以安全性不如post强(相对),但是get的执行效率要快于post

Post

a. 一般往服务器提交数据的请求会设置为post方式
b. Post方式传递参数一般都会把参数放在请求体,而不会拼接在url
c. Post请求方法可以提交的数据量不受限制
d. Post请求传参相对于get要安全(相对不是绝对),但是post的执行效率不如get。

20在浏览器中输入URL,回车之后发生了什么?

1.URL 解析
2.DNS 查询
3.TCP 连接
4.处理请求
5.接受响应
6.渲染页面

21将列表a = [“h”,“e”,“l”,“l”,“o”]拼接成字符串,请用多种方法实现

a = [“h”,“e”,“l”,“l”,“o”]
方式一 字符串函数调用
print("".join(a))
#方式二 for循环
s = “”
for item in a:
s += item
print(s)

22存在一个名称为data.log的文件

data.log中的内容是以逗号作为分隔符的,依次存储了一次测试的TestID,TestTime,Success(0成功;1失败)。文件 中数据均为非负整数。请写一段程序(不限语言),对所有成功(Success=0)的测试,输出:

1.打印最大、最小TestTime;
2.打印平均TestTime,保留小数点2位数。

data.log的内容格式如下:
TestID,TestTime,Success

0,149,0

1,69,0

2,45,0

3,18,1

4,18,1

“”"
打开data.log文件 。除了第一行,剩下的第一行都是数据。
只需要按行解析数据,将success对应的值为0的提取出来,将TestTime放在一个新的列表当中。
取这个列表当中,最大的值,和最小的值。
同时,对这个列表的所有数据进行取平均值即可。
“”"
import os

def anaysis_data():
test_times = []
# 打开data.log文件
with open(os.getcwd() + “/data.log”) as fs:
for line in fs.readlines(): # 按行读取
temp = line.strip("\n").split(",") # 去掉换行符之后,再按,分割
print(“temp”,temp)
if temp[-1] == str(0): # 筛选success字段为0的TestTime
test_times.append(int(temp[-2]))

if len(test_times) > 0:
avg_time = sum(test_times) / len(test_times) # 平均值
max_time = max(test_times)
min_time = min(test_times)
print("最大的TestTime: ",max_time,",最小的TestTime: ",min_time,",平均TestTime: ",avg_time)

if name == ‘main’:
anaysis_data()
“”"
输出结果为:
temp [‘TestID’, ‘TestTime’, ‘Success’]
temp [‘0’, ‘149’, ‘0’]
temp [‘1’, ‘69’, ‘0’]
temp [‘2’, ‘45’, ‘0’]
temp [‘3’, ‘18’, ‘1’]
temp [‘4’, ‘18’, ‘1’]
最大的TestTime: 149 ,最小的TestTime: 45 ,平均TestTime: 87.66666666666667
“”"

24依赖于登录的接口如何处理

登录接口依赖token的,可以先登录后,token存到一个yaml或者json,或者ini的配置文件里面,后面所有的请求去拿这个数据就可以全局使用了
参考之前分享的一篇python接口自动化24-token关联登录
如果是cookies的参数,可以用session自动关联
s=requests.session()
后面请求用s.get()和s.post()就可以自动关联cookies了

26不可逆的操作,如何处理,比如删除一个订单这种接口如何测试

此题考的是造数据的能力,接口的请求数据,很多都是需要依赖前面一个状态的
比如工作流这种,流向不同的人状态不一样,操作权限不一样,测试的时候,每种状态都要测到,就需要自己会造数据了。
平常手工测试造数据,直接在数据库改字段状态。那么自动化也是一样,造数据可以用python连数据库了,做增删改查的操作
测试用例前置操作,setUp做数据准备
后置操作,tearDown做数据清理

28一个订单的几种状态如何全部测到

如:未处理,处理中,处理失败,处理成功
跟上面一样,也是考察造数据,修改数据的状态

29平常你是怎么测试接口的?

01
分析
面试官通过这个问题判断求职者是否做过接口测试,以及测试的深度。

02
思路
接口测试的功能点(连通性、功能、性能、安全等)决定了接口测试执行的方式,有手工、自动化等。我们可以分别进行回答。

03
手动测试
1、webService接口:可以使用的工具有SoapUI、jmeter、loadrunner等;
2、http api接口:可以使用的工具有postman、RESTClient、jmeter、loadrunner等。

04
自动化测试
自己开发
第三方工具:SoapUI、 RobotFramework + HttpLibrary 。。。

05性能测试
自己开发
第三方工具:Jmeter、 Gatling、LoadRunner。。。

30没有接口文档,如何做接口测试?

01
分析
如果我来问这个问题,原因可能是因为我的公司就是这个情况,然后看看求职者是否能适应这个情况。
02
思路
先跟开发经理沟通,让他抽点人去整理接口文档; 然后我也会自己用抓包工具整理整理接口。

31当一个接口出现异常时候,你是如何分析异常的?

思路
1.用fiddler等工具进行抓包,看请求报文和返回报文(浏览器可以使用F12)
2.查看后端日志

32如何模拟弱网测试?

思路
1.fiddler和charles都可以模拟弱网测试,平常说的模拟丢包,也是模拟弱网测试。
2.如果是APP,也可以借助连热点,然后在热点上限速

33如何分析一个bug是前端还是后端的?

思路
先抓包看请求报文,对照接口文档,查看请求报文是否有问题,有问题就是前端发的数据不对。请求报文没问题,那就看返回报文,返回的数据不对,那就是后端开发的问题。

34你平常做接口测试的过程中发现过哪些bug?

01
分析
很多面试官希望通过这个问题来判断求职者是否真的做过接口测试。

02
思路
回答这个问题可以从接口测试的内容,并结合接口测试相比页面测试的优势来回答,然后结合具体的案例来让我们的回答更丰满。

03
接口测试点

04
接口测试优势
可以发现很多在页面上操作发现不了的bug。可以修改请求参数,突破前端页面输入限制。

05
举例说明
1、比如一个订单支付时,我们页面上是无法改变订单金额的,但我们可以通过抓包工具捕获订单支付请求,然后修改订单金额后提交,然后出现了一个原价100元的订单我们用1分钱完成了支付。
2、比如一个转账的页面,前段做了限制导致我们无法在转账金额的输入框输入负数,但我们可以通过抓包工具修改,然后出现了一个转账金额为负数的bug。

35HTTP接口传递数据最常用的方式?

get和post最常用。
get是从服务器上获取数据 适用场景:在做搜索接口 商品信息接口
post是向服务器上传送数据 适用场景:在做数据添加修改删除时或图片上传等时能用到

36HTTP接口测试的类型?

1、get请求无参数
2、get请求有参数
3、post请求带参数

37webservice接口如何测试的?

用soapui工具测试

38接口测试的步骤?

大体流程是:
1、阅读API接口文档
2、编写测试用例
3、根据测试用例进行API的手工测试(开发API工具、使用工具进行测试 )

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: