locust 2.29.2.dev34__py3-none-any.whl → 2.29.2.dev45__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- locust/_version.py +6 -2
- locust/contrib/fasthttp.py +1 -1
- locust/dispatch.py +7 -6
- locust/main.py +0 -1
- {locust-2.29.2.dev34.dist-info → locust-2.29.2.dev45.dist-info}/METADATA +31 -26
- locust-2.29.2.dev45.dist-info/RECORD +49 -0
- locust-2.29.2.dev45.dist-info/WHEEL +4 -0
- locust-2.29.2.dev45.dist-info/entry_points.txt +3 -0
- locust/test/__init__.py +0 -15
- locust/test/fake_module1_for_env_test.py +0 -7
- locust/test/fake_module2_for_env_test.py +0 -7
- locust/test/mock_locustfile.py +0 -56
- locust/test/mock_logging.py +0 -28
- locust/test/test_debugging.py +0 -39
- locust/test/test_dispatch.py +0 -4170
- locust/test/test_env.py +0 -283
- locust/test/test_fasthttp.py +0 -785
- locust/test/test_http.py +0 -325
- locust/test/test_interruptable_task.py +0 -48
- locust/test/test_load_locustfile.py +0 -228
- locust/test/test_locust_class.py +0 -831
- locust/test/test_log.py +0 -237
- locust/test/test_main.py +0 -2264
- locust/test/test_old_wait_api.py +0 -0
- locust/test/test_parser.py +0 -450
- locust/test/test_runners.py +0 -4476
- locust/test/test_sequential_taskset.py +0 -157
- locust/test/test_stats.py +0 -866
- locust/test/test_tags.py +0 -440
- locust/test/test_taskratio.py +0 -94
- locust/test/test_users.py +0 -69
- locust/test/test_util.py +0 -33
- locust/test/test_wait_time.py +0 -79
- locust/test/test_web.py +0 -1257
- locust/test/test_zmqrpc.py +0 -58
- locust/test/testcases.py +0 -248
- locust/test/util.py +0 -88
- locust-2.29.2.dev34.dist-info/RECORD +0 -79
- locust-2.29.2.dev34.dist-info/WHEEL +0 -5
- locust-2.29.2.dev34.dist-info/entry_points.txt +0 -2
- locust-2.29.2.dev34.dist-info/top_level.txt +0 -1
- {locust-2.29.2.dev34.dist-info → locust-2.29.2.dev45.dist-info}/LICENSE +0 -0
locust/test/test_locust_class.py
DELETED
@@ -1,831 +0,0 @@
|
|
1
|
-
from locust import HttpUser, TaskSet, User, constant, task
|
2
|
-
from locust.env import Environment
|
3
|
-
from locust.exception import (
|
4
|
-
CatchResponseError,
|
5
|
-
InterruptTaskSet,
|
6
|
-
RescheduleTask,
|
7
|
-
RescheduleTaskImmediately,
|
8
|
-
ResponseError,
|
9
|
-
StopUser,
|
10
|
-
)
|
11
|
-
|
12
|
-
import gevent
|
13
|
-
from gevent import sleep
|
14
|
-
from gevent.pool import Group
|
15
|
-
|
16
|
-
from .testcases import LocustTestCase, WebserverTestCase
|
17
|
-
|
18
|
-
|
19
|
-
class TestTaskSet(LocustTestCase):
|
20
|
-
def setUp(self):
|
21
|
-
super().setUp()
|
22
|
-
|
23
|
-
class MyUser(User):
|
24
|
-
host = "127.0.0.1"
|
25
|
-
|
26
|
-
self.locust = MyUser(self.environment)
|
27
|
-
|
28
|
-
def test_task_ratio(self):
|
29
|
-
t1 = lambda l: None
|
30
|
-
t2 = lambda l: None
|
31
|
-
|
32
|
-
class MyTasks(TaskSet):
|
33
|
-
tasks = {t1: 5, t2: 2}
|
34
|
-
|
35
|
-
l = MyTasks(self.locust)
|
36
|
-
|
37
|
-
t1_count = len([t for t in l.tasks if t == t1])
|
38
|
-
t2_count = len([t for t in l.tasks if t == t2])
|
39
|
-
|
40
|
-
self.assertEqual(t1_count, 5)
|
41
|
-
self.assertEqual(t2_count, 2)
|
42
|
-
|
43
|
-
def test_tasks_missing_gives_user_friendly_exception(self):
|
44
|
-
class MyTasks(TaskSet):
|
45
|
-
tasks = None
|
46
|
-
|
47
|
-
class MyUser(User):
|
48
|
-
wait_time = constant(0.5)
|
49
|
-
tasks = [MyTasks]
|
50
|
-
|
51
|
-
l = MyTasks(MyUser(self.environment))
|
52
|
-
self.assertRaisesRegex(Exception, "No tasks defined on MyTasks.*", l.run)
|
53
|
-
l.tasks = []
|
54
|
-
self.assertRaisesRegex(Exception, "No tasks defined on MyTasks.*", l.run)
|
55
|
-
MyTasks.task = object()
|
56
|
-
self.assertRaisesRegex(Exception, ".*but you have set a 'task' attribute.*", l.run)
|
57
|
-
|
58
|
-
def test_tasks_missing_from_user_gives_user_friendly_exception(self):
|
59
|
-
class MyUser(User):
|
60
|
-
wait_time = constant(0.5)
|
61
|
-
|
62
|
-
l = MyUser(self.environment)
|
63
|
-
self.assertRaisesRegex(Exception, "No tasks defined on MyUser.*", l.run)
|
64
|
-
MyUser.task = object()
|
65
|
-
self.assertRaisesRegex(Exception, ".*but you have set a 'task' attribute.*", l.run)
|
66
|
-
|
67
|
-
def test_task_decorator_ratio(self):
|
68
|
-
t1 = lambda l: None
|
69
|
-
t2 = lambda l: None
|
70
|
-
|
71
|
-
class MyTasks(TaskSet):
|
72
|
-
tasks = {t1: 5, t2: 2}
|
73
|
-
host = ""
|
74
|
-
|
75
|
-
@task(3)
|
76
|
-
def t3(self):
|
77
|
-
pass
|
78
|
-
|
79
|
-
@task(13)
|
80
|
-
def t4(self):
|
81
|
-
pass
|
82
|
-
|
83
|
-
l = MyTasks(self.locust)
|
84
|
-
|
85
|
-
t1_count = len([t for t in l.tasks if t == t1])
|
86
|
-
t2_count = len([t for t in l.tasks if t == t2])
|
87
|
-
t3_count = len([t for t in l.tasks if t.__name__ == MyTasks.t3.__name__])
|
88
|
-
t4_count = len([t for t in l.tasks if t.__name__ == MyTasks.t4.__name__])
|
89
|
-
|
90
|
-
self.assertEqual(t1_count, 5)
|
91
|
-
self.assertEqual(t2_count, 2)
|
92
|
-
self.assertEqual(t3_count, 3)
|
93
|
-
self.assertEqual(t4_count, 13)
|
94
|
-
|
95
|
-
def test_tasks_on_locust(self):
|
96
|
-
class MyUser(User):
|
97
|
-
@task(2)
|
98
|
-
def t1(self):
|
99
|
-
pass
|
100
|
-
|
101
|
-
@task(3)
|
102
|
-
def t2(self):
|
103
|
-
pass
|
104
|
-
|
105
|
-
l = MyUser(self.environment)
|
106
|
-
self.assertEqual(2, len([t for t in l.tasks if t.__name__ == MyUser.t1.__name__]))
|
107
|
-
self.assertEqual(3, len([t for t in l.tasks if t.__name__ == MyUser.t2.__name__]))
|
108
|
-
|
109
|
-
def test_tasks_on_abstract_locust(self):
|
110
|
-
class AbstractUser(User):
|
111
|
-
abstract = True
|
112
|
-
|
113
|
-
@task(2)
|
114
|
-
def t1(self):
|
115
|
-
pass
|
116
|
-
|
117
|
-
class MyUser(AbstractUser):
|
118
|
-
@task(3)
|
119
|
-
def t2(self):
|
120
|
-
pass
|
121
|
-
|
122
|
-
l = MyUser(self.environment)
|
123
|
-
self.assertEqual(2, len([t for t in l.tasks if t.__name__ == MyUser.t1.__name__]))
|
124
|
-
self.assertEqual(3, len([t for t in l.tasks if t.__name__ == MyUser.t2.__name__]))
|
125
|
-
|
126
|
-
def test_taskset_on_abstract_locust(self):
|
127
|
-
v = [0]
|
128
|
-
|
129
|
-
class AbstractUser(User):
|
130
|
-
abstract = True
|
131
|
-
|
132
|
-
@task
|
133
|
-
class task_set(TaskSet):
|
134
|
-
@task
|
135
|
-
def t1(self):
|
136
|
-
v[0] = 1
|
137
|
-
raise StopUser()
|
138
|
-
|
139
|
-
class MyUser(AbstractUser):
|
140
|
-
pass
|
141
|
-
|
142
|
-
l = MyUser(self.environment)
|
143
|
-
# check that the User can be run
|
144
|
-
l.run()
|
145
|
-
self.assertEqual(1, v[0])
|
146
|
-
|
147
|
-
def test_task_decorator_on_taskset(self):
|
148
|
-
state = [0]
|
149
|
-
|
150
|
-
class MyUser(User):
|
151
|
-
@task
|
152
|
-
def t1(self):
|
153
|
-
pass
|
154
|
-
|
155
|
-
@task
|
156
|
-
class MyTaskSet(TaskSet):
|
157
|
-
@task
|
158
|
-
def subtask(self):
|
159
|
-
state[0] = 1
|
160
|
-
raise StopUser()
|
161
|
-
|
162
|
-
self.assertEqual([MyUser.t1, MyUser.MyTaskSet], MyUser.tasks)
|
163
|
-
MyUser(self.environment).run()
|
164
|
-
self.assertEqual(1, state[0])
|
165
|
-
|
166
|
-
def test_on_start(self):
|
167
|
-
class MyTasks(TaskSet):
|
168
|
-
t1_executed = False
|
169
|
-
t2_executed = False
|
170
|
-
|
171
|
-
def on_start(self):
|
172
|
-
self.t1()
|
173
|
-
|
174
|
-
def t1(self):
|
175
|
-
self.t1_executed = True
|
176
|
-
|
177
|
-
@task
|
178
|
-
def t2(self):
|
179
|
-
self.t2_executed = True
|
180
|
-
raise InterruptTaskSet(reschedule=False)
|
181
|
-
|
182
|
-
l = MyTasks(self.locust)
|
183
|
-
self.assertRaises(RescheduleTask, lambda: l.run())
|
184
|
-
self.assertTrue(l.t1_executed)
|
185
|
-
self.assertTrue(l.t2_executed)
|
186
|
-
|
187
|
-
def test_on_stop_interrupt(self):
|
188
|
-
class MyTasks(TaskSet):
|
189
|
-
t2_executed = False
|
190
|
-
on_stop_executed = False
|
191
|
-
|
192
|
-
def on_stop(self):
|
193
|
-
self.on_stop_executed = True
|
194
|
-
|
195
|
-
@task
|
196
|
-
def t2(self):
|
197
|
-
self.t2_executed = True
|
198
|
-
self.interrupt(reschedule=False)
|
199
|
-
|
200
|
-
ts = MyTasks(self.locust)
|
201
|
-
self.assertRaises(RescheduleTask, lambda: ts.run())
|
202
|
-
self.assertTrue(ts.t2_executed)
|
203
|
-
self.assertTrue(ts.on_stop_executed)
|
204
|
-
|
205
|
-
def test_on_stop_interrupt_reschedule(self):
|
206
|
-
class MyTasks(TaskSet):
|
207
|
-
t2_executed = False
|
208
|
-
on_stop_executed = False
|
209
|
-
|
210
|
-
def on_stop(self):
|
211
|
-
self.on_stop_executed = True
|
212
|
-
|
213
|
-
@task
|
214
|
-
def t2(self):
|
215
|
-
self.t2_executed = True
|
216
|
-
self.interrupt(reschedule=True)
|
217
|
-
|
218
|
-
ts = MyTasks(self.locust)
|
219
|
-
self.assertRaises(RescheduleTaskImmediately, lambda: ts.run())
|
220
|
-
self.assertTrue(ts.t2_executed)
|
221
|
-
self.assertTrue(ts.on_stop_executed)
|
222
|
-
|
223
|
-
def test_on_stop_when_locust_stops(self):
|
224
|
-
class MyTasks(TaskSet):
|
225
|
-
def on_stop(self):
|
226
|
-
self.user.on_stop_executed = True
|
227
|
-
|
228
|
-
@task
|
229
|
-
def t2(self):
|
230
|
-
self.user.t2_executed = True
|
231
|
-
|
232
|
-
class MyUser(User):
|
233
|
-
t2_executed = False
|
234
|
-
on_stop_executed = False
|
235
|
-
|
236
|
-
tasks = [MyTasks]
|
237
|
-
wait_time = constant(0.1)
|
238
|
-
|
239
|
-
group = Group()
|
240
|
-
user = MyUser(self.environment)
|
241
|
-
user.start(group)
|
242
|
-
sleep(0.05)
|
243
|
-
user.stop()
|
244
|
-
sleep(0)
|
245
|
-
|
246
|
-
self.assertTrue(user.t2_executed)
|
247
|
-
self.assertTrue(user.on_stop_executed)
|
248
|
-
|
249
|
-
def test_schedule_task(self):
|
250
|
-
self.t1_executed = False
|
251
|
-
self.t2_arg = None
|
252
|
-
|
253
|
-
def t1(l):
|
254
|
-
self.t1_executed = True
|
255
|
-
|
256
|
-
def t2(l, arg="t2 argument"):
|
257
|
-
self.t2_arg = arg
|
258
|
-
|
259
|
-
class MyTasks(TaskSet):
|
260
|
-
tasks = [t1, t2]
|
261
|
-
|
262
|
-
taskset = MyTasks(self.locust)
|
263
|
-
taskset.schedule_task(t1)
|
264
|
-
taskset.execute_next_task()
|
265
|
-
self.assertTrue(self.t1_executed)
|
266
|
-
|
267
|
-
taskset.schedule_task(t2)
|
268
|
-
taskset.execute_next_task()
|
269
|
-
self.assertEqual("t2 argument", self.t2_arg)
|
270
|
-
|
271
|
-
def test_schedule_task_bound_method(self):
|
272
|
-
class MyTasks(TaskSet):
|
273
|
-
host = ""
|
274
|
-
|
275
|
-
@task()
|
276
|
-
def t1(self):
|
277
|
-
self.t1_executed = True
|
278
|
-
self.schedule_task(self.t2)
|
279
|
-
|
280
|
-
def t2(self):
|
281
|
-
self.t2_executed = True
|
282
|
-
|
283
|
-
taskset = MyTasks(self.locust)
|
284
|
-
taskset.schedule_task(taskset.get_next_task())
|
285
|
-
taskset.execute_next_task()
|
286
|
-
self.assertTrue(taskset.t1_executed)
|
287
|
-
taskset.execute_next_task()
|
288
|
-
self.assertTrue(taskset.t2_executed)
|
289
|
-
|
290
|
-
def test_taskset_inheritance(self):
|
291
|
-
def t1(l):
|
292
|
-
pass
|
293
|
-
|
294
|
-
class MyBaseTaskSet(TaskSet):
|
295
|
-
tasks = [t1]
|
296
|
-
host = ""
|
297
|
-
|
298
|
-
class MySubTaskSet(MyBaseTaskSet):
|
299
|
-
@task
|
300
|
-
def t2(self):
|
301
|
-
pass
|
302
|
-
|
303
|
-
l = MySubTaskSet(self.locust)
|
304
|
-
self.assertEqual(2, len(l.tasks))
|
305
|
-
self.assertEqual([t1, MySubTaskSet.t2], l.tasks)
|
306
|
-
|
307
|
-
def test_task_decorator_with_or_without_argument(self):
|
308
|
-
class MyTaskSet(TaskSet):
|
309
|
-
@task
|
310
|
-
def t1(self):
|
311
|
-
pass
|
312
|
-
|
313
|
-
taskset = MyTaskSet(self.locust)
|
314
|
-
self.assertEqual(len(taskset.tasks), 1)
|
315
|
-
|
316
|
-
class MyTaskSet2(TaskSet):
|
317
|
-
@task()
|
318
|
-
def t1(self):
|
319
|
-
pass
|
320
|
-
|
321
|
-
taskset = MyTaskSet2(self.locust)
|
322
|
-
self.assertEqual(len(taskset.tasks), 1)
|
323
|
-
|
324
|
-
class MyTaskSet3(TaskSet):
|
325
|
-
@task(3)
|
326
|
-
def t1(self):
|
327
|
-
pass
|
328
|
-
|
329
|
-
taskset = MyTaskSet3(self.locust)
|
330
|
-
self.assertEqual(len(taskset.tasks), 3)
|
331
|
-
|
332
|
-
def test_wait_function(self):
|
333
|
-
class MyTaskSet(TaskSet):
|
334
|
-
a = 1
|
335
|
-
b = 2
|
336
|
-
wait_time = lambda self: 1 + (self.b - self.a)
|
337
|
-
|
338
|
-
taskset = MyTaskSet(self.locust)
|
339
|
-
self.assertEqual(taskset.wait_time(), 2.0)
|
340
|
-
|
341
|
-
def test_sub_taskset(self):
|
342
|
-
class MySubTaskSet(TaskSet):
|
343
|
-
constant(1)
|
344
|
-
|
345
|
-
@task()
|
346
|
-
def a_task(self):
|
347
|
-
self.user.sub_locust_task_executed = True
|
348
|
-
self.interrupt()
|
349
|
-
|
350
|
-
class MyTaskSet(TaskSet):
|
351
|
-
tasks = [MySubTaskSet]
|
352
|
-
|
353
|
-
self.sub_locust_task_executed = False
|
354
|
-
loc = MyTaskSet(self.locust)
|
355
|
-
loc.schedule_task(loc.get_next_task())
|
356
|
-
self.assertRaises(RescheduleTaskImmediately, lambda: loc.execute_next_task())
|
357
|
-
self.assertTrue(self.locust.sub_locust_task_executed)
|
358
|
-
|
359
|
-
def test_sub_taskset_tasks_decorator(self):
|
360
|
-
class MyTaskSet(TaskSet):
|
361
|
-
@task
|
362
|
-
class MySubTaskSet(TaskSet):
|
363
|
-
wait_time = constant(0.001)
|
364
|
-
|
365
|
-
@task()
|
366
|
-
def a_task(self):
|
367
|
-
self.user.sub_locust_task_executed = True
|
368
|
-
self.interrupt()
|
369
|
-
|
370
|
-
self.sub_locust_task_executed = False
|
371
|
-
loc = MyTaskSet(self.locust)
|
372
|
-
loc.schedule_task(loc.get_next_task())
|
373
|
-
self.assertRaises(RescheduleTaskImmediately, lambda: loc.execute_next_task())
|
374
|
-
self.assertTrue(self.locust.sub_locust_task_executed)
|
375
|
-
|
376
|
-
def test_on_start_interrupt(self):
|
377
|
-
class SubTaskSet(TaskSet):
|
378
|
-
def on_start(self):
|
379
|
-
self.interrupt(reschedule=False)
|
380
|
-
|
381
|
-
class RescheduleSubTaskSet(TaskSet):
|
382
|
-
def on_start(self):
|
383
|
-
self.interrupt(reschedule=True)
|
384
|
-
|
385
|
-
class MyUser(User):
|
386
|
-
host = ""
|
387
|
-
tasks = [SubTaskSet]
|
388
|
-
|
389
|
-
l = MyUser(Environment())
|
390
|
-
task_set = SubTaskSet(l)
|
391
|
-
reschedule_task_set = RescheduleSubTaskSet(l)
|
392
|
-
self.assertRaises(RescheduleTaskImmediately, lambda: reschedule_task_set.run())
|
393
|
-
self.assertRaises(RescheduleTask, lambda: task_set.run())
|
394
|
-
|
395
|
-
def test_parent_attribute(self):
|
396
|
-
from locust.exception import StopUser
|
397
|
-
|
398
|
-
parents = {}
|
399
|
-
|
400
|
-
class SubTaskSet(TaskSet):
|
401
|
-
def on_start(self):
|
402
|
-
parents["sub"] = self.parent
|
403
|
-
|
404
|
-
@task
|
405
|
-
class SubSubTaskSet(TaskSet):
|
406
|
-
def on_start(self):
|
407
|
-
parents["subsub"] = self.parent
|
408
|
-
|
409
|
-
@task
|
410
|
-
def stop(self):
|
411
|
-
raise StopUser()
|
412
|
-
|
413
|
-
class RootTaskSet(TaskSet):
|
414
|
-
tasks = [SubTaskSet]
|
415
|
-
|
416
|
-
class MyUser(User):
|
417
|
-
host = ""
|
418
|
-
tasks = [RootTaskSet]
|
419
|
-
|
420
|
-
l = MyUser(Environment())
|
421
|
-
l.run()
|
422
|
-
self.assertTrue(isinstance(parents["sub"], RootTaskSet))
|
423
|
-
self.assertTrue(isinstance(parents["subsub"], SubTaskSet))
|
424
|
-
|
425
|
-
def test_user_is_read_only(self):
|
426
|
-
class MyTaskSet(TaskSet):
|
427
|
-
raised_attribute_error = False
|
428
|
-
|
429
|
-
@task
|
430
|
-
def overwrite_user(self):
|
431
|
-
try:
|
432
|
-
self.user = "whatever"
|
433
|
-
except AttributeError:
|
434
|
-
MyTaskSet.raised_attribute_error = True
|
435
|
-
raise StopUser()
|
436
|
-
|
437
|
-
class MyUser(User):
|
438
|
-
host = ""
|
439
|
-
tasks = [MyTaskSet]
|
440
|
-
|
441
|
-
MyUser(Environment()).run()
|
442
|
-
self.assertTrue(MyTaskSet.raised_attribute_error)
|
443
|
-
|
444
|
-
|
445
|
-
class TestLocustClass(LocustTestCase):
|
446
|
-
def test_locust_wait(self):
|
447
|
-
log = []
|
448
|
-
|
449
|
-
class TestUser(User):
|
450
|
-
wait_time = constant(0.01)
|
451
|
-
|
452
|
-
@task
|
453
|
-
def t(self):
|
454
|
-
log.append(0)
|
455
|
-
self.wait()
|
456
|
-
log.append(1)
|
457
|
-
raise StopUser()
|
458
|
-
|
459
|
-
l = TestUser(self.environment)
|
460
|
-
l.run()
|
461
|
-
self.assertEqual([0, 1], log)
|
462
|
-
|
463
|
-
def test_locust_on_start(self):
|
464
|
-
class MyUser(User):
|
465
|
-
t1_executed = False
|
466
|
-
t2_executed = False
|
467
|
-
|
468
|
-
def on_start(self):
|
469
|
-
self.t1()
|
470
|
-
|
471
|
-
def t1(self):
|
472
|
-
self.t1_executed = True
|
473
|
-
|
474
|
-
@task
|
475
|
-
def t2(self):
|
476
|
-
self.t2_executed = True
|
477
|
-
raise StopUser()
|
478
|
-
|
479
|
-
l = MyUser(self.environment)
|
480
|
-
l.run()
|
481
|
-
self.assertTrue(l.t1_executed)
|
482
|
-
self.assertTrue(l.t2_executed)
|
483
|
-
|
484
|
-
def test_locust_on_stop(self):
|
485
|
-
class MyUser(User):
|
486
|
-
on_stop_executed = False
|
487
|
-
t2_executed = True
|
488
|
-
|
489
|
-
def on_stop(self):
|
490
|
-
self.on_stop_executed = True
|
491
|
-
|
492
|
-
@task
|
493
|
-
def t2(self):
|
494
|
-
self.t2_executed = True
|
495
|
-
raise StopUser()
|
496
|
-
|
497
|
-
l = MyUser(self.environment)
|
498
|
-
l.run()
|
499
|
-
self.assertTrue(l.on_stop_executed)
|
500
|
-
self.assertTrue(l.t2_executed)
|
501
|
-
|
502
|
-
def test_locust_start(self):
|
503
|
-
class TestUser(User):
|
504
|
-
wait_time = constant(0.1)
|
505
|
-
test_state = 0
|
506
|
-
|
507
|
-
@task
|
508
|
-
def t(self):
|
509
|
-
self.test_state = 1
|
510
|
-
sleep(0.1)
|
511
|
-
raise StopUser()
|
512
|
-
|
513
|
-
group = Group()
|
514
|
-
user = TestUser(self.environment)
|
515
|
-
greenlet = user.start(group)
|
516
|
-
sleep(0)
|
517
|
-
self.assertEqual(1, len(group))
|
518
|
-
self.assertIn(greenlet, group)
|
519
|
-
self.assertEqual(1, user.test_state)
|
520
|
-
timeout = gevent.Timeout(1)
|
521
|
-
timeout.start()
|
522
|
-
group.join()
|
523
|
-
timeout.cancel()
|
524
|
-
|
525
|
-
def test_locust_graceful_stop(self):
|
526
|
-
class TestUser(User):
|
527
|
-
test_state = 0
|
528
|
-
|
529
|
-
@task
|
530
|
-
def t(self):
|
531
|
-
self.test_state = 1
|
532
|
-
sleep(0.1)
|
533
|
-
self.test_state = 2
|
534
|
-
|
535
|
-
group = Group()
|
536
|
-
user = TestUser(self.environment)
|
537
|
-
greenlet = user.start(group)
|
538
|
-
sleep(0)
|
539
|
-
self.assertEqual(1, user.test_state)
|
540
|
-
|
541
|
-
# stop User gracefully
|
542
|
-
user.stop(force=False)
|
543
|
-
sleep(0)
|
544
|
-
# make sure instance is not killed right away
|
545
|
-
self.assertIn(greenlet, group)
|
546
|
-
self.assertEqual(1, user.test_state)
|
547
|
-
sleep(0.2)
|
548
|
-
# check that locust instance has now died and that the task got to finish
|
549
|
-
self.assertEqual(0, len(group))
|
550
|
-
self.assertEqual(2, user.test_state)
|
551
|
-
|
552
|
-
def test_locust_forced_stop(self):
|
553
|
-
class TestUser(User):
|
554
|
-
test_state = 0
|
555
|
-
|
556
|
-
@task
|
557
|
-
def t(self):
|
558
|
-
self.test_state = 1
|
559
|
-
sleep(0.1)
|
560
|
-
self.test_state = 2
|
561
|
-
|
562
|
-
group = Group()
|
563
|
-
user = TestUser(self.environment)
|
564
|
-
greenlet = user.start(group)
|
565
|
-
sleep(0)
|
566
|
-
self.assertIn(greenlet, group)
|
567
|
-
self.assertEqual(1, user.test_state)
|
568
|
-
|
569
|
-
# stop User gracefully
|
570
|
-
user.stop(force=True)
|
571
|
-
sleep(0)
|
572
|
-
# make sure instance is killed right away, and that the task did NOT get to finish
|
573
|
-
self.assertEqual(0, len(group))
|
574
|
-
self.assertEqual(1, user.test_state)
|
575
|
-
|
576
|
-
def test_deprecated_locust_class(self):
|
577
|
-
def test_locust():
|
578
|
-
from locust import Locust
|
579
|
-
|
580
|
-
class MyLocust(Locust):
|
581
|
-
pass
|
582
|
-
|
583
|
-
def test_http_locust():
|
584
|
-
from locust import HttpLocust
|
585
|
-
|
586
|
-
class WebLocust(HttpLocust):
|
587
|
-
pass
|
588
|
-
|
589
|
-
def test_fast_http_locust():
|
590
|
-
from locust.contrib.fasthttp import FastHttpLocust
|
591
|
-
|
592
|
-
class FastLocust(FastHttpLocust):
|
593
|
-
pass
|
594
|
-
|
595
|
-
def assert_importing_locust_class_raises(func):
|
596
|
-
try:
|
597
|
-
func()
|
598
|
-
except ImportError as e:
|
599
|
-
self.assertIn(
|
600
|
-
"Locust class has been renamed to",
|
601
|
-
e.args[0],
|
602
|
-
"ImportError was raised, but with the wrong error message",
|
603
|
-
)
|
604
|
-
else:
|
605
|
-
self.fail("ImportError was not raised")
|
606
|
-
|
607
|
-
assert_importing_locust_class_raises(test_locust)
|
608
|
-
assert_importing_locust_class_raises(test_http_locust)
|
609
|
-
assert_importing_locust_class_raises(test_fast_http_locust)
|
610
|
-
|
611
|
-
|
612
|
-
class TestWebLocustClass(WebserverTestCase):
|
613
|
-
def test_get_request(self):
|
614
|
-
self.response = ""
|
615
|
-
|
616
|
-
def t1(l):
|
617
|
-
self.response = l.client.get("/ultra_fast")
|
618
|
-
|
619
|
-
class MyUser(HttpUser):
|
620
|
-
tasks = [t1]
|
621
|
-
host = "http://127.0.0.1:%i" % self.port
|
622
|
-
|
623
|
-
my_locust = MyUser(self.environment)
|
624
|
-
t1(my_locust)
|
625
|
-
self.assertEqual(self.response.text, "This is an ultra fast response")
|
626
|
-
|
627
|
-
def test_client_request_headers(self):
|
628
|
-
class MyUser(HttpUser):
|
629
|
-
host = "http://127.0.0.1:%i" % self.port
|
630
|
-
|
631
|
-
locust = MyUser(self.environment)
|
632
|
-
self.assertEqual("hello", locust.client.get("/request_header_test", headers={"X-Header-Test": "hello"}).text)
|
633
|
-
|
634
|
-
def test_client_get(self):
|
635
|
-
class MyUser(HttpUser):
|
636
|
-
host = "http://127.0.0.1:%i" % self.port
|
637
|
-
|
638
|
-
locust = MyUser(self.environment)
|
639
|
-
self.assertEqual("GET", locust.client.get("/request_method").text)
|
640
|
-
|
641
|
-
def test_client_get_absolute_url(self):
|
642
|
-
class MyUser(HttpUser):
|
643
|
-
host = "http://127.0.0.1:%i" % self.port
|
644
|
-
|
645
|
-
locust = MyUser(self.environment)
|
646
|
-
self.assertEqual("GET", locust.client.get("http://127.0.0.1:%i/request_method" % self.port).text)
|
647
|
-
|
648
|
-
def test_client_post(self):
|
649
|
-
class MyUser(HttpUser):
|
650
|
-
host = "http://127.0.0.1:%i" % self.port
|
651
|
-
|
652
|
-
locust = MyUser(self.environment)
|
653
|
-
self.assertEqual("POST", locust.client.post("/request_method", {"arg": "hello world"}).text)
|
654
|
-
self.assertEqual("hello world", locust.client.post("/post", {"arg": "hello world"}).text)
|
655
|
-
|
656
|
-
def test_client_put(self):
|
657
|
-
class MyUserHttpUser(HttpUser):
|
658
|
-
host = "http://127.0.0.1:%i" % self.port
|
659
|
-
|
660
|
-
locust = MyUserHttpUser(self.environment)
|
661
|
-
self.assertEqual("PUT", locust.client.put("/request_method", {"arg": "hello world"}).text)
|
662
|
-
self.assertEqual("hello world", locust.client.put("/put", {"arg": "hello world"}).text)
|
663
|
-
|
664
|
-
def test_client_delete(self):
|
665
|
-
class MyUser(HttpUser):
|
666
|
-
host = "http://127.0.0.1:%i" % self.port
|
667
|
-
|
668
|
-
locust = MyUser(self.environment)
|
669
|
-
self.assertEqual("DELETE", locust.client.delete("/request_method").text)
|
670
|
-
self.assertEqual(200, locust.client.delete("/request_method").status_code)
|
671
|
-
|
672
|
-
def test_client_head(self):
|
673
|
-
class MyUser(HttpUser):
|
674
|
-
host = "http://127.0.0.1:%i" % self.port
|
675
|
-
|
676
|
-
locust = MyUser(self.environment)
|
677
|
-
self.assertEqual(200, locust.client.head("/request_method").status_code)
|
678
|
-
|
679
|
-
def test_client_basic_auth(self):
|
680
|
-
class MyUser(HttpUser):
|
681
|
-
host = "http://127.0.0.1:%i" % self.port
|
682
|
-
|
683
|
-
class MyAuthorizedUser(HttpUser):
|
684
|
-
host = "http://locust:menace@127.0.0.1:%i" % self.port
|
685
|
-
|
686
|
-
class MyUnauthorizedUser(HttpUser):
|
687
|
-
host = "http://locust:wrong@127.0.0.1:%i" % self.port
|
688
|
-
|
689
|
-
locust = MyUser(self.environment)
|
690
|
-
unauthorized = MyUnauthorizedUser(self.environment)
|
691
|
-
authorized = MyAuthorizedUser(self.environment)
|
692
|
-
response = authorized.client.get("/basic_auth")
|
693
|
-
self.assertEqual(200, response.status_code)
|
694
|
-
self.assertEqual("Authorized", response.text)
|
695
|
-
self.assertEqual(401, locust.client.get("/basic_auth").status_code)
|
696
|
-
self.assertEqual(401, unauthorized.client.get("/basic_auth").status_code)
|
697
|
-
|
698
|
-
def test_log_request_name_argument(self):
|
699
|
-
class MyUser(HttpUser):
|
700
|
-
tasks = []
|
701
|
-
host = "http://127.0.0.1:%i" % self.port
|
702
|
-
|
703
|
-
@task()
|
704
|
-
def t1(l):
|
705
|
-
l.client.get("/ultra_fast", name="new name!")
|
706
|
-
|
707
|
-
my_locust = MyUser(self.environment)
|
708
|
-
my_locust.t1()
|
709
|
-
|
710
|
-
self.assertEqual(1, self.runner.stats.get("new name!", "GET").num_requests)
|
711
|
-
self.assertEqual(0, self.runner.stats.get("/ultra_fast", "GET").num_requests)
|
712
|
-
|
713
|
-
def test_redirect_url_original_path_as_name(self):
|
714
|
-
class MyUser(HttpUser):
|
715
|
-
host = "http://127.0.0.1:%i" % self.port
|
716
|
-
|
717
|
-
l = MyUser(self.environment)
|
718
|
-
l.client.get("/redirect")
|
719
|
-
|
720
|
-
self.assertEqual(1, len(self.runner.stats.entries))
|
721
|
-
self.assertEqual(1, self.runner.stats.get("/redirect", "GET").num_requests)
|
722
|
-
self.assertEqual(0, self.runner.stats.get("/ultra_fast", "GET").num_requests)
|
723
|
-
|
724
|
-
|
725
|
-
class TestCatchResponse(WebserverTestCase):
|
726
|
-
def setUp(self):
|
727
|
-
super().setUp()
|
728
|
-
|
729
|
-
class MyUser(HttpUser):
|
730
|
-
host = "http://127.0.0.1:%i" % self.port
|
731
|
-
|
732
|
-
self.locust = MyUser(self.environment)
|
733
|
-
|
734
|
-
self.num_failures = 0
|
735
|
-
self.num_success = 0
|
736
|
-
|
737
|
-
def on_request(request_type, name, response_time, response_length, exception, context, **kwargs):
|
738
|
-
if exception:
|
739
|
-
self.num_failures += 1
|
740
|
-
self.last_failure_exception = exception
|
741
|
-
else:
|
742
|
-
self.num_success += 1
|
743
|
-
|
744
|
-
self.environment.events.request.add_listener(on_request)
|
745
|
-
|
746
|
-
def test_catch_response(self):
|
747
|
-
self.assertEqual(500, self.locust.client.get("/fail").status_code)
|
748
|
-
self.assertEqual(1, self.num_failures)
|
749
|
-
self.assertEqual(0, self.num_success)
|
750
|
-
|
751
|
-
with self.locust.client.get("/ultra_fast", catch_response=True):
|
752
|
-
pass
|
753
|
-
self.assertEqual(1, self.num_failures)
|
754
|
-
self.assertEqual(1, self.num_success)
|
755
|
-
|
756
|
-
with self.locust.client.get("/ultra_fast", catch_response=True):
|
757
|
-
raise ResponseError("Not working")
|
758
|
-
|
759
|
-
self.assertEqual(2, self.num_failures)
|
760
|
-
self.assertEqual(1, self.num_success)
|
761
|
-
|
762
|
-
def test_catch_response_http_fail(self):
|
763
|
-
with self.locust.client.get("/fail", catch_response=True):
|
764
|
-
pass
|
765
|
-
self.assertEqual(1, self.num_failures)
|
766
|
-
self.assertEqual(0, self.num_success)
|
767
|
-
|
768
|
-
def test_catch_response_http_manual_fail(self):
|
769
|
-
with self.locust.client.get("/ultra_fast", catch_response=True) as response:
|
770
|
-
response.failure("Haha!")
|
771
|
-
self.assertEqual(1, self.num_failures)
|
772
|
-
self.assertEqual(0, self.num_success)
|
773
|
-
self.assertTrue(
|
774
|
-
isinstance(self.last_failure_exception, CatchResponseError),
|
775
|
-
"Failure event handler should have been passed a CatchResponseError instance",
|
776
|
-
)
|
777
|
-
|
778
|
-
def test_catch_response_http_manual_success(self):
|
779
|
-
with self.locust.client.get("/fail", catch_response=True) as response:
|
780
|
-
response.success()
|
781
|
-
self.assertEqual(0, self.num_failures)
|
782
|
-
self.assertEqual(1, self.num_success)
|
783
|
-
|
784
|
-
def test_catch_response_allow_404(self):
|
785
|
-
with self.locust.client.get("/does/not/exist", catch_response=True) as response:
|
786
|
-
self.assertEqual(404, response.status_code)
|
787
|
-
if response.status_code == 404:
|
788
|
-
response.success()
|
789
|
-
self.assertEqual(0, self.num_failures)
|
790
|
-
self.assertEqual(1, self.num_success)
|
791
|
-
|
792
|
-
def test_interrupt_taskset_with_catch_response(self):
|
793
|
-
class MyTaskSet(TaskSet):
|
794
|
-
@task
|
795
|
-
def interrupted_task(self):
|
796
|
-
with self.client.get("/ultra_fast", catch_response=True):
|
797
|
-
raise InterruptTaskSet()
|
798
|
-
|
799
|
-
class MyUser(HttpUser):
|
800
|
-
host = "http://127.0.0.1:%i" % self.port
|
801
|
-
tasks = [MyTaskSet]
|
802
|
-
|
803
|
-
l = MyUser(self.environment)
|
804
|
-
ts = MyTaskSet(l)
|
805
|
-
self.assertRaises(InterruptTaskSet, lambda: ts.interrupted_task())
|
806
|
-
self.assertEqual(0, self.num_failures)
|
807
|
-
self.assertEqual(0, self.num_success)
|
808
|
-
|
809
|
-
def test_catch_response_connection_error_success(self):
|
810
|
-
class MyUser(HttpUser):
|
811
|
-
host = "http://127.0.0.1:1"
|
812
|
-
|
813
|
-
l = MyUser(self.environment)
|
814
|
-
with l.client.get("/", catch_response=True) as r:
|
815
|
-
self.assertEqual(r.status_code, 0)
|
816
|
-
self.assertEqual(None, r.content)
|
817
|
-
r.success()
|
818
|
-
self.assertEqual(1, self.num_success)
|
819
|
-
self.assertEqual(0, self.num_failures)
|
820
|
-
|
821
|
-
def test_catch_response_connection_error_fail(self):
|
822
|
-
class MyUser(HttpUser):
|
823
|
-
host = "http://127.0.0.1:1"
|
824
|
-
|
825
|
-
l = MyUser(self.environment)
|
826
|
-
with l.client.get("/", catch_response=True) as r:
|
827
|
-
self.assertEqual(r.status_code, 0)
|
828
|
-
self.assertEqual(None, r.content)
|
829
|
-
r.failure("Manual fail")
|
830
|
-
self.assertEqual(0, self.num_success)
|
831
|
-
self.assertEqual(1, self.num_failures)
|