<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Locust实用教程 on 重定向学院</title><link>https://itest2025.pages.dev/categories/locust%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/</link><description>Recent content in Locust实用教程 on 重定向学院</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 17 Jun 2025 17:29:15 +0800</lastBuildDate><atom:link href="https://itest2025.pages.dev/categories/locust%E5%AE%9E%E7%94%A8%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>（一）Locust 介绍</title><link>https://itest2025.pages.dev/tutorials/38-001-%E4%B8%80locust-%E4%BB%8B%E7%BB%8D/</link><pubDate>Mon, 16 Oct 2017 14:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-001-%E4%B8%80locust-%E4%BB%8B%E7%BB%8D/</guid><description>&lt;p>Locust 官方网站：https://www.locust.io/&lt;/p>
&lt;h4 id="locust-介绍">Locust 介绍&lt;/h4>
&lt;hr>
&lt;p>An open source load testing tool.&lt;/p>
&lt;p>一个开源性能测试工具。&lt;/p>
&lt;p>define user behaviour with python code, and swarm your system with millions of simultaneous users.&lt;/p>
&lt;p>使用 Python 代码来定义用户行为。用它可以模拟百万计的并发用户访问你的系统。&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://img.testclass.net/locust_UI.png"
 data-srcset="http://img.testclass.net/locust_UI.png, http://img.testclass.net/locust_UI.png 1.5x, http://img.testclass.net/locust_UI.png 2x"
 data-sizes="auto"
 alt="http://img.testclass.net/locust_UI.png"
 title="http://img.testclass.net/locust_UI.png" />&lt;/p>
&lt;br>
#### 性能工具对比
----
__LoadRunner__ 是非常有名的商业性能测试工具，功能非常强大。使用也比较复杂，目前大多介绍性能测试的书籍都以该工具为基础，甚至有些书整本都在介绍 LoadRunner 的使用。
&lt;p>&lt;strong>Jmeter&lt;/strong> 同样是非常有名的开源性能测试工具，功能也很完善，在本书中介绍了它作为接口测试工具的使用。但实际上，它是一个标准的性能测试工具。关于Jmeter相关的资料也非常丰富，它的官方文档也很完善。&lt;/p>
&lt;p>&lt;strong>Locust&lt;/strong> 同样是性能测试工具，虽然官方这样来描述它 “An open source load testing tool.” 。但其它和前面两个工具有着较大的不同。相比前面两个工具，功能上要差上不少，但它也并非优点全无。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Locust 完全基本 Python 编程语言，采用 Pure Python 描述测试脚本，并且 HTTP 请求完全基于 Requests 库。除了 HTTP/HTTPS 协议，Locust 也可以测试其它协议的系统，只需要采用Python调用对应的库进行请求描述即可。&lt;/p></description></item><item><title>（二）Locust 安装</title><link>https://itest2025.pages.dev/tutorials/38-002-%E4%BA%8Clocust-%E5%AE%89%E8%A3%85/</link><pubDate>Mon, 16 Oct 2017 13:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-002-%E4%BA%8Clocust-%E5%AE%89%E8%A3%85/</guid><description>&lt;p>&lt;font color='red'>Locust 是基于 Python 语言的一个性能测试库，如果要想使用它来做性能测试必须要先安装 Python 。&lt;/font>&lt;/p>
&lt;p>Python安装，&lt;a href="https://itest2025.pages.dev/selenium_python/install-selenium/" rel="">参考&lt;/a>&lt;/p>
&lt;br>
#### Locust 安装
----
方式一：通过 pip 命令安装
&lt;pre tabindex="0">&lt;code>&amp;gt; pip install locust

Collecting locust
 Downloading locust-0.8.tar.gz (225kB)
 59% |███████████████████ | 133kB 199kB/s eta 0:00:0
 63% |████████████████████▍ | 143kB 304kB/s eta 0:00:
 68% |█████████████████████▉ | 153kB 358kB/s eta 0:0
 72% |███████████████████████▎ | 163kB 355kB/s eta 0:
 77% |████████████████████████▊ | 174kB 421kB/s eta
 81% |██████████████████████████▏ | 184kB 449kB/s eta
 86% |███████████████████████████▋ | 194kB 439kB/s e
 90% |█████████████████████████████ | 204kB 487kB/s
 95% |██████████████████████████████▌ | 215kB 492kB/s
 99% |████████████████████████████████| 225kB 487kB
 100% |████████████████████████████████| 235kB 417k

 ....
