接口API用例自动转locust测试用例
做接口测试是必要的,写完接口测试用例,再写locust压测脚本,其实差异不大:
写个简单的py,把接口测试脚本转为locust压测脚本,本例只是简单的示范:
原接口校验脚本:
1 # -*- coding = utf-8 -*-
2 # ------------------------------
3 # @time: 2020/8/24 15:59
4 # @Author: drew_gg
5 # @File: exhibition_exhibit_info.py
6 # @Software: api_locust
7 # ------------------------------
8
9 import requests
10
11
12 # need to locust #
13 class KBH:
14
15 host = "https://XXXXer.cn/api"
16 url = "/XXXition/XXibit/info"
17
18 @classmethod
19 def get_exhibition_exhibit_info(cls):
20 """
21 :return:
22 """
23
24 data = {"exhibitId": 34}
25 # 请求参数组装 ## r_url:固定参数
26 r_url = KBH.host + KBH.url
27 # 发起请求
28 r = requests.get(r_url, params=data)
29 if r.json()['data']['info']['id'] and r.status_code == 200:
30 print("success")
31 else:
32 print('error')
33
34
35 if __name__ == "__main__":
36 KBH().get_exhibition_exhibit_info()
1.代码里需要有一下标识:
(1)@File:
(2)import requests
(3)need to locust
(4)class
(5)url
(6)@classmethod
(7)cls
(8)host
(9)r = requests.
大致这些标识
转换后的代码:
# -*- coding = utf-8 -*-
# ------------------------------
# @time: 2020/8/24 15:59
# @Author: drew_gg
# @File: locust_XXXxhibit_info.py
# @Software: api_locust
# ------------------------------ import requests
from locust import task, constant
from locust.contrib.fasthttp import FastHttpUser # need to locust #
class KBH(FastHttpUser): host = "https://XXXXer.cn/api"
url = "/exXXion/XXXibit/info"
wait_time = constant(1) @task
def get_exhibition_exhibit_info(self):
"""
:return:
""" data = {"exhibitId": 34}
# 请求参数组装 ## r_url:固定参数
r_url = KBH.url
# 发起请求
with self.client.get(r_url, params=data, timeout=1, catch_response=True) as r:
if r.content == b"":
r.failure("No data")
if r.status_code != 200:
r.failure("request error")
print(r.json())
如果有多个压测方法的话,按照这个类似循环修改吧,这里只是做个简单的字符匹配与替换
1 # -*- coding = utf-8 -*-
2 # ------------------------------
3 # @time: 2020/8/21 11:54
4 # @Author: drew_gg
5 # @File: case_to_locust.py
6 # @Software: api_locust
7 # ------------------------------
8
9 import os
10
11 pl = os.getcwd().split('api_locust')
12 path_to_do = pl[0] + "api_locust\\locust_view\\kbh_api\\api\\"
13 path_to_end = pl[0] + "api_locust\\locust_view\\kbh_api\\locust_api\\"
14
15
16 def search(path, name):
17 """
18 遍历文档目录
19 :param path:
20 :param name:
21 :return:
22 """
23 file_l = []
24 for root, dirs, files in os.walk(path):
25 root = str(root)
26 if files:
27 for i in files:
28 if name in i:
29 if '__init__' not in i:
30 file_l.append(root + i)
31 return file_l
32
33
34 fl = search(path_to_do, '.py')
35
36 for fi in fl:
37 with open(fi, 'r', encoding="utf-8") as f:
38 py_file = path_to_end + 'locust_' + fi.split('\\')[-1]
39 f_new = open(py_file, 'w', encoding='utf-8')
40 f = f.readlines()
41 class_host = '&&&&&&&&@@@'
42 for i in f:
43 if "need to locust" in i:
44 for line in f:
45 if "@File:" in line:
46 b = "# @File: " + 'locust_' + fi.split('\\')[-1] + '\n'
47 line = line.replace(line, b)
48 if "import" in line:
49 b = line + "from locust import task, constant \nfrom locust.contrib.fasthttp import FastHttpUser\n"
50 line = line.replace(line, b)
51 if "class " in line:
52 b = line.split(":")[0] + "(FastHttpUser):\n"
53 class_name = line.split('class ')[1].split(":")[0]
54 class_host = class_name + ".host + "
55 line = line.replace(line, b)
56 if 'url = "' in line:
57 b = line + " wait_time = constant(1)\n"
58 line = line.replace(line, b)
59 if "@classmethod" in line:
60 line = line.replace(line, " @task\n")
61 if "cls" in line:
62 b = line.split("cls")[0] + 'self' + line.split("cls")[1]
63 line = line.replace(line, b)
64 if class_host in line:
65 b = line.split("KBH.host + ")[0] + line.split("KBH.host + ")[1]
66 line = line.replace(line, b)
67 if "r = requests." in line:
68 r_d = line.split('(')[1].split(")")[0]
69 r_m = line.split('.')[1].split('(')[0]
70 if r_m == "get":
71 b = " with self.client.get(%s, timeout=1, catch_response=True) as r:\n" % r_d
72 if r_m == "post":
73 b = " with self.client.post(%s, timeout=1, catch_response=True) as r:\n" % r_d
74 line = line.replace(line, b)
75 f_new.write(line)
76 b = """ if r.content == b"":
77 r.failure("No data")
78 if r.status_code != 200:
79 r.failure("request error")
80 print(r.json())
81 """
82 f_new.write(b)
83 break
84 f_new.write(line)
85 f_new.close()
应该有其他更好的方式,欢迎交流
Locust QQ 群:
接口API用例自动转locust测试用例的更多相关文章
- 接口如何使用(以笑话大全api为例)
接口如何使用(以笑话大全api为例) 一.总结 一句话总结:直接用ajax,或者post,get方式向接口网址请求数据,然后接收网站传过来的数据就好,和我们写网站的时候前台向后台请求数据的方式一样. ...
- Kafka Consumer API样例
Kafka Consumer API样例 1. 自动确认Offset 说明参照:http://blog.csdn.net/xianzhen376/article/details/51167333 Pr ...
- 微信公众平台接口API
<?php /** * Author: helen * CreateTime: 2015/12/9 20:14 * description: 微信公众平台接口API */ class Wecha ...
- 消息队列接口API(posix 接口和 system v接口)
消息队列 posix API 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.信号这种通信方式更像\"即时\"的通信方式,它要求接受信号的进程在某个时间范围内对信 ...
- 从壹开始 [ Nuxt.js ] 之二 || 项目搭建 与 接口API
前言 哈喽大家周一好,今天的内容比较多,主要就是包括:把前端页面的展示页给搭出来,然后调通接口API,可以添加数据,这两天我也一直在开发,本来想一篇一篇的写,发现可能会比较简单,就索性把项目搭建的过程 ...
- 推荐一款接口 API 设计神器!
今天栈长给大家推荐一款接口 API 设计神器,传说中的,牛逼哄洪的 Swagger,它到底是什么?今天为大家揭开谜底! Swagger是什么? 官网:https://swagger.io/ Swagg ...
- 接口API封装中常见的HTTP状态码
在进行后端接口API封装的过程中,需要考虑各种错误信息的输出.一般情况下,根据相应问题输出适合的HTTP状态码,可以方便前端快速定位错误,减少沟通成本. HTTP状态码有很多,每个都有对应的含义,下面 ...
- python3.8.0 Django 开发后端接口api 部署到 Linux Centos7上
经历了两天的时候终于把本地使用python3 django开发的接口API部署到服务器上了,还是记录一下,以免之后忘记,哈哈 注意一点,就是,centos7是基于python2的,我这边默认的是pyt ...
- ng接口API开发文档
接口版本:v1 接口协议:请商户对接使用对应的转账接口API和免转接口API,商户只能使用菜单对应的API,否则接口会调用失败.左侧菜单未注明的接口免转钱包和转账钱包可以共同使用所有采集均按照北京时间 ...
- Vue学习笔记-Django REST framework3后端接口API学习
一 使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7 (Windows x86- ...
随机推荐
- RCC & GPIO库函数&传感器输入
RCC: Reset and Clock Control,即复位和时钟控制. 一般在.h文件的末尾都是一些函数声明,RCC常用的三个函数(外设时钟控制,没有时钟外设不工作): void RCC_A ...
- react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁
react 中 动态添加 class,防止图片 重复加载, 主要是 background-image的二次加载会有新请求,和图片的闪烁 let imageTopBg if (imgSrcBg) { c ...
- redis三主三从详细搭建过程
搭建Redis三主三从集群的详细步骤如下: 准备环境: 确保你有六台服务器或虚拟机,每台服务器上都已经安装了Redis.这些服务器将用于搭建三主三从的Redis集群. 确保所有服务器之间的网络连接正常 ...
- 大年学习linux(第五节---目录结构)
五.目录结构 可以用ls / 查看linux的目录结构 bin data etc lib media opt root sbin sys usr boot dev home lib64 mnt pro ...
- 学会Promise,看这里!!!
前言 众所周知,在JavaScript的世界中,代码都是单线程执行的.由于这个原因,JavaScript中的耗时操作,如网络操作.浏览器事件等,都需要异步执行.这也导致在JavaScript中异步操作 ...
- Avalonia 11.1.0-beta1 发布
11.1.0-beta1 Avalonia 是 dotnet 的跨平台 UI 框架,提供灵活的样式系统,支持 Windows.macOS.Linux.iOS.Android 和 WebAssembly ...
- 01.Android之基础组件问题
目录介绍 1.0.0.1 说下Activity的生命周期?屏幕旋转时生命周期?异常条件会调用什么方法? 1.0.0.2 后台的Activity被系统回收怎么办?说一下onSaveInstanceSta ...
- 记录--盘点 TypeScript 那些奇怪的符号
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和 ...
- 一键解决App应用分发下载问题
本文深入分析了App应用分发下载失败的常见原因,并提供了针对网络连接问题.服务器故障.设备存储空间不足.文件大小和格式不受支持等方面的解决方法.此外,还附带了一个在线证书制作工具的案例演示,旨在帮助开 ...
- 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第3章
本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录