在蝗虫中将数据从一个任务功能传递到另一个任务功能时出现问题,一个接一个地执行顺序任务
Issue while passing data from one task function to another in locust with sequential task one by one
我们正在尝试实现基于用户场景的负载测试,它基本上在一个 url 中创建一个订单,然后我们必须在下一个 url 中传递订单 ID 以获取状态那个订单。
我们正在为此使用蝗虫顺序任务。正如我们希望它按顺序 运行 一样,第一个请求 -> 第二个请求 -> 第三个请求。我们已经按预期获得响应数据,但我们无法将该变量数据发送到第三个任务以显示订单状态。
import json
from locust import HttpLocust, TaskSet, task, TaskSequence, seq_task
class MyTaskSequence(TaskSequence):
response_data = ""
@seq_task(1)
def index(self):
print("--- First Task")
response = self.client.get("/order/testing-06a5c/")
print(response.status_code)
@seq_task(2)
def get_details(self):
print("--- Second Task")
response = self.client.post(return_data, headers={"authority": "staging.domain.com", "referer":"https://staging.domain.com/"})
print(response.status_code)
response_data = json.loads(response.text)
print(response_data["details"]["claim_uri"])
self.response_data
def on_start(self):
self.get_details()
@seq_task(3)
def post_details(self):
print(self.get_details())
print("-- Third Task", self.response_data)
#return_data = self.response_data["details"]["claim_uri"]
#response = self.client.post(return_data, headers={"authority": "staging.domain.com", "referer":"https://staging.domain.com/"})
#print(response.text)
class MyLocust(HttpLocust):
task_set = MyTaskSequence
min_wait = 5000
max_wait = 15000
host = 'https://staging.domain.com'
输出:
[2018-11-19 19:24:19,784] system.local/INFO/stdout:
[2018-11-19 19:24:19,784] system.local/INFO/stdout: --- First Task
[2018-11-19 19:24:19,785] system.local/INFO/stdout:
[2018-11-19 19:24:20,235] system.local/INFO/stdout: 200
[2018-11-19 19:24:20,235] system.local/INFO/stdout:
[2018-11-19 19:24:29,372] system.local/INFO/stdout: --- Second Task
[2018-11-19 19:24:29,373] system.local/INFO/stdout:
[2018-11-19 19:24:29,653] system.local/INFO/stdout: 200
[2018-11-19 19:24:29,654] system.local/INFO/stdout:
[2018-11-19 19:24:29,654] system.local/INFO/stdout: /payment/initiate/claim/bc6d5024-f608-41af-8e78-191798c31a69/
[2018-11-19 19:24:29,654] system.local/INFO/stdout:
[2018-11-19 19:24:37,089] system.local/INFO/stdout: --- Second Task
[2018-11-19 19:24:37,089] system.local/INFO/stdout:
[2018-11-19 19:24:37,367] system.local/INFO/stdout: 200
[2018-11-19 19:24:37,367] system.local/INFO/stdout:
[2018-11-19 19:24:37,367] system.local/INFO/stdout: /payment/initiate/claim/72217a35-01fc-488e-885e-aea81a57a463/
[2018-11-19 19:24:37,368] system.local/INFO/stdout:
[2018-11-19 19:24:37,368] system.local/INFO/stdout: None
[2018-11-19 19:24:37,368] system.local/INFO/stdout:
[2018-11-19 19:24:37,368] system.local/INFO/stdout: ('-- Third Task', '')
[2018-11-19 19:24:37,368] system.local/INFO/stdout:
^C[2018-11-19 19:24:40,598] system.local/ERROR/stderr: KeyboardInterrupt
我们想将 response_data["details"]["claim_uri"]
变量传递给@seq_task(3)。这样我们就可以形成一个动态目标domain.com/response_data["details"]["claim_uri"]
。这个变量是string类型的,每次第三个任务调用的时候都要单独传入
我们尝试了 this 方法,但在输出中得到 None。
有什么遗漏的吗?
问题出在变量响应数据上。变量的范围是局部的,而在没有自我的情况下调用它。
下面的代码有效。
@seq_task(2)
def get_details(self):
<-- function data -->
self.response_data = json.loads(response.text)
我们正在尝试实现基于用户场景的负载测试,它基本上在一个 url 中创建一个订单,然后我们必须在下一个 url 中传递订单 ID 以获取状态那个订单。
我们正在为此使用蝗虫顺序任务。正如我们希望它按顺序 运行 一样,第一个请求 -> 第二个请求 -> 第三个请求。我们已经按预期获得响应数据,但我们无法将该变量数据发送到第三个任务以显示订单状态。
import json
from locust import HttpLocust, TaskSet, task, TaskSequence, seq_task
class MyTaskSequence(TaskSequence):
response_data = ""
@seq_task(1)
def index(self):
print("--- First Task")
response = self.client.get("/order/testing-06a5c/")
print(response.status_code)
@seq_task(2)
def get_details(self):
print("--- Second Task")
response = self.client.post(return_data, headers={"authority": "staging.domain.com", "referer":"https://staging.domain.com/"})
print(response.status_code)
response_data = json.loads(response.text)
print(response_data["details"]["claim_uri"])
self.response_data
def on_start(self):
self.get_details()
@seq_task(3)
def post_details(self):
print(self.get_details())
print("-- Third Task", self.response_data)
#return_data = self.response_data["details"]["claim_uri"]
#response = self.client.post(return_data, headers={"authority": "staging.domain.com", "referer":"https://staging.domain.com/"})
#print(response.text)
class MyLocust(HttpLocust):
task_set = MyTaskSequence
min_wait = 5000
max_wait = 15000
host = 'https://staging.domain.com'
输出:
[2018-11-19 19:24:19,784] system.local/INFO/stdout:
[2018-11-19 19:24:19,784] system.local/INFO/stdout: --- First Task
[2018-11-19 19:24:19,785] system.local/INFO/stdout:
[2018-11-19 19:24:20,235] system.local/INFO/stdout: 200
[2018-11-19 19:24:20,235] system.local/INFO/stdout:
[2018-11-19 19:24:29,372] system.local/INFO/stdout: --- Second Task
[2018-11-19 19:24:29,373] system.local/INFO/stdout:
[2018-11-19 19:24:29,653] system.local/INFO/stdout: 200
[2018-11-19 19:24:29,654] system.local/INFO/stdout:
[2018-11-19 19:24:29,654] system.local/INFO/stdout: /payment/initiate/claim/bc6d5024-f608-41af-8e78-191798c31a69/
[2018-11-19 19:24:29,654] system.local/INFO/stdout:
[2018-11-19 19:24:37,089] system.local/INFO/stdout: --- Second Task
[2018-11-19 19:24:37,089] system.local/INFO/stdout:
[2018-11-19 19:24:37,367] system.local/INFO/stdout: 200
[2018-11-19 19:24:37,367] system.local/INFO/stdout:
[2018-11-19 19:24:37,367] system.local/INFO/stdout: /payment/initiate/claim/72217a35-01fc-488e-885e-aea81a57a463/
[2018-11-19 19:24:37,368] system.local/INFO/stdout:
[2018-11-19 19:24:37,368] system.local/INFO/stdout: None
[2018-11-19 19:24:37,368] system.local/INFO/stdout:
[2018-11-19 19:24:37,368] system.local/INFO/stdout: ('-- Third Task', '')
[2018-11-19 19:24:37,368] system.local/INFO/stdout:
^C[2018-11-19 19:24:40,598] system.local/ERROR/stderr: KeyboardInterrupt
我们想将 response_data["details"]["claim_uri"]
变量传递给@seq_task(3)。这样我们就可以形成一个动态目标domain.com/response_data["details"]["claim_uri"]
。这个变量是string类型的,每次第三个任务调用的时候都要单独传入
我们尝试了 this 方法,但在输出中得到 None。
有什么遗漏的吗?
问题出在变量响应数据上。变量的范围是局部的,而在没有自我的情况下调用它。
下面的代码有效。
@seq_task(2)
def get_details(self):
<-- function data -->
self.response_data = json.loads(response.text)