&lt;/code>&lt;/pre>&lt;p>方式二：GitHub下载安装&lt;/p></description></item><item><title>（三）Locust 创建性能测试</title><link>https://itest2025.pages.dev/tutorials/38-003-%E4%B8%89locust-%E5%88%9B%E5%BB%BA%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/</link><pubDate>Mon, 16 Oct 2017 12:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-003-%E4%B8%89locust-%E5%88%9B%E5%BB%BA%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/</guid><description>&lt;p>&lt;font color='red'> Locust 可没有傻瓜式的脚本录制功能，要想用它来做性能测试，必须撸起袖子来写代码。不过。它并不难！&lt;/font>&lt;/p>
&lt;h4 id="编写简单的性能测试脚本">编写简单的性能测试脚本&lt;/h4>
&lt;p>创建 load_test.py 文件，通过 Python 编写性能测试脚本。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">locust&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TaskSet&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 定义用户行为&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">UserBehavior&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TaskSet&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">baidu_index&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">client&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">WebsiteUser&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">task_set&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">UserBehavior&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">min_wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">6000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>UserBehavior类继承TaskSet类，用于描述用户行为。&lt;/p>
&lt;p>baidu_index() 方法表示一个用户为行，访问百度首页。使用@task装饰该方法为一个事务。client.get()用于指请求的路径“/”，因为是百度首页，所以指定为根路径。&lt;/p>
&lt;p>WebsiteUser类用于设置性能测试。&lt;/p>
&lt;ul>
&lt;li>
&lt;p>task_set ：指向一个定义的用户行为类。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>min_wait ：执行事务之间用户等待时间的下界（单位：毫秒）。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>max_wait ：执行事务之间用户等待时间的上界（单位：毫秒）。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="执行性能测试">执行性能测试&lt;/h3>
&lt;hr>
&lt;p>&lt;strong>启动性能测试&lt;/strong>&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt; locust -f .\load_test.py --host=https://www.baidu.com

[2017-10-16 16:44:40,839] DESKTOP-SMGQBBM/INFO/locust.main: Starting web monitor at *:8089
[2017-10-16 16:44:40,842] DESKTOP-SMGQBBM/INFO/locust.main: Starting Locust 0.8
&lt;/code>&lt;/pre>&lt;ul>
&lt;li>-f 指定性能测试脚本文件。&lt;/li>
&lt;li>&amp;ndash;host 指定被测试应用的URL的地址，注意访问百度使用的HTTPS协议。&lt;/li>
&lt;/ul>
&lt;p>通过浏览器访问：http://localhost:8089（Locust启动网络监控器，默认为端口号为: 8089）&lt;/p>
&lt;p>&lt;strong>设置测试&lt;/strong>&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://img.testclass.net/locust_run_setings.png"
 data-srcset="http://img.testclass.net/locust_run_setings.png, http://img.testclass.net/locust_run_setings.png 1.5x, http://img.testclass.net/locust_run_setings.png 2x"
 data-sizes="auto"
 alt="http://img.testclass.net/locust_run_setings.png"
 title="http://img.testclass.net/locust_run_setings.png" />&lt;/p></description></item><item><title>（四）Locust no-web模式</title><link>https://itest2025.pages.dev/tutorials/38-004-%E5%9B%9Blocust-no-web%E6%A8%A1%E5%BC%8F/</link><pubDate>Mon, 16 Oct 2017 12:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-004-%E5%9B%9Blocust-no-web%E6%A8%A1%E5%BC%8F/</guid><description>&lt;p>熟悉 Apache ab 工具的同学都知道，它是没有界面的，通过命令行执行。 Locust 同样也提供的命令行运行，好处就是更节省客户端资源。&lt;/p>
&lt;h4 id="命令行运行-locust-测试">命令行运行 Locust 测试&lt;/h4>
&lt;hr>
&lt;p>以上一节的 baidu 首页测试（load_test.py）为例 通过 &lt;strong>no-web&lt;/strong> 模式运行测试。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt; locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m

