我正在尝试解决两个问题,并检查我的API的性能。
现在,我有一个包含几百万条记录(1行,1条记录)的文件,我需要将它们全部发送到我的API。将整个文件加载到内存中是可行的,即使我更愿意批量加载它。(这是一个问题)
其次,我需要发送X个请求,每个请求都需要有不同的测试数据,因为数据是坐标和路径记录(例如,当您跟踪游乐设施时,类似于strava )。
我试过以块为单位读取文件,但不确定如何将数据传递给该方法。尝试在方法内循环,但失败了,以及Locust自动执行任务。
我在文档中找不到如何改变数据的地方。
我的想法是-从文件中读取1000行。每1000行执行1个请求。阅读下1000行...
只要文件中有行,就执行此操作。
我有这个:
from locust import HttpUser, task, between
test_data_filename = '/Users/i/IdeaProjects/TestIntelliJ/test10.txt'
#loading test data set from .txt file - trying to read here in chunks, but I need single line from a chunk
with open(test_data_filename) as f:
test_data = f.readlines(100)
class HtpAPIUser(HttpUser):
host = 'myserver'
wait_time = between(3,5)
i = 0
# Was thinking of running here the task, but not sure how to do it?
for line in test_data:
test_data_line = line
@task()
# Thought of passing different test data line into the method, but not sure is that the way?
def tele_endpoint(self, test_data_line):
headers = {'Content-Type': 'application/xml'}
response = self.client.post('/push/data/points', data=test_data_line, headers=headers, verify=False)
print(response)发布于 2021-01-23 07:06:53
在任务中从相同的文件句柄中读取新行应该没问题,你不需要自己做缓冲。文件由操作系统和/或python缓冲,因此读取另一行非常快。你可能想看看https://github.com/SvenskaSpel/locust-plugins/blob/master/examples/csvreader_ex.py上的locus-plugins (只是作为一个例子,并不是说它更快或者别的什么)
我认为您应该至少能够处理1000行/秒(可能更多),如果这还不够,您可以考虑拆分文件,并为每个文件运行一个Locust工作进程。
发布于 2021-01-24 01:08:57
您将面临的挑战是,您将有大量的用户需要访问相同的文件和数据。您可能还需要数据是单个用户独占的(不能重用)。使用服务,特别是队列系统,可以很好地做到这一点。
如果您是在云提供商中进行测试,则所有这些云提供商都提供带有HTTP接口的队列服务。以Amazon Simple Queue Service (SQS)为例。您可以从负载生成器中卸载该文件,并在服务中对其进行管理。如果我没记错的话,那么你甚至不会为亚马逊付出任何代价,除非你遇到了大约一百万个队列请求。
如果您是在内部执行此操作,那么像RabbitMQ这样的解决方案非常适合为您的负载生成器提供服务。您希望此队列服务独立于被测应用程序,因此请将其安装在专用主机上。您希望避免使用内部生成器和云队列,因为您将在云提供商内部/外部产生字节成本。
默认情况下,队列服务将为您提供跨虚拟用户的唯一性,更低的开销,而无需将文件加载和访问到本地文件系统(还会拖累负载生成器,数百人争相访问文件),并提供了一个专为多用户访问设计的解决方案。
如果您需要重用数据,则只需将其推送到队列的后面即可。如果您想要自终止测试,那么一旦您的用户由于空队列而无法提取测试数据,则在迭代结束后终止虚拟用户。
https://stackoverflow.com/questions/65847675
复制相似问题