使用PySurge在Python中快速轻松地编写小型负载测试
项目描述
PySurge
拥有现有的Python代码?想快速用它来设置一些简单的性能测试?试试PySurge,这是一个基于Python的工具,允许您快速在Python中编写简单的性能测试。
示例
查看此项目的示例,了解如何快速配置和执行简单的HTTP负载测试。
安装
该项目可在PyPI上获得
pip install pysurge
在Python中进行性能测试...?
是的,Python在并发和扩展方面有其局限性。然而,有时您不需要比Python提供的更多扩展。这尤其适用于测试基于云的应用程序,这些应用程序“扩展”(即,在需求增加时启动更多副本)。可以在单个副本上以较低规模进行负载测试,并将结果外推。
现在有很多复杂性能测试工具,旨在在非常高的扩展级别上对应用程序进行负载测试。该项目旨在为那些不需要大规模扩展的人提供一个“快速且简单”的解决方案。您能实现的扩展当然受测试需求、Python的并发缺点(即GIL)和您的硬件规格(CPU核心数是一个关键因素)的限制。
许多测试工程师已经编写了Python代码。该项目的目标是防止工程师需要大量重写他们的逻辑,才能在更高的扩展级别上运行。如果代码是线程安全的,则可以使用PySurge
导入和并发执行。
PySurge是如何工作的?
编写TestCase类
测试由测试编写者定义,继承自 pysurge.TestCase
类,并具有以下功能:
startup
和shutdown
—— 这些定义了“会话”级别的设置和清理任务,这些任务将在每个测试用例类中只发生一次。在这里,您还可以定义所有触发的测试实例将共享的变量/函数等。setup
和teardown
—— 定义“测试”级别的设置和清理任务,这些任务将针对每个被触发的唯一测试实例执行。run
—— 定义实际的测试运行逻辑。__init__
也可以定义自定义的 kwargs —— 如果您想稍微调整测试的行为,这非常有用。
测试指标
测试用例类可以存储在名为 self.metrics
的字典中的浮点数/整数指标。例如,您可能希望存储一个指标,每次测试触发时都会跟踪您的服务的“响应时间”。在您的测试的 run
函数中,您可能有如下代码:
start_time = time.time()
do_stuff()
end_time = time.time()
self.metrics['response_time'] = end_time - start_time
在测试运行结束时,存储在每个触发的实例中的指标会被平均并报告。
配置 pysurge 运行
pysurge
使用 YAML 配置文件,该文件定义了
- 您想要运行的测试类
- 触发它们的速率(每秒测试数量)
- 应传递给
TestCase.__init__
的任何 kwargs —— 如果您想同时运行相同的测试类但具有不同的选项,这很有用。
启动运行
您可以使用以下方式启动测试运行:
$ pysurge -c </path/to/config.yaml> -d <run duration in minutes>
运行期间会发生什么?
为了尽可能有效地使用线程池,pysurge
使用 multiprocessing
为您系统上的每个可用 CPU 核心创建一个子进程。每个子进程内为每个 TestClass
创建一个线程池,然后将测试“触发速率”平均分配给每个子进程。例如,如果您定义了一个名为 MyTest
的测试用例,该测试用例应“每秒触发一次”,并且您有 4 个 CPU 核心,以下将发生:
- 将创建四个子进程
- 在每个子进程中创建一个线程池,运行
MyTest
中的代码 - 每个线程池将以“每 4 秒触发一次”的速率触发测试
- 每个子进程将使其测试触发的开始时间错开 1 秒,以使“触发速率”均匀。
一旦测试运行“提升”并且所有线程池都已开始触发,这将导致 MyTest
每秒触发一个实例。
随着您添加更多的测试类,每个子进程中将添加更多的线程池。子进程的数量将保持不变。
由于测试是在线程池中执行的,因此它们不能过于占用 CPU 资源——理想的选择是快速 I/O 绑定测试,与远程 API/服务交互。测试应该注意高效使用 CPU 资源——也就是说,专注于 I/O 绑定任务(如与远程网络服务交互)并记得在循环中“睡眠”,以避免消耗 CPU 周期。
停止运行
您可以发送 SIGINT
/ctrl+C
来提前结束运行。这不会突然结束应用程序,而是触发所有子进程开始干净地关闭。否则,运行将执行运行时指定的 duration
。
查看结果
pysurge
将所有运行线程的日志输出到 stdout
它还会在其运行结束时生成一个基本的报告。
以下示例是针对名为 UploadTest
的测试。配置了两个此测试实例以运行
UploadTest
没有kwargsUploadTest
有 kwargslegacy=True
每次测试运行时,都会存储一个名为 upload->db_time_in_sec
的指标。平均时间会在报告中显示。
2018-09-14 18:51:37,590 MainProcess MainThread INFO ---- Results for test '<UploadTest kwargs={}> -- upload test, legacy: False' ----
2018-09-14 18:51:37,590 MainProcess MainThread INFO >>> Ran for 1849.129022 sec, fired 6988 total tests
2018-09-14 18:51:37,590 MainProcess MainThread INFO >>> Successes: 6987, failures: 1
2018-09-14 18:51:37,591 MainProcess MainThread INFO ---- Metrics for test '<UploadTest kwargs={}> -- upload test, legacy: False' ----
2018-09-14 18:51:37,591 MainProcess MainThread INFO >>> upload->db_time_in_sec: 2.668292
2018-09-14 18:51:37,591 MainProcess MainThread INFO
2018-09-14 18:51:37,591 MainProcess MainThread INFO ---- Results for test '<UploadTest kwargs={'legacy': True}> -- upload test, legacy: True' ----
2018-09-14 18:51:37,591 MainProcess MainThread INFO >>> Ran for 1849.129022 sec, fired 7004 total tests
2018-09-14 18:51:37,591 MainProcess MainThread INFO >>> Successes: 7002, failures: 2
2018-09-14 18:51:37,591 MainProcess MainThread INFO ---- Metrics for test '<UploadTest kwargs={'legacy': True}> -- upload test, legacy: True' ----
2018-09-14 18:51:37,591 MainProcess MainThread INFO >>> upload->db_time_in_sec: 1.025963
2018-09-14 18:51:37,591 MainProcess MainThread INFO
pysurge
不做什么?
- 非常大的规模测试
- 分布式负载测试(在多个主机上编排和运行测试)
- 高级报告
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
构建分发
pysurge-1.0.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 13771b32e9ecc4d51c650bff4bb2842f427c09ca04c4751d23e03c8678084dee |
|
MD5 | fe8bc5318caa7723fc0b3e025aa7a8ec |
|
BLAKE2b-256 | ad33b8ea5748b4757024760aa1962b028dbc11867a1cfced5262ac168906eaf6 |
pysurge-1.0.1-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 420b4ed61564d9e12b0d29aa2cbfee0ed2c1d93ce09ba81a5fecd8ae0efec23a |
|
MD5 | c0a760d2f7013033ef5ac4e81393a552 |
|
BLAKE2b-256 | a6b34eaa825cc7f643b71de5de9113121725016794648538a7de34eda38630fd |