[2017-10-30 22:17:30,292] DESKTOP-SMGQBBM/INFO/locust.main: Run time limit set to 60 seconds
[2017-10-30 22:17:30,302] DESKTOP-SMGQBBM/INFO/locust.main: Starting Locust 0.8
[2017-10-30 22:17:30,302] DESKTOP-SMGQBBM/INFO/locust.runners: Hatching and swarming 10 clients at the rate 2 clients/s...
 Name # reqs # fails Avg Min Max | Median req/s

....


 [2017-10-30 22:18:30,301] DESKTOP-SMGQBBM/INFO/locust.main: Time limit reached. Stopping Locust.
 [2017-10-30 22:18:30,302] DESKTOP-SMGQBBM/INFO/locust.main: Shutting down (exit code 0), bye.
 Name # reqs # fails Avg Min Max | Median req/s
 --------------------------------------------------------------------------------------------------------------------------------------------
 GET / 117 0(0.00%) 31 17 96 | 28 2.10
 --------------------------------------------------------------------------------------------------------------------------------------------
 Total 117 0(0.00%) 2.10

 Percentage of the requests completed within given times
 Name # reqs 50% 66% 75% 80% 90% 95% 98% 99% 100%
 --------------------------------------------------------------------------------------------------------------------------------------------
 GET / 117 28 30 36 37 49 62 69 72 96
 --------------------------------------------------------------------------------------------------------------------------------------------
 Total 117 28 30 36 37 49 62 69 72 96
&lt;/code>&lt;/pre>&lt;p>&lt;strong>启动参数：&lt;/strong>&lt;/p></description></item><item><title>（五）Locust 参数说明</title><link>https://itest2025.pages.dev/tutorials/38-005-%E4%BA%94locust-%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E/</link><pubDate>Mon, 16 Oct 2017 11:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-005-%E4%BA%94locust-%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E/</guid><description>&lt;p>最时候该讲一下 locust 工具的参数了，虽然前面几节我们已经使用了不少参数，例如 &lt;strong>“-f”&lt;/strong> 、&lt;strong>“&amp;ndash;host”&lt;/strong> 等。&lt;/p>
&lt;h4 id="locust-参数">Locust 参数&lt;/h4>
&lt;hr>
&lt;p>打开命令提示符（或Linux终端），输入 &lt;code>locust --help&lt;/code> 。&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt; locust --help
Usage: locust [options] [LocustClass [LocustClass2 ... ]]

Options:
 -h, --help show this help message and exit
 -H HOST, --host=HOST Host to load test in the following format:
 http://10.21.32.33
 --web-host=WEB_HOST Host to bind the web interface to. Defaults to &amp;#39;&amp;#39; (all
 interfaces)
 -P PORT, --port=PORT, --web-port=PORT
 Port on which to run web host
 -f LOCUSTFILE, --locustfile=LOCUSTFILE
 Python module file to import, e.g. &amp;#39;../other.py&amp;#39;.
 Default: locustfile
 --csv=CSVFILEBASE, --csv-base-name=CSVFILEBASE
 Store current request stats to files in CSV format.
 --master Set locust to run in distributed mode with this
 process as master
 --slave Set locust to run in distributed mode with this
 process as slave
 --master-host=MASTER_HOST
 Host or IP address of locust master for distributed
 load testing. Only used when running with --slave.
 Defaults to 127.0.0.1.
 --master-port=MASTER_PORT
 The port to connect to that is used by the locust
 master for distributed load testing. Only used when
 running with --slave. Defaults to 5557. Note that
 slaves will also connect to the master node on this
 port + 1.
 --master-bind-host=MASTER_BIND_HOST
 Interfaces (hostname, ip) that locust master should
 bind to. Only used when running with --master.
 Defaults to * (all available interfaces).
 --master-bind-port=MASTER_BIND_PORT
 Port that locust master should bind to. Only used when
 running with --master. Defaults to 5557. Note that
 Locust will also use this port + 1, so by default the
 master node will bind to 5557 and 5558.
 --expect-slaves=EXPECT_SLAVES
 How many slaves master should expect to connect before
 starting the test (only when --no-web used).
 --no-web Disable the web interface, and instead start running
 the test immediately. Requires -c and -r to be
 specified.
 -c NUM_CLIENTS, --clients=NUM_CLIENTS
 Number of concurrent Locust users. Only used together
 with --no-web
 -r HATCH_RATE, --hatch-rate=HATCH_RATE
 The rate per second in which clients are spawned. Only
 used together with --no-web
 -t RUN_TIME, --run-time=RUN_TIME
 Stop after the specified amount of time, e.g. (300s,
 20m, 3h, 1h30m, etc.). Only used together with --no-
 web
 -L LOGLEVEL, --loglevel=LOGLEVEL
 Choose between DEBUG/INFO/WARNING/ERROR/CRITICAL.
 Default is INFO.
 --logfile=LOGFILE Path to log file. If not set, log will go to
 stdout/stderr
 --print-stats Print stats in the console
 --only-summary Only print the summary stats
 --no-reset-stats Do not reset statistics once hatching has been
 completed
 -l, --list Show list of possible locust classes and exit
 --show-task-ratio print table of the locust classes&amp;#39; task execution
 ratio
 --show-task-ratio-json
 print json data of the locust classes&amp;#39; task execution
 ratio
 -V, --version show program&amp;#39;s version number and exit
