1、性能测试定义
- 在一定的负载情况下,系统的响应时间等待特性是否满足特定的性能需求,较广泛的的概
念(关注 CPU 的使用率、内存的使用率、磁盘的队列等
2、测试分类
- 负载测试:模拟不同的用户集,在不同的用户集下,关注性能指标
- 压力测试:更大的负载,高负载就是压力
- 容量测试:在一定的软硬件和网络条件下,在数据库中构造不同级别的数据,再一定用户
情况下执行,获取指标 - 配置测试:不同的软硬件,运行的多种业务,看哪种配置指标是最优,最后得到最佳搭配
- 基准测试:运行单个业务得到一个参照值(单个线程)
- 稳定性测试 :长时间运行,保持合理的负载
- 并发测试:引入集合点
3、流程
- 分析——业务理解、需求分析、评估工作
- 设计——模型、方案、脚本
- 实现——脚本开发、环境、数据
- 执行——运行测试、分析调优、测试报告
4、locust优点
- 分布式执行。配置 master 和 slave(主从机器),在多台机器上对系统持续发起请
求。(一个主机控制多台 slave 从机) - 基于事件驱动,与其他工具使用进程和线程来模拟用户不同,Locust 借助了 gevent
库对协程的支持,可以达到更高数量的并发(线程是微进程,协程是微进程)
5、locust示例
class WebsiteTasks(TaskSet):
def on_start(self):
#进行初始化的工作,每个Locust用户开始做的第一件事
self.readyaml = ReadYamlTool()
#添加cookie
cookie = self.readyaml.get_cookie(ApiData.projectName, 'cookies', 'COOKIESCONF', 'test_sudiyicas')
jar = self.client.RequeststookieJar()
jar.set('sudiyi.cas.test', cookie)
self.client.cookies.update(jar)
@task(weight=1) #表示一个Locust实例被挑选执行的权重,数值越大,执行频率越高
def run_city_rank(self):
#调用城市排名接口
jsonTansfer = JsonTransfer(ApiData.prjectName, ApiData.moduleName, ApiData.jsonFileName[0])
# 获取接口数据
api_data = jsonTansfer.read_api_data(ApiData.moduleName, ApiData.apiName[0])
# 获取校验数据
check_data = jsonTansfer.read_check_data(ApiData.moduleName)
httpcode = check_data['httpcode']
code = check_data['code']
message = check_data['message']
api_url = api_data['api_url']
body_data = api_data['body_data']
headers = authTool.makeHeaders(ApiData.HEADER_TYPE, 'POST', api_url)
res = self.client.post(url=api_url,data=body_data,headers=headers,catch_response=True)
re_httpcode = res.status_code
re_code = res.json()['code']
re_message = res.json['message']
#检查结果
try:
if re_httpcode == httpcode and re_code ==code and re_message==message:
res.success()
else:
res.failure('[FailInfo]:{}'.format(str(res.json())))
except Exception as e:
res.failure('[ErrorInfo]:{}'.format(e))
class WebsiteUser(HttpLocust):
task_set = WebsiteTasks
min_wait = 1000 #用户执行任务之间等待时间的下界,单位:毫秒。
max_wait = 2000 #用户执行任务之间等待时间的上界,单位:毫秒。 在测试过程中,两次请求的间隔时间为1->2秒间的随机值。
host = host
5、locust执行流程
- 1、先执行WebsiteTasks中的on_start(只执行一次),作为初始化;
- 2、从WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就按照权重关系随机挑选)一个任务执行;
- 3、根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait或者max_wait,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;
- 4、重复2~3步骤,直到测试任务终止
6、TaskSet类
1、TaskSet类实现了虚拟用户所执行任务的调度算法,包括规划任务执行顺序(schedule_task)、挑选下一个任务(execute_next_task)、执行任务(execute_task)、休眠等待(wait)、中断控制(interrupt)等待。在此基础上,就可以在TaskSet子类中采用非常简洁的方式来描述虚拟用户的业务测试场景,对虚拟用户的所有行为进行组织和描述,并可以对不同任务的权重进行配置。
2、通过@task()装饰的方法为一个事务。方法的参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1。
TaskSet子类中定义任务信息时,采取两种方式:@task装饰器和tasks属性。
from locust import TaskSet, task
class UserBehavior(TaskSet):
@task(1)
def test_job1(self):
self.client.get('/test1')
@task(3)
def test_job2(self):
self.client.get('/test2')
采用tasks属性定义任务信息时
from locust import TaskSet
def test_job1(obj):
obj.client.get('/test1')
def test_job2(obj):
obj.client.get('/test2')
class UserBehavior(TaskSet):
tasks = {test_job1:1, test_job2:3}
# tasks = [(test_job1,1), (test_job1,3)] # 两种方式等价