获取接口数据

接口测试,第一步就是需要获取接口数据。

目前已实现2个方案,可以获取到线上环境用户操作的接口数据:

方案一、通过和运维沟通,通过运维从后端取log日志发过来,我这边再写一个脚本,从log文件里面取需要的url和parameter保存下来。

方案二、调用es的接口,通过脚本查询拉取kibana上面对应的index的数据。

从方案暴露的问题作为切入点,记录一下问题和实现的过程。

方案一的不足:

背景:

因为需求不是很明确,一开始的想法是,只需要拿到线上环境的用户操作的接口数据,通过脚本去跑接口,得出一份respond的数据作为版本前的标准数据就可以了。

但是,细想一下,这样的标准数据是死的,方案一 就暴露了很大的不足:

1.很依赖运维什么时候给的接口log,什么时候才能更新这份版本前的数据。而且数据量巨大,0.5天的接口数据解压出来有12Gb,单单提取url和parameter的文本文件有将近7Gb。

2.如果版本更新后接口进行了CUD,那么,版本前接口没CUD的respond数据是没有更新的,版本后,如果也还是用运维给的log的url和parameter去跑,这份respond的数据也是没有更新的,即是版本前和版本后都没有把已经CUD的接口给加进去做对比,显然,这是一个很大的漏洞。

方案二的优&缺点:

背景:

显然,方案一 存在不足,才会诞生方案二、方案三  。。。

方案二针对方案一 的疼点,解决了以下问题:

1.接口数据依赖运维的问题,可解藕。

2.接口数据迭代麻烦的问题,可随时更新接口数据,today,yesterday and so on ,只要需要,随时可以取一份新的接口数据下来。但,方案二 也有限制,因为面向的对象不是运维了,面对运维,可能说你要多少的数据,运维就给你发多少Gb。而,方案二 是通过脚本查询去从es取想要的数据,面向对象就从运维变成elk了,方案二 的限制的根本,其实也在于es的限制,因为调用es的接口,es default就是一次最多只能返回10000条数据,当你想要取1000000条数据当时候,抱歉,报错了:size shoud be < = 10000

但,10k的数据,很明显是不够的,中午高峰期的时候,10分钟就有100k左右的数据:

所以,如果要取的话,大约取1000k应该就差不多了。

那怎么办,怎么从10k变成1000k

换位思考下,如果这个是money呢,既然不能一次取那么多钱,那么分多次取,不就可以了吗

既然不能从深度获取更多的数据,那么可以从广度下手呀,于是在代码里面加入了如下逻辑:

1.date是自定义取那个时间的数据,精确到 %Y-%m-%d %H:%M:%S

2.然后每一次取10k条数据,同时在当前设定的时间上增加5分钟,也就是,一个小时取12个5分钟前面的10k条数据

3.如果range(100),10k*100 = 1000k,100次基本上可以覆盖到一整天高峰时期的接口数据(10:00-18:00)

4.同时增加异常处理,报错了,也会继续跑下个5分钟(可能偶尔会出现些不符合json格式的接口),目的是取接口数据,报错不应该停止。

5.考虑到会给es的服务器大的压力,所以,每取完一次,等待10s再去执行下一次,尽量希望那边的服务器能扛住(心慌慌)

 (如果不行,会考虑给30s等待时间)

  problem:

      虽然,这样已经可以取到大量的接口数据了,但是,还有个问题就是,取的接口数据并不是连续的,1000k的数据都是取每个5分钟前面的10k条,和运维给的log的文件的连续的数据是有区别的。考虑到我们的需求是接口测试自动化对比,接口数据是否连续的应该是影响不大的,只要量够大,是基本都覆盖到了,而且,如果真的要连续的数据,半天就有7G的数据,覆盖一天,就有十几G,如此大的数据量,对于接口测试也是很大的压力,所以选择了脚本实现的散点分布的大覆盖实现方法。

(当然,需要取连续的数据在某些场景是需要的,有方法是改es的配置,但是,个人觉得这并不是最优解,es既然做了限制,自然会有它的道理,估计是不想给服务器太大的压力,所以这里也为以后埋个伏笔)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 可以使用 Python 的第三方库来获取接口数据。常见的库有 requests、urllib 等。 使用 requests 库可以这样实现: ``` import requests response = requests.get("https://api.example.com/data") data = response.json() ``` 使用 urllib 库可以这样实现: ``` import urllib.request import json with urllib.request.urlopen("https://api.example.com/data") as url: data = json.loads(url.read().decode()) ``` 需要注意的是,需要先确保已经安装了 requests 或 urllib 库。 ### 回答2: Python获取接口数据需要使用requests库。该库可以发送HTTP请求,并获取相应的数据。 首先,我们需要安装requests库,可以使用以下命令进行安装: ```python pip install requests ``` 接下来,我们可以使用requests库发送HTTP请求并获取接口数据。通常,我们使用的是GET请求获取接口数据。以下是一个简单的例子: ```python import requests # 发送GET请求 response = requests.get('http://api.example.com/data') # 获取接口返回的数据 data = response.json() # 打印数据 print(data) ``` 上述例子中,我们使用requests库发送了一个GET请求到'http://api.example.com/data'接口,并将返回的数据存储在response变量中。然后,我们使用json()方法将响应数据转换为Python字典或列表,并将结果保存在data变量中。最后,我们打印数据。 除了GET请求,我们还可以使用POST请求和其他HTTP方法来发送请求,具体取决于接口的要求。在请求中,我们还可以传递参数、请求头和认证信息等。 需要注意的是,在实际操作中,我们可能需要处理接口返回的响应状态码、错误处理和异常等情况。同时,还可以使用其他辅助库如jsonpath提取特定的数据。 总结起来,使用Python获取接口数据的步骤是:安装requests库,发送HTTP请求,获取响应数据并进行处理。 ### 回答3: Python获取接口数据的方法有很多种,可以使用第三方库,也可以使用Python内置库进行操作。 使用第三方库的方法: 1. 使用requests库发送HTTP请求,并获取接口数据。首先需要安装requests库,然后使用requests.get()或requests.post()方法发送GET或POST请求,并传入接口URL,最后使用response.content或response.json()方法获取返回的数据。 2. 使用urllib库发送HTTP请求,并获取接口数据。urllib库是Python内置的库,不需要安装,使用urllib.request.urlopen()方法发送请求,并传入接口URL,最后使用response.read()方法获取返回的数据。 使用Python内置库的方法: 1. 使用http.client库发送HTTP请求,并获取接口数据。首先使用http.client.HTTPConnection()方法建立与接口的连接,然后使用request()方法发送请求,并传入请求方法(GET或POST)、接口URL、请求头和请求体,最后使用response.read()方法获取返回的数据。 2. 使用urllib.request库发送HTTP请求,并获取接口数据。使用urllib.request.urlopen()方法发送请求,并传入接口URL,最后使用response.read()方法获取返回的数据。 需要注意的是,在使用这些方法获取接口数据时,需要根据接口的要求进行参数的传递,例如接口需要传递请求头、请求体或查询参数等。此外,还需要处理接口返回的数据,可以根据接口返回的数据格式使用相应的方法解析和处理数据。 总结起来,Python获取接口数据的方法有很多种,可以根据实际需求选择适合的方法进行操作。以上提到的是一些常见的方法,但还有其他方法可供选择,根据接口的具体情况进行选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘凛枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值