我们已经把基础知识都了解了,现在就可以进入实战脚本开发,看一下效果了。我们还是用微信公众号提供的接口,有兴趣的可以复制下面代码,可以直接在本地执行了。
我们先分析一下需求,我们的目标是压测创建标签接口,这个接口有一个条件,就是首先要登录
,就是获取access_token
。所以我们在写创建标签以前要先获取access_token,可是如果每次执行都先登录,那就成了压测登录+创建标签两个接口了,这样很难看到单个接口的真实数据。所以我们得这样写:
这里还有一点要注意,就是我们模拟多用户的时候,这些用户都是并行
的,模拟了多少个用户,on_start
和on_stop
就会执行多少次。
代码:
# coding: utf-8
import random
from locust import HttpUser, task, between, TaskSet
class TokenTask(TaskSet):
token = None
def on_start(self):
data = {'appid': 'wx4d8f7de320aca501',
'secret': 'd096e22047235cad799d917a517c6246',
'grant_type': 'client_credential'}
with self.client.request('POST',
'/cgi-bin/token',
params=data,
verify=False,
name='获取access_token') as res:
access_token = res.json()['access_token']
print(access_token)
self.token = access_token
@task
def create_tags(self):
print("执行create_tags方法")
s = random.randint(1, 100)
data = {"tag": {"name": f"Beijing{s}"}}
with self.client.request('POST',
'/cgi-bin/tags/create?access_token=' + self.token,
json=data, name='新建标签') as r:
print(r.text)
def on_stop(self):
with self.client.request('POST',
'/cgi-bin/tags/get?access_token=' + self.token,
name='查询标签') as r:
print(r.text)
class QuickstartUser(HttpUser):
tasks = [TokenTask]
host = "https://api.weixin.qq.com"
wait_time = between(1, 2)
执行文件:locust -f testindex.py
可以看到
locust结果
locust图表
Pycharm执行返回
代码分析:我们定义了两个类TokenTask
继承TaskSet
,QuickstartUser
继承HttpUser
。
QuickstartUser
类中定义了任务类
、host
地址、wait_time
等待/思考时间。
TokenTask
这是我们的任务类。为了方便调用,先定义了一个空的token
然后已知登录只需要在开始时执行一次,所以我获取access_token
接口定义在了on_start
里面,然后把接口需要的参数通过self.client.request
进行传递,直接self.client.get/post
也可以,只是这样写我觉得更清晰,而且locust也更支持。
在request
中增加了一个name
参数,这样你在web端看的时候就不显示具体的接口地址而是显示这个name名了。
在创建标签create_tags
中定义了一个变量s,它是1-100之间的随机数,然后在data数据中进行了调用。f"文字{变量}"
这种写法就可以直接引用变量,这是Python的基础语法,不需要多解释,最后发送一下请求。
在on_stop
方法中又增加了一个查询的接口请求,以便确认创建标签成功了。