Не удалось остановить тест, @events.test_stop.add_listener саранча

#python #load-testing #locust

Вопрос:

Я не могу остановить тест, если процент сбоев или среднее время отклика превышает заданное в test_stop. Ниже приведен пример кода:-

 @events.test_stop.add_listener
def results(environment, **kw):
    if environment.stats.total.fail_ratio > 0.01:
        logging.error("Test failed due to failure ratio > 1%")
        environment.process_exit_code = 1
    elif environment.stats.total.avg_response_time > 2:
        logging.error("Test failed due to average response time ratio > 200 ms")
        environment.process_exit_code = 1
    elif environment.stats.total.get_response_time_percentile(0.95) > 8:
        logging.error("Test failed due to 95th percentil response time > 800 ms")
        environment.process_exit_code = 1
    else:
        environment.process_exit_code = 0
     


    @task
    def osp_pick(self):
        return super().request(
            name="pick",
            json_file="data/pick.json",
            ssm=self.ssm,
            my_task=self,
           
        )


class StockTransfer(HttpUser):
    host = "https://zz-zz.dev.zz.zz.zz.com"  # Change this
    tasks = [Handler]
 

Я использую приведенную ниже команду для запуска теста с терминала:-

 locust -f --headless -u 1000 -r 100 --run-time 2m
 

Команда работает должным образом, тест выполняется в течение 2 минут, но тест не завершается неудачно, если процент ошибок > 0,01 или среднее время отклика >> 2 сек

Комментарии:

1. Вы проверили, что ваша функция, изменяющая код выхода, запускается? Я бы начал с этого, возможно, заменив ваши if чеки, чтобы просто изменить код выхода. Затем оттуда распечатайте чеки и/или статистику, которая вас интересует, убедившись, что ваши подразделения и все остальное совпадают.

Ответ №1:

Взгляните на саранчу-плагины --check-fail-ratio для проверенного в боях способа достижения этой цели:

https://github.com/SvenskaSpel/locust-plugins#command-line-options

Или, если вы хотите запустить проверку во время фактического теста и прервать ее при сбое, вы можете использовать фоновый зеленый значок:

 def checker(environment):
    while not environment.runner.state in [STATE_STOPPING, STATE_STOPPED, STATE_CLEANUP]:
        time.sleep(1)
        if environment.runner.stats.total.fail_ratio > 0.2:
            logging.info(f"fail ratio was {environment.runner.stats.total.fail_ratio}, quitting")
            environment.process_exit_code = 2
            environment.runner.quit()
            return


@events.init.add_listener
def on_locust_init(environment, **_kwargs):
    if not isinstance(environment.runner, WorkerRunner):
        gevent.spawn(checker, environment)