首页 > 解决方案 > 在分布式模式工作者中模仿 test_start test_stop 事件

问题描述

在我的 locustfile 中,我定义了 test_on_start 和 test_on_stop 事件来读取测试所需的文件并在测试结束时在 CSV 中写入详细的统计数据。在分布式模式下运行时,这些事件发生在主节点上,而不是工作节点上。我正在为任务序列中的每个任务组装详细统计信息列表,并在测试结束时在测试停止时编写一个 CSV 文件。我发现this stackoverflow question它引用了设置和拆卸。我将这些添加到我的class User(HttpUser):,但它们似乎没有被执行。

当测试以分布式模式在工作人员上运行时,我如何模拟这些事件?

有没有更好的办法?

我已经在使用用户 on_start 和 on_stop - 我的 on_start 调用一个函数来从列表中选择一个随机用户,该列表是在@events.test_start.add_listener触发时创建的,这只发生在主服务器上而不是工人身上,所以工人没有任何用户登录数据。

每次调用 User on_start 方法时,打开文件、读取文件、随机选择一个用户并关闭它似乎会适得其反。用户 on_start 还设置了迭代列表 [],这是我存储每个任务的时间的地方。

当任务序列完成时,意味着执行了最后一个任务,我执行self.interrupt()which runs on_stop,这是我获取迭代时间的地方,并将它们放入第二个列表中,该列表稍后使用 CSV 模块编写。也许在期间将数据写入 CSV 会更好on_stop

标签: locust

解决方案


单个用户的设置/拆卸已被删除(因为它们令人困惑,因为它是在该用户类的第一个实例上运行的,当人们在该实例上设置属性时,由于后来的实例没有得到这一事实而感到非常困惑) . Tbh,我希望它们刚刚被类方法取代......

不过,用户仍然有 on_start/stop 方法,如果你将它与标志结合起来,它可能会做你想做的事。像这样的东西:

class MyUser(HttpUser):
    stopped = False
... 
    def on_stop(self):
        if not MyUser.stopped:
             MyUser.stopped = True
             # write your csv
             # this doesnt guarantee that all your Users are finished though.

https://docs.locust.io/en/stable/writing-a-locustfile.html#on-start-and-on-stop-methods


推荐阅读