Skip to content
This repository was archived by the owner on Dec 5, 2023. It is now read-only.

Commit bc8d1a4

Browse files
authored
Merge pull request #17 from microservices-demo/simple-test
Simplified tests
2 parents 384fa3c + 1690f4f commit bc8d1a4

File tree

1 file changed

+14
-364
lines changed

1 file changed

+14
-364
lines changed

locustfile.py

Lines changed: 14 additions & 364 deletions
Original file line numberDiff line numberDiff line change
@@ -1,380 +1,30 @@
1-
from faker import Faker
2-
from locust import HttpLocust, TaskSet, task
3-
from random import randint, choice
4-
from time import sleep
5-
61
import base64
72

3+
from locust import HttpLocust, TaskSet, task
4+
from random import randint, choice
85

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
1366

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-
'''
1517
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):
1718

1729
@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', '')
23712

23813
catalogue = self.client.get("/catalogue").json()
23914
category_item = choice(catalogue)
24015
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()
36516

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")
36625

367-
class API(HttpLocust):
368-
task_set = APITasks
369-
min_wait = 3000
370-
max_wait = 15000
37126

37227
class Web(HttpLocust):
37328
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

Comments
 (0)