如果某些任务失败,是否可以阻止在蝗虫TaskSequence中执行其他任务?

时间:2020-04-17 07:50:36

标签: locust

例如,我有以下课程。如果未执行get_entity任务,如何防止执行create_entity任务?

class MyTaskSequence(TaskSequence):

    @seq_task(1)
    def create_entity(self):
        self.round += 1
        with self.client.post('/entities', json={}, catch_response=True) as resp:
            if resp.status_code != HTTPStatus.CREATED:
                resp.failure()
                # how to stop other tasks for that run?

        self.entity_id = resp.json()['data']['entity_id']

    @seq_task(2)
    def get_entity(self):
        # It is being always executed, 
        # but it should not be run if create_entity task failed
        resp = self.client.get(f'/entities/{self.entity_id}')
        ...

我在文档中找到了TaskSet.interrupt方法,但不允许取消根TaskSet。我尝试为任务序列创建父TaskSet,因此TaskSet.interrupt可以工作。

class MyTaskSet(TaskSet):
    tasks = {MyTaskSequence: 10}

但是现在我看到在我调用interrupt之后ui中的所有结果都被清除了!

我只需要按此顺序跳过相关任务。我需要结果。

3 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法是使用单个@task,其中包含多个请求。然后,如果请求失败,只需在resp.failure()之后执行return

答案 1 :(得分:0)

self.interrupt()可能是您想要的吗?

请参阅https://docs.locust.io/en/latest/writing-a-locustfile.html#interrupting-a-taskset以供参考。

答案 2 :(得分:0)

为什么不使用on_start(self):,只要它在蝗虫创建时就运行一次,它可以设置一个可以检查蝗虫是否执行任务的全局变量

class MyTaskSequence(TaskSequence):
    entity_created = false

    def on_start(self):
        self.round += 1
        with self.client.post('/entities', json={}, catch_response=True) as resp:
            if resp.status_code != HTTPStatus.CREATED:
                self.entity_created = true
                resp.failure()

        self.entity_id = resp.json()['data']['entity_id']

    @seq_task(2)
    def get_entity(self):
        if self.entity_created:
            resp = self.client.get(f'/entities/{self.entity_id}')
            ...