&lt;/code>&lt;/pre>&lt;p>&lt;strong>参数说明：&lt;/strong>&lt;/p></description></item><item><title>（六）Locust 分布式运行</title><link>https://itest2025.pages.dev/tutorials/38-006-%E5%85%ADlocust-%E5%88%86%E5%B8%83%E5%BC%8F%E8%BF%90%E8%A1%8C/</link><pubDate>Mon, 16 Oct 2017 10:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-006-%E5%85%ADlocust-%E5%88%86%E5%B8%83%E5%BC%8F%E8%BF%90%E8%A1%8C/</guid><description>&lt;p>参考：&lt;a href="https://docs.locust.io/en/latest/running-locust-distributed.html" target="_blank" rel="noopener noreffer ">官方文档&lt;/a>&lt;/p>
&lt;h4 id="分布式运行locust">分布式运行Locust&lt;/h4>
&lt;hr>
&lt;p>一旦单台机器不够模拟足够多的用户时，Locust支持运行在多台机器中进行压力测试。&lt;/p>
&lt;p>为了实现这个，你应该在 master 模式中使用&lt;code>--master&lt;/code>标记来启用一个 Locust 实例。这个实例将会运行你启动测试的 Locust 交互网站并查看实时统计数据。master 节点的机器自身不会模拟任何用户。相反，你必须使用 &lt;code>--slave&lt;/code> 标记启动一台到多台 Locustslave 机器节点，与标记 &lt;code>--master-host&lt;/code> 一起使用(指出master机器的IP/hostname)。&lt;/p>
&lt;p>常用的做法是在一台独立的机器中运行master，在slave机器中每个处理器内核运行一个slave实例。&lt;/p>
&lt;blockquote>
&lt;p>注意：master 和每一台 slave 机器，在运行分布式测试时都必须要有 locust 的测试文件。&lt;/p>&lt;/blockquote>
&lt;h4 id="示例">示例&lt;/h4>
&lt;hr>
&lt;p>在 master 模式下启动 Locust:&lt;/p>
&lt;pre tabindex="0">&lt;code>locust -f my_loucstfile.py --master
&lt;/code>&lt;/pre>&lt;p>在每个 slave 中执行(192.168.0.14 替换为你 msater 的IP):&lt;/p>
&lt;pre tabindex="0">&lt;code>locust -f my_locustfile.py --slave --master-host=192.168.0.14
&lt;/code>&lt;/pre>&lt;h4 id="参数说明">参数说明&lt;/h4>
&lt;hr>
&lt;p>参数&lt;/p>
&lt;p>&amp;ndash;master&lt;/p>
&lt;p>设置 Locust 为 master 模式。网页交互会在这台节点机器中运行。&lt;/p>
&lt;p>&amp;ndash;slave&lt;/p>
&lt;p>设置 Locust 为 slave 模式。&lt;/p>
&lt;p>&amp;ndash;master-host=X.X.X.X&lt;/p>
&lt;p>可选项，与 &lt;code>--slave&lt;/code> 一起结合使用，用于设置 master 模式下的 master 机器的IP/hostname(默认设置为127.0.0.1)&lt;/p>
&lt;p>&amp;ndash;master-port=5557&lt;/p>
&lt;p>可选项，与 &lt;code>--slave&lt;/code> 一起结合使用，用于设置 master 模式下的 master 机器中 Locust 的端口(默认为5557)。注意，locust 将会使用这个指定的端口号，同时指定端口+1的号也会被占用。因此，5557 会被使用，Locust将会使用 5557 和 5558。&lt;/p></description></item><item><title>（七）Locust 的类和方法</title><link>https://itest2025.pages.dev/tutorials/38-007-%E4%B8%83locust-%E7%9A%84%E7%B1%BB%E5%92%8C%E6%96%B9%E6%B3%95/</link><pubDate>Mon, 16 Oct 2017 09:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-007-%E4%B8%83locust-%E7%9A%84%E7%B1%BB%E5%92%8C%E6%96%B9%E6%B3%95/</guid><description>&lt;p>针对你的业务，你如何进行测试测试，需要通过编写性能测试脚本实现。所以，我们要熟悉 Locust 提供了哪些类和方法，它们分别实现什么操作。&lt;/p>
&lt;h4 id="httplocust-类">HttpLocust 类&lt;/h4>
&lt;hr>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">locust&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TaskSet&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">UserTask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TaskSet&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">tc_index&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">client&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">UserOne&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">task_set&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">UserTask&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weight&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">min_wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">stop_timeout&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">host&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://www.baidu.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">UserTwo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weight&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">task_set&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">UserTask&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">host&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://www.baidu.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每一个模拟的用户可以看做一个 HttpLocust 类的实例，HttpLocust 类有如下属性：&lt;/p>
&lt;ul>
&lt;li>task_set&lt;/li>
&lt;/ul>
&lt;p>指向一个 TaskSet 类，TaskSet 类定义了每个用户的行为。&lt;/p>
&lt;ul>
&lt;li>min_wait&lt;/li>
&lt;/ul>
&lt;p>用户执行任务之间等待时间的下界，单位：毫秒。如果TaskSet类中有覆盖，以TaskSet 中的定义为准。&lt;/p>
&lt;ul>
&lt;li>max_wait&lt;/li>
&lt;/ul>
&lt;p>用户执行任务之间等待时间的上界，单位：毫秒。如果TaskSet类中有覆盖，以TaskSet中的定义为准。&lt;/p>
&lt;ul>
&lt;li>host&lt;/li>
&lt;/ul>
&lt;p>如果是 Web 服务的测试，host 相当于是提供 URL 前缀的默认值，但是如果在命令行中指定了 &lt;code>--host&lt;/code> 选项，则以命令行中指定的为准。如果不是 Web 服务测试，使用默认的 None 就好。&lt;/p>
&lt;ul>
&lt;li>stop_timeout&lt;/li>
&lt;/ul>
&lt;p>设置 Locust 多少秒后超时，如果为 &lt;strong>None&lt;/strong> ,则不会超时。&lt;/p>
&lt;ul>
&lt;li>weight&lt;/li>
&lt;/ul>
&lt;p>一个Locust实例被挑选执行的权重，数值越大，执行频率越高。在一个 locustfile.py 文件中可以同时定义多个 HttpLocust 子类，然后分配他们的执行权重，例如：&lt;/p>
&lt;p>然后在终端启动测试：&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;gt; locust -f load_test.py UserOne UserTwo
&lt;/code>&lt;/pre>&lt;h4 id="taskset-类">TaskSet 类&lt;/h4>
&lt;hr>
&lt;p>TaskSet类定义了每个用户的任务集合，测试任务开始后，每个 Locust 用户会从 TaskSet 中随机挑选一个任务执行，然后随机等待 HttpLocust 类中定义的 min_wait和 max_wait 之间的一段时间，执行下一个任务。&lt;/p></description></item><item><title>（八）Locust 设置断言</title><link>https://itest2025.pages.dev/tutorials/38-008-%E5%85%ABlocust-%E8%AE%BE%E7%BD%AE%E6%96%AD%E8%A8%80/</link><pubDate>Mon, 16 Oct 2017 08:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-008-%E5%85%ABlocust-%E8%AE%BE%E7%BD%AE%E6%96%AD%E8%A8%80/</guid><description>&lt;p>性能测试也需要设置断言么？ 某些情况下是需要，比如你在请求一个页面时，就可以通过状态来判断返回的 HTTP 状态码是不是 200。&lt;/p>
&lt;h4 id="设置响应断言">设置响应断言&lt;/h4>
&lt;hr>
&lt;p>这里同样以测试百度首页为例。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">locust&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TaskSet&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">UserTask&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TaskSet&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">job&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">with&lt;/span> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">client&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">catch_response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">status_code&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">failure&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Failed!&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">success&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">User&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">task_set&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">UserTask&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">min_wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">host&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://www.baidu.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>catch_response = True ：布尔类型，如果设置为 True, 允许该请求被标记为失败。&lt;/p>
&lt;p>通过 client.get() 方法发送请求，将整个请求的给 response， 通过 response.status_code 得请求响应的 HTTP 状态码。如果不为 200 则通过 response.failure(&amp;lsquo;Failed!&amp;rsquo;) 打印失败！&lt;/p>
&lt;p>&lt;strong>启动测试，运行情况：&lt;/strong>&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="http://img.testclass.net/locust_run_fail.png"
 data-srcset="http://img.testclass.net/locust_run_fail.png, http://img.testclass.net/locust_run_fail.png 1.5x, http://img.testclass.net/locust_run_fail.png 2x"
 data-sizes="auto"
 alt="http://img.testclass.net/locust_run_fail.png"
 title="http://img.testclass.net/locust_run_fail.png" />&lt;/p>
