学习笔记-locust入门

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)] # 两种方式等价

你可能感兴趣的:(学习笔记-locust入门)