如果测试先决条件失败,完全退出蝗虫进程的最干净方法是什么?

What is the cleanest to completely exit a locust process if test prerequisites fail?

我有一个 'on_test_start' 挂钩,可以在测试开始前测试一些环境变量是否存在:

@events.test_start.add_listener
def on_test_start(**_kwargs):
    env_vars_present = check_vars.check_existence_of_env_vars(["VAR1", "VAR2"])
    if not env_vars_present:
        sys.exit()

这行得通,但我不喜欢使用 sys.exit(),这是一种相当肮脏的退出进程的方式。有更好的选择吗?我试过提出异常,但这并不能阻止 运行 用户。我也试过 environment.runner.quit()。这将退出 运行ners,但蝗虫进程会继续,直到达到 运行 时间限制。如果某些先决条件检查失败,退出流程的最简洁方法是什么?谢谢!

你对 environment.runner.quit() 的想法是正确的,你只需要在 master 上发生这种情况,而不是 workers。你需要workers将失败传达给master然后master可以退出,这将停止master和所有worker。

您可以使用 request with a custom Name you could check a failure for, report_to_master 等其他事件挂钩,将一些额外数据添加到发送给主服务器的报告有效负载中,您可以检查其是否存在并继续退出。您将在 master 上使用 worker_report 来触发您的检查并退出。这样做可以帮助您在任何测试输出数据中获得这些步骤,这样您就可以清楚地看到问题所在,而无需进行大量自定义报告工作。

或者沿着相同的路线,但可能稍微更简洁和更直接的是使用 communication between nodes 让工作人员直接向 master 发送消息,并在收到该消息时让 master 退出。代码看起来像这样:

@events.init.add_listener
def quit_env_failure_message(environment, **_kwargs):
    global ENV
    ENV = environment
    if isinstance(environment.runner, MasterRunner):
        environment.runner.register_message('env_failure', quit_on_env_failure)


def quit_on_env_failure(msg, **kwargs):
    ENV.runner.quit()


@events.test_start.add_listener
def on_test_start(**_kwargs):
    env_vars_present = check_vars.check_existence_of_env_vars(["VAR1", "VAR2"])
    if not env_vars_present:
        environment.runner.send_message('env_failure')

这样做,您可能需要做额外的工作才能获得您想要的任何类型的测试结果报告。那很可能会进入 quit_on_env_failure().