&lt;p>至于，我上面的测试脚本为什么为失败，你自个分析一下吧！原因很简单。&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300"
 data-srcset="https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300, https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300 1.5x, https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1513470270416-d3ff6f16b22f?w=300"
 title="课程图片" />&lt;/p></description></item><item><title>（九）Locust 参数化</title><link>https://itest2025.pages.dev/tutorials/38-009-%E4%B9%9Dlocust-%E5%8F%82%E6%95%B0%E5%8C%96/</link><pubDate>Mon, 16 Oct 2017 07:00:11 +0800</pubDate><guid>https://itest2025.pages.dev/tutorials/38-009-%E4%B9%9Dlocust-%E5%8F%82%E6%95%B0%E5%8C%96/</guid><description>&lt;p>使用 LoadRunner 和 JMeter 的同学都知道，性能测试工具设置参数化颇为麻烦，但对于 Python 来说，生成点数据再简单不过了。&lt;/p>
&lt;h4 id="参数化系统登录">参数化系统登录&lt;/h4>
&lt;hr>
&lt;p>这里以某系统登录为例，简单介绍登录用户名密码的参数化实现&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">locust&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">TaskSet&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">random&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">randint&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Web性能测试&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">UserBehavior&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TaskSet&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">on_start&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">login&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 随机返回登录用户&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">login_user&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">users&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;user1&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">123456&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;user2&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">123123&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s2">&amp;#34;user3&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">111222&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">randint&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">username&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;user&amp;#34;&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nb">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">password&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">users&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">username&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">password&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@task&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">def&lt;/span> &lt;span class="nf">login&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">username&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">password&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">login_user&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="bp">self&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">client&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">post&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;/login_action&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;username&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">username&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;password&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">password&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">User&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">HttpLocust&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">task_set&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">UserTask&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">min_wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">host&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;http://www.xxx.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>创建 login_user() 方法，定义登录字典 users , 通过randint 随机获取字典中的用户数据。&lt;/p>
&lt;p>在 login() 登录任务中，调用 login_user() 方法实现 随机用户的登录。&lt;/p>
&lt;p>关于参数化方式很多，这里起一个抛砖引玉作用。&lt;/p>
&lt;hr>
&lt;p>&lt;font color="red">关于 Locust 工具就介绍到这里，能否把 Locust 在工作中用好，取决于你对性能测试业务的理解，其次是灵活的运行 python 语言。&lt;/font>&lt;/p>
&lt;p>原始封面&lt;/p>
&lt;p>&lt;img
 class="lazyload"
 src="https://itest2025.pages.dev/svg/loading.min.svg"
 data-src="https://images.unsplash.com/photo-1507679799987-c73779587ccf?w=300"
 data-srcset="https://images.unsplash.com/photo-1507679799987-c73779587ccf?w=300, https://images.unsplash.com/photo-1507679799987-c73779587ccf?w=300 1.5x, https://images.unsplash.com/photo-1507679799987-c73779587ccf?w=300 2x"
 data-sizes="auto"
 alt="https://images.unsplash.com/photo-1507679799987-c73779587ccf?w=300"
 title="课程图片" />&lt;/p></description></item></channel></rss>