Reputation: 123
I have a question about Locust. I wrote simple script just to check if Locust work. It should check if I can login to app which I'm testing with phone number and password. I start it with command: locust -f LM.py --host=https://api... <-address of api to login
import random, json
from locust import HttpUser, task, between, TaskSet, User
class UserBehavior(User):
def __init__(self, parent):
super(UserBehavior, self).__init__(parent)
self.token = ""
self.headers = {}
def on_start(self):
self.token = self.login()
self.headers = {'Authorization': 'Token ' + self.token}
def login(self):
response = self.client.post("/v1/auth/login", data={'phoneNumber': '+666000666', 'password': 'dupadupa'})
@task
def index(self):
self.client.get("/v1/me/profile", headers=self.headers)
class WebsiteUser(HttpUser):
task_set = UserBehavior
min_wait = 5000
max_wait = 9000
but when i run this i have:
[2020-07-07 00:39:53,931] DESKTOP-2JQB2EC/WARNING/locust.main: System open file limit setting is not high enough for load testing, and the OS wouldnt allow locust to increase it by itself. See https://docs.locust.io/en/st
able/installation.html#increasing-maximum-number-of-open-files-limit for more info.
[2020-07-07 00:39:53,932] DESKTOP-2JQB2EC/INFO/locust.main: Starting web interface at http://:8089
[2020-07-07 00:39:53,955] DESKTOP-2JQB2EC/INFO/locust.main: Starting Locust 1.1
[2020-07-07 00:40:06,436] DESKTOP-2JQB2EC/INFO/locust.runners: Hatching and swarming 1 users at the rate 1 users/s (0 users already running)...
[2020-07-07 00:40:06,437] DESKTOP-2JQB2EC/INFO/locust.runners: All users hatched: UserBehavior: 1, WebsiteUser: 0 (0 already running)
Traceback (most recent call last):
File "src\\gevent\\greenlet.py", line 854, in gevent._gevent_cgreenlet.Greenlet.run
File "c:\users\warpath\pycharmprojects\locustlm\venv\lib\site-packages\locust\user\users.py", line 164, in run_user
user.run()
File "c:\users\warpath\pycharmprojects\locustlm\venv\lib\site-packages\locust\user\users.py", line 131, in run
self.on_start()
File "C:\Users\Warpath\PycharmProjects\LocustLM\LM.py", line 13, in on_start
self.token = self.login()
File "C:\Users\Warpath\PycharmProjects\LocustLM\LM.py", line 18, in login
response = self.client.post("/v1/auth/login", data={'phoneNumber': '+666000666', 'password': 'dupadupa'})
File "c:\users\warpath\pycharmprojects\locustlm\venv\lib\site-packages\locust\user\users.py", line 16, in __getattr__
raise LocustError("No client instantiated. Did you intend to inherit from HttpUser?")
locust.exception.LocustError: No client instantiated. Did you intend to inherit from HttpUser?
2020-07-06T22:40:06Z <Greenlet at 0x215dca9e048: run_user(<LM.UserBehavior object at 0x00000215DC9F67C8>)> failed with LocustError
Can someone explain me what to do with this error?
Upvotes: 2
Views: 5705
Reputation: 11416
Change
class UserBehavior(User):
to
class UserBehavior(TaskSet):
The way your code is, you are defining two Users, instead of one User and a TaskSet for that user.
The reson you get that specific exception message is explained by Tylers answer.
Upvotes: 1
Reputation: 1393
I think the error is coming from your using User
instead of HttpUser
in the UserBehavior
class. See the quickstart.
HttpUser
providesself.client
for each session: "Here we define a class for the users that we will be simulating. It inherits from HttpUser which gives each user a client attribute, which is an instance of HttpSession, that can be used to make HTTP requests to the target system that we want to load test."
Also, you're using Locust 1.1 and task_set
has been removed. From the 1.0 changelog:
"The task_set attribute on the User class (previously Locust class) has been removed. To declare a User class with a single TaskSet one would now use the the tasks attribute instead:"
Try this:
import random, json
from locust import HttpUser, task, between, TaskSet, User
class UserBehavior(HttpUser):
min_wait = 5000
max_wait = 9000
def __init__(self, parent):
super(UserBehavior, self).__init__(parent)
self.token = ""
self.headers = {}
def on_start(self):
self.token = self.login()
self.headers = {'Authorization': 'Token ' + self.token}
def login(self):
response = self.client.post("/v1/auth/login", data={'phoneNumber': '+666000666', 'password': 'dupadupa'})
@task
def index(self):
self.client.get("/v1/me/profile", headers=self.headers)
Upvotes: 1