在我的场景中,我正在运行没有Web UI的Locust。我正在使用的命令是
Private Sub deleteMvmtCmndButt_Click()
If movementCounter > 0 Then
With Me.Controls
.Remove "RepsTextBox" & movementCounter
.Remove "MovementComboBox" & movementCounter
.Remove "WeightTextBox" & movementCounter
End With
movementCounter = movementCounter - 1
End If
End Sub
这对应于每秒孵化4个用户,总共20个用户。
我的目标是让20个蝗虫用户中的每一个都执行一个任务,我希望蝗虫运行完成并在最后一个用户(第20个用户)的任务完成时退出。收集的统计信息应仅包括与每个任务相关的响应时间。
在这种情况下,已确定5个任务(用户场景),这些任务可以与用户随机关联:
locust -f my_locust_file --no_web -c 20 -r 4 # as a hack I add -t 10s
每个任务(用户方案)对应于应按顺序加载的3或4页的不同序列。由2页组成的经过净化和简化的示例序列为:
class UserScenarios(TaskSet):
tasks = [Sequence_One, ServerSequence, Components_Sequence, Embedded_Sequence, Connectivity_Sequence]
class MyLocust(HttpLocust):
def __init__(self):
super().__init__()
MyLocust.counter += 1
print(f"Counter = {MyLocust.counter}")
counter = 0
task_set = UserScenarios
wait_time = between(1, 1)
host = 'https://*****.com'
在第20个(第n个)用户任务完成之后,是否可以停止测试?例如,如果每个任务访问4页,我希望在发出20 * 4 = 80页的请求后终止测试。实际上,作为此测试的一部分,总共只能进行80个页面请求。
我在此测试中的经验是,在最后一个用户任务完成后,将继续发出页面请求,直到我手动停止测试或使用时间限制,该时间限制比任务实际需要完成的时间更长。
答案 0 :(得分:3)
这实际上是可能的!虽然没有记录在案,但至少在我能找到的任何地方,可以通过致电来停止蝗虫 提高StopLocust()
在提供的方案中,每个任务都是一个TaskSequence类。为了在执行单个任务后退出蝗虫,您将需要向整个类添加另一个步骤(函数),以调用StopLocust()。我在下面提供了一个示例-
class Scenario(TaskSequence):
@seq_task(1)
def task_1(self):
self.client.get("/going_somewhere")
@seq_task(2)
def task_2(self):
self.client.get("/going_somewhere_else")
@seq_task(3)
def done(self):
raise StopLocust()
默认情况下,蝗虫设置为永不结束,并将连续从提供给它的可用任务集中选择任务。提供抬高StopLocust()将告诉当前用户(Locust)停止,并且在到达当前任务结束时不再选择任务。
答案 1 :(得分:1)
我用的是locust 1.3+ StopLocust() 已弃用
我的框架为每个用户创建凭据和支持变量的元组列表。我已将所有用户凭据、令牌、支持文件名等存储在这些元组中作为列表的一部分。 (其实是在启动 locust 之前自动完成的)
我将该列表导入 locustfile
# creds is created before running locust file and can be stored outside or part of locust # file
creds = [('demo_user1', 'pass1', 'lnla'),
('demo_user2', 'pass2', 'taam9'),
('demo_user3', 'pass3', 'wevee'),
('demo_user4', 'pass4', 'avwew')]
class RegisteredUser(SequentialTaskSet)
def on_start(self):
self.credentials = creds.pop()
@task
def task_one_name(self):
task_one_commands
@task
def task_two_name(self):
task_two_commands
@task
def stop(self):
if len(creds) == 0:
self.user.environment.reached_end = True
self.user.environment.runner.quit()
class ApiUser(HttpUser):
tasks = [RegisteredUser]
host = 'hosturl'
我在任务中使用 self.credentials。 我在班级中创建了 stop 函数。
另外,观察 RegisteredUser 继承自 SequentialTaskSet 以按顺序运行所有任务。