基于 Python 的性能测试工具 locust (与 LR 的简单对比)

本文通过对比HP LoadRunner (LR) 和开源工具 Locust,介绍了如何使用Locust进行性能测试,并在相同并发用户情况下,对比两者在平均响应时间和TPS等方面的测试结果。Locust基于Python,支持分布式执行,适用于HTTP接口的测试。
摘要由CSDN通过智能技术生成

目录

前言:

背景

基础

测试需求

服务器端

LR 中的测试脚本

locust 中的测试脚本

LR 中的测试过程和结果

Locust 中的测试过程和结果

结果比较

总结


前言:

Locust 是一种开源的性能测试工具,可以帮助我们快速地进行网站、应用程序等的性能测试和压力测试。

背景

最近自己开发了一个小的接口,功能测完了,突然想测下性能,原来做性能测试,我一直用的是 HP 的 LoadRunner,前一段时间正好看过 locust,想想就用这个来测测性能吧。
由于对 LR 比较熟,正好做个对比,这样更利于对新东西的理解。

基础

locust 的官网:Locust - A modern load testing framework

目前 locust 还只支持 Python 2 版本。

测试需求

验证在相同的服务器端的情况下,使用 LR 和 locust 分别进行性能测试,在相同并发用户的情况下,验证平均响应时间,TPS 值等性能测试指标的差异。
为了方便,使用 http 协议,一个 get 请求,一个 post 请求,交易比例为 1:1。

服务器端

为了简单易理解,用 Python 的 bottle 框架写了一个服务器端,2 个交易,一个 get,一个 post 请求,交易中加了 2 个不同的 sleep。
代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'among,lifeng29@163.com'

from bottle import *
from time import sleep

app = Bottle()


@app.route('/transaction_1', method='GET')
def tr1():
    sleep(0.2)
    resp = dict()
    resp['status'] = 0
    resp['value'] = 'xxx'
    return resp


@app.route('/transaction_2', method='POST')
def tr2():
    parm1 = request.forms.get('parm1')
    parm2 = request.forms.get('parm2')
    sleep(0.5)
    resp = dict()
    resp['status'] = 0
    resp['value'] = 'yyy'
    return resp


run(app=app, server='cherrypy', host='0.0.0.0', port=7070, reloader=False, debug=False)

服务器端部署在一个单独的 Windows 的机器中,基于 Python 3,启动后,监听 7070 端口。

LR 中的测试脚本

在另外的一个 Windows 机器中,使用 LR 11,用的是 http/html 协议的脚本,主要代码如下:
用了 2 个 action,用于划分交易比例。
action1:

Action1()
{
    lr_start_transaction("get");
    web_reg_find("Text=xxx",
        LAST);
    web_custom_request("Head",
        "URL=http://10.0.244.108:7070/transaction_1", 
        "Method=GET",
        "Resource=0",
        "Referer=",
        LAST);
    lr_end_transaction("get", LR_AUTO);
    return 0;
}

action2:

Action2()
{
    lr_start_transaction("post");
    web_reg_find("Text=yyy",
        LAST);  
    web_custom_request("Head",
        "URL=http://10.0.244.108:7070/transaction_2", 
        "Method=POST",
        "Resource=0",
        "Referer=",
        "Body=parm1=123&parm2=abc",
        LAST);
    lr_end_transaction("post", LR_AUTO);
    return 0;
}

使用 1:1 的比例设置 2 个 transaction 的执行比例:

LR 中的执行方法,直接放到场景中,执行即可。

locust 中的测试脚本

在另外的 mac 中,使用 locust 执行测试,全部通过代码实现。代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'among,lifeng29@163.com'

from locust import *

class mytest(TaskSet):
    @task(weight=1)
    def transaction_1(self):
        with self.client.get(name='get', url='/transaction_1', catch_response=True) as response:
            if 'xxx' in response.content:
                response.success()
            else:
                response.failure('error')

    @task(weight=1)
    def transaction_2(self):
        dt = {
            'parm1': '123',
            'parm2': 'abc'
        }

        with self.client.post(name='post', url='/transaction_2', data=dt, catch_response=True) as response:
            if 'yyy' in response.content:
                response.success()
            else:
                response.failure('error')


class myrun(HttpLocust):
    task_set = mytest
    host = 'http://10.0.244.108:7070'
    min_wait = 0
    max_wait = 0

具体的参数可以查看官方文档。

其中:

  1. 主类继承 HttpLocust,用于测试 http 协议的系统;
  2. min_wait 和 max_wait 用于设置执行 task 过程中的等待时间,相当于 LR 中 Pacing 的设置,这里都设置为 0;
  3. task 装饰器类似于 LR 中的事务,可以做嵌套;
  4. weight 相当于权重,如 2 个事务是 1:1,保持比例一致就行;
  5. 这里写了 2 个事务,分别为 get 和 post;对 response 的判断通过 python 的语法实现,类似于 LR 中的检查点。

执行方法,通过命令行启动:
如下图:

LR 中的测试过程和结果

测试过程:
直接设置并发用户数和加载方式,10 个用户并发,同时加载就可以了。

测试结果:
平均响应时间:

TPS:

事务:

Locust 中的测试过程和结果

测试过程:
使用浏览器打开http://127.0.0.1:8089

设置需要的并发用户数和用户加载策略。
这里设置相同的 10 用户并发,Hatch Rate 是每秒启动多少用户的意思。这里设置为 10,就是同时启动 10 个了。注意,这里不好设置执行多久,和 LR 不一样。(可以不启动浏览器,直接在启动参数中设置并发用户数,执行多少个事务后结束,具体用-h 可以看到帮助)

启动执行后:

其中,Average 中为平均响应时间等测试指标,最后一列的 reqs/sec 相当于 LR 中的 TPS。(这里 locust 把它叫做 rps),其他指标都比较好理解了。

最后的结果:
在 web 页面中可以下载原始的测试结果数据。
在停掉 python 命令后,在终端中也可以看到一些信息,最后的一行是百分之 X 的响应时间,表示百分之多少的交易在 XXX 响应时间内。
这里比 LR 中的要多点,包括了 50% 到 100% 的响应时间。

结果比较

在相同的服务器端环境,测试的结果值相似,没有多大的区别。
在设置交易比例的过程中,可以看到 get 和 post 交易的比例都存在差异。这个也无法避免(除非自己写脚本划分)。所以 tps 方面存在些差异。不过总体差距很小。

总结

性能测试,重点是考察并发用户数、响应时间、tps 这类指标。

一直用的是 LR,LR 在一起概念上更易于理解,在有 lr 的基础上,在看其他的工具,就比较容易了。

locust 也可以支持分布式执行(多执行机),用来简单测试这类 http 的接口,也算比较方便。
而且,locust 全部基于 Python 脚本,扩展性不错,号称可以测试任何协议和系统。

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)

相信能使你更好的进步!

点击下方小卡片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值