|
1 | | -from faker import Faker |
2 | | -from locust import HttpLocust, TaskSet, task |
3 | | -from random import randint, choice |
4 | | -from time import sleep |
5 | | - |
6 | 1 | import base64 |
7 | 2 |
|
| 3 | +from locust import HttpLocust, TaskSet, task |
| 4 | +from random import randint, choice |
8 | 5 |
|
9 | | -def register(l): |
10 | | - _user = getattr(l, 'user', getattr(l.parent, 'user', Faker().simple_profile())) |
11 | | - _password = getattr(l, 'password', getattr(l.parent, 'password', Faker().password())) |
12 | | - details = { |
13 | | - "username": _user.get('username'), |
14 | | - "first_name": _user.get('name').split(' ')[0], |
15 | | - "last_name": _user.get('name').split(' ')[1], |
16 | | - "email": _user.get('mail'), |
17 | | - "password": _password |
18 | | - } |
19 | | - response = l.client.post("/register", json=details) |
20 | | - return response |
21 | | - |
22 | | -def login(l): |
23 | | - _user = getattr(l, 'user', getattr(l.parent, 'user', Faker().simple_profile())) |
24 | | - _password = getattr(l, 'password', getattr(l.parent, 'password', Faker().password())) |
25 | | - users = l.client.get("/customers").json().get("_embedded", {}).get("customer", []) |
26 | | - user = [user for user in users if user.get('username') == _user.get('username')] |
27 | | - if not user: |
28 | | - register(l) |
29 | | - |
30 | | - base64string = base64.encodestring('%s:%s' % (_user.get('username'), _password)).replace('\n', '') |
31 | | - response = l.client.get("/login", headers={"Authorization":"Basic %s" % base64string}) |
32 | | - return response |
33 | | - |
34 | | -def create_card(l): |
35 | | - data = { |
36 | | - "longNum": Faker().credit_card_number(), |
37 | | - "expires": Faker().credit_card_expire(start="now", end="+10y", date_format="%m/%y"), |
38 | | - "ccv": Faker().credit_card_security_code() |
39 | | - } |
40 | | - response = l.client.post("/cards", json=data) |
41 | | - return response |
42 | | - |
43 | | -def create_address(l): |
44 | | - data = { |
45 | | - "number": str(Faker().random_int(min=1, max=9999)), |
46 | | - "street": Faker().street_name(), |
47 | | - "city": Faker().city(), |
48 | | - "postcode": Faker().postcode(), |
49 | | - "country": Faker().country() |
50 | | - } |
51 | | - response = l.client.post("/addresses", json=data) |
52 | | - return response |
53 | | - |
54 | | - |
55 | | -''' |
56 | | - Tasks related to the Catalogue Page |
57 | | -''' |
58 | | -class CataloguePage(TaskSet): |
59 | | - |
60 | | - @task(20) |
61 | | - def catalogue(self): |
62 | | - self.client.get("/category.html") |
63 | | - |
64 | | - @task(10) |
65 | | - def filter(self): |
66 | | - tags = self.client.get("/tags").json().get("tags") |
67 | | - rand = randint(1, len(tags)-1) |
68 | | - l = [choice(tags) for i in range(1, rand)] |
69 | | - self.client.get("/category.html?tags={}".format('&'.join(l))) |
70 | | - |
71 | | - @task(5) |
72 | | - def stop(self): |
73 | | - self.interrupt() |
74 | | - |
75 | | - ''' |
76 | | - Tasks related to the catalogue item page |
77 | | - ''' |
78 | | - @task(10) |
79 | | - class ItemPage(TaskSet): |
80 | | - |
81 | | - @task(10) |
82 | | - def item(self): |
83 | | - catalogue = self.client.get("/catalogue").json() |
84 | | - self.client.get("/detail.html?id={}".format(choice(catalogue).get('id'))) |
85 | | - |
86 | | - @task(5) |
87 | | - def order(self): |
88 | | - catalogue = self.client.get("/catalogue").json() |
89 | | - category_item = choice(catalogue) |
90 | | - item_id = category_item["id"] |
91 | | - self.client.post("/cart", json={"id": item_id, "quantity": randint(1, 100)}) |
92 | | - |
93 | | - @task(5) |
94 | | - def stop(self): |
95 | | - self.interrupt() |
96 | | - |
97 | | - |
98 | | -''' |
99 | | - Tasks related to the Carts Page |
100 | | -''' |
101 | | -class CartPage(TaskSet): |
102 | | - tasks = {create_card:1, create_address:1} |
103 | | - |
104 | | - @task(10) |
105 | | - def cart(self): |
106 | | - self.client.get("/basket.html") |
107 | | - |
108 | | - @task(5) |
109 | | - def delete_item(self): |
110 | | - cart_items = self.client.get("/cart").json() |
111 | | - if len(cart_items) > 0: |
112 | | - item = choice(cart_items) |
113 | | - self.client.delete("/cart/{}".format(item.get("itemId"))) |
114 | | - |
115 | | - @task(5) |
116 | | - def checkout(self): |
117 | | - if not self.client.cookies.get("logged_in"): |
118 | | - login(self) |
119 | | - create_card(self) |
120 | | - create_address(self) |
121 | | - |
122 | | - with self.client.post("/orders", catch_response=True) as response: |
123 | | - if response.status_code == 406: |
124 | | - # Check if the cost was too high |
125 | | - items = self.client.get("/cart").json() |
126 | | - total = sum([item.get("unitPrice", 0) * item.get("quantity", 0) for item in items]) |
127 | | - if total > 100: |
128 | | - response.success() |
129 | | - |
130 | | - @task(5) |
131 | | - def stop(self): |
132 | | - self.interrupt() |
133 | | - |
134 | | -''' |
135 | | - Website related tasks |
136 | 6 |
|
137 | | - * Index Page |
138 | | - * Register/Login |
139 | | - * Catalogue Page |
140 | | - * Item Page |
141 | | - * Add item to basket |
142 | | - * Add item to wishlist |
143 | | - * Filter socks |
144 | | - * Cart Page |
145 | | - * Remove item |
146 | | - * Add/Update Address info |
147 | | - * Add/Update Payment info |
148 | | - * Update item |
149 | | - * Checkout |
150 | | -''' |
151 | 7 | class WebTasks(TaskSet): |
152 | | - tasks = {login:15, CataloguePage:10, CartPage:5} |
153 | | - user = Faker().simple_profile() |
154 | | - password = Faker().password() |
155 | | - |
156 | | - @task(20) |
157 | | - def index(self): |
158 | | - self.client.get("/") |
159 | | - |
160 | | - |
161 | | -''' |
162 | | - Cart related API tasks |
163 | | -
|
164 | | - GET /cart |
165 | | - DELETE /cart |
166 | | - DELETE /cart |
167 | | - DELETE /cart/:id |
168 | | - POST /cart |
169 | | -''' |
170 | | -class CartTasks(TaskSet): |
171 | 8 |
|
172 | 9 | @task |
173 | | - def get_cart(self): |
174 | | - self.client.get("/cart") |
175 | | - |
176 | | - @task |
177 | | - def delete_cart(self): |
178 | | - self.client.delete("/cart") |
179 | | - |
180 | | - @task |
181 | | - def delete_cart_item(self): |
182 | | - item_id = self.post_cart() |
183 | | - self.client.delete("/cart/{}".format(item_id)) |
184 | | - |
185 | | - @task |
186 | | - def post_cart(self): |
187 | | - catalogue = self.client.get("/catalogue").json() |
188 | | - category_item = choice(catalogue) |
189 | | - item_id = category_item.get("id") |
190 | | - self.client.post("/cart", json={"id": item_id, "quantity": randint(1, 100)}) |
191 | | - return item_id |
192 | | - |
193 | | -''' |
194 | | - Catalogue related API tasks |
195 | | -
|
196 | | - GET /catalogue/images* |
197 | | - GET /catalogue* |
198 | | - GET /tags |
199 | | -''' |
200 | | -class CatalogueTasks(TaskSet): |
201 | | - |
202 | | - @task |
203 | | - def get_catalogue_images(self): |
204 | | - catalogue = self.client.get('/catalogue').json() |
205 | | - image_urls = choice(catalogue).get('imageUrl') |
206 | | - self.client.get('{}'.format(choice(image_urls))) |
207 | | - |
208 | | - @task |
209 | | - def get_catalogue(self): |
210 | | - self.client.get('/catalogue') |
211 | | - |
212 | | - @task |
213 | | - def get_tags(self): |
214 | | - self.client.get('/tags') |
215 | | - |
216 | | - |
217 | | -''' |
218 | | - Order related API tasks |
219 | | -
|
220 | | - GET /orders |
221 | | - GET /orders/* |
222 | | - POST /orders |
223 | | -''' |
224 | | -class OrdersTasks(TaskSet): |
225 | | - |
226 | | - @task |
227 | | - def get_orders(self): |
228 | | - self.post_orders() |
229 | | - self.client.get('/orders') |
230 | | - |
231 | | - @task |
232 | | - def post_orders(self): |
233 | | - if not self.client.cookies.get("logged_in"): |
234 | | - login(self) |
235 | | - create_card(self) |
236 | | - create_address(self) |
| 10 | + def load(self): |
| 11 | + base64string = base64.encodestring('%s:%s' % ('user', 'password')).replace('\n', '') |
237 | 12 |
|
238 | 13 | catalogue = self.client.get("/catalogue").json() |
239 | 14 | category_item = choice(catalogue) |
240 | 15 | item_id = category_item["id"] |
241 | | - self.client.post("/cart", json={"id": item_id, "quantity": 1}) |
242 | | - |
243 | | - with self.client.post('/orders', catch_response=True) as response: |
244 | | - if response.status_code == 406: |
245 | | - response.success() |
246 | | - |
247 | | - |
248 | | -''' |
249 | | - User related API tasks |
250 | | -
|
251 | | - GET /customers/:id |
252 | | - GET /cards/:id |
253 | | - GET /customers |
254 | | - GET /addresses |
255 | | - GET /cards |
256 | | - POST /customers |
257 | | - POST /addresses |
258 | | - POST /cards |
259 | | - DELETE /customers/:id |
260 | | - DELETE /addresses/:id |
261 | | - DELETE /cards/:id |
262 | | - POST /register |
263 | | - POST /login |
264 | | -''' |
265 | | -class UsersTasks(TaskSet): |
266 | | - |
267 | | - @task |
268 | | - def get_customer_id(self): |
269 | | - response = self.post_register() |
270 | | - customer = response.json() |
271 | | - return self.client.get('/customers/{}'.format(customer.get('id'))) |
272 | | - |
273 | | - @task |
274 | | - def get_cards_id(self): |
275 | | - response = self.post_register() |
276 | | - customer = response.json() |
277 | | - self.client.get('/cards/{}'.format(customer.get('id'))) |
278 | | - |
279 | | - @task |
280 | | - def get_customers(self): |
281 | | - self.client.get('/customers') |
282 | | - |
283 | | - @task |
284 | | - def get_addresses(self): |
285 | | - self.client.get('/addresses') |
286 | | - |
287 | | - @task |
288 | | - def get_cards(self): |
289 | | - self.client.get('/cards') |
290 | | - |
291 | | - @task |
292 | | - def post_customers(self): |
293 | | - user = Faker().simple_profile() |
294 | | - password = Faker().password() |
295 | | - data = { |
296 | | - 'firstName': user.get('name').split(' ')[0], |
297 | | - 'lastName': user.get('name').split(' ')[1], |
298 | | - 'email': user.get('mail'), |
299 | | - 'username': user.get('username'), |
300 | | - 'password': password, |
301 | | - } |
302 | | - self.client.post('/customers', json=data) |
303 | | - |
304 | | - @task |
305 | | - def post_addresses(self): |
306 | | - login(self) |
307 | | - create_address(self) |
308 | | - |
309 | | - @task |
310 | | - def post_cards(self): |
311 | | - login(self) |
312 | | - create_card(self) |
313 | | - |
314 | | - @task |
315 | | - def delete_customer(self): |
316 | | - customer = self.post_register().json() |
317 | | - self.client.delete('/customers/{}'.format(customer.get('id'))) |
318 | | - |
319 | | - @task |
320 | | - def delete_addresses(self): |
321 | | - customer = self.post_register().json() |
322 | | - self.client.delete('/addresses/{}'.format(customer.get('id'))) |
323 | | - |
324 | | - @task |
325 | | - def delete_cards(self): |
326 | | - customer = self.post_register().json() |
327 | | - self.client.delete('/cards/{}'.format(customer.get('id'))) |
328 | | - |
329 | | - @task |
330 | | - def post_register(self): |
331 | | - self.user = Faker().simple_profile() |
332 | | - self.password = Faker().password() |
333 | | - return register(self) |
334 | | - |
335 | | - @task |
336 | | - def post_login(self): |
337 | | - login(self) |
338 | | - |
339 | | - |
340 | | -''' |
341 | | - Describe API based tasks |
342 | | -''' |
343 | | -class APITasks(TaskSet): |
344 | | - tasks = [CartTasks, CatalogueTasks, OrdersTasks, UsersTasks] |
345 | | - user = Faker().simple_profile() |
346 | | - password = Faker().password() |
347 | | - |
348 | | -''' |
349 | | - Describe tasks that result in an error |
350 | | -''' |
351 | | -class ErrorHandlingTasks(TaskSet): |
352 | | - |
353 | | - @task |
354 | | - def login_fail(self): |
355 | | - base64string = base64.encodestring('%s:%s' % ("wrong_user", "no_pass")).replace('\n', '') |
356 | | - with self.client.get("/login", headers={"Authorization":"Basic %s" % base64string}, catch_response=True) as response: |
357 | | - if response.status_code == 401: |
358 | | - response.success() |
359 | | - |
360 | | - @task |
361 | | - def checkout_fail(self): |
362 | | - with self.client.post("/orders", json={}, catch_response=True) as response: |
363 | | - if response.status_code == 500: |
364 | | - response.success() |
365 | 16 |
|
| 17 | + self.client.get("/") |
| 18 | + self.client.get("/login", headers={"Authorization":"Basic %s" % base64string}) |
| 19 | + self.client.get("/category.html") |
| 20 | + self.client.get("/detail.html?id={}".format(item_id)) |
| 21 | + self.client.delete("/cart") |
| 22 | + self.client.post("/cart", json={"id": item_id, "quantity": 1}) |
| 23 | + self.client.get("/basket.html") |
| 24 | + self.client.post("/orders") |
366 | 25 |
|
367 | | -class API(HttpLocust): |
368 | | - task_set = APITasks |
369 | | - min_wait = 3000 |
370 | | - max_wait = 15000 |
371 | 26 |
|
372 | 27 | class Web(HttpLocust): |
373 | 28 | task_set = WebTasks |
374 | | - min_wait = 3000 |
375 | | - max_wait = 15000 |
376 | | - |
377 | | -class ErrorHandling(HttpLocust): |
378 | | - task_set = ErrorHandlingTasks |
379 | | - min_wait = 3000 |
380 | | - max_wait = 15000 |
| 29 | + min_wait = 0 |
| 30 | + max_wait = 0 |
0 commit comments