-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
238 lines (170 loc) · 5.84 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
<!DOCTYPE html>
<html>
<head>
<title>Locust - Testing de càrrega amb Python</title>
<meta charset="utf-8">
<style>
@import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz);
@import url(https://fonts.googleapis.com/css?family=Roboto);
@import url(https://fonts.googleapis.com/css?family=Roboto+Mono);
body { font-family: 'Roboto'; }
h1, h2, h3 {
font-family: 'Yanone Kaffeesatz';
font-weight: normal;
}
.remark-code, .remark-inline-code { font-family: 'Roboto Mono'; font-size: 0.6em }
.small {
font-size: 0.8em;
}
a:link, a:visited {
color: #E40066;
text-decoration: underline;
}
</style>
</head>
<body>
<textarea id="source">
class: center, middle
count: false
# Locust
## Testing de càrrega amb Python
![PyGRN](https://avatars1.githubusercontent.com/u/28831124?v=4&s=200)
[Eduard Carreras i Nadal](mailto:[email protected])
27/09/2018 - PyGRN #8
[![](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/)
---
# Qui sóc jo?
- Sóc un infiltrat en el món del software (sóc teleco)
- Apassionat del software i del proćes **art**esanal.
- Co-Fundador de [GISCE-TI, S.L](http://gisce.net)
- Desenvolupant en Python des del 2007 (Python ❤️)
- Amant del programari lliure
- [LinkedIn](https://www.linkedin.com/in/ecarreras/), [Twitter](https://twitter.com/ecarreras)
i [GitHub](https://github.com/ecarreras)
---
# Agenda
1. Què és testing de càrrega
2. Què és Locust
3. Algunes funcionalitats
4. Algun exemple pràctic
5. Extendre locust
---
# Què és testing de rendiment?
Les proves de rendiment són les proves que es realitzen, des d'una perspectiva,
per **determinar la rapidesa amb que realitza una tasca un sistema en condicions
*particulars* de treball**.
També pot servir per validar i verificar altres atributs de la qualitat del sistema,
com ara l'**escalabilitat**, **fiabilitat** i **ús dels recursos**.
- Proves de càrrega
- Proves d'estrés
- Proves d'estavilitat
- Proves de pics
Forma part de tècniques de testing, podeu mirar aquesta [altra xerrada on hi ha exemples](https://ecarreras.github.io/xerrada-pygrn-no-tot-es-programar/#18)
???
- Proves de càrrega:
* Comportament d'una aplicació sota una quantitat de peticions esperada.
* Aquesta càrrega pot ser el nombre esperat d'usuaris concurrents
* Mostrar els temps de resposta
* Monitoritzar altres parts i detectar colls d'ampolla
- Proves d'estrés
* Com els tests de càrrega per intentant buscar els **limits** de l'aplicació
- Proves d'estavilitat
* Una càrrega esperada continuada. Es pot fer servir per detectar fugues de memòria
- Proves de pics
* Observar com evoluciona el sistema en pics de peticions, normlament per detectar sistemes
que escalen automàticament
---
# Què és Locust
És una eina que ens permet fer tests de rendiment **escrivint els comportaments en Python**
- Pàgina web: [https://locust.io/](https://locust.io/)
- Llenguatge principal: Python
- Llicència: MIT
- Codi: [https://github.com/locustio/locust](https://github.com/locustio/locust)
---
# Algunes funcionalitats
- Comportaments escrits en codi Python
- Distribuït i escalable
- Estadístiques en temps real via web
- *Hackejable*
---
# Algun exemple pràctic (I)
- El comportament es definexi en un fitxer `locustfile.py`
```bash
$ locust --host=http://example.com
```
- Obrim el navegador web a [http://127.0.0.1:8089/](http://127.0.0.1:8089/)
![](locust_web.png)
---
# Algun exemple pràctic (II)
## Parts d'un `locustfile.py`
- **Locust**: Representa a un usuari (o perfil d'usuari)
- Definir temps mínim/màxim entre tasques
- Es poden definir tants perfils com es vulguin en un test
- Es poden donar importancia diferent a cada perfil
- **TaskSet**: Representa un conjunt de tasques a realitzar
- Definir temps mínim/màxim del conjunt de tasques
- Definir donar més importància una tasca que a una altra
- Es poden definir tasques anidades
---
# Algun exemple pràctic (III)
```python
from locust import HttpLocust, TaskSet, task
class UserBehavior(TaskSet):
def on_start(self):
""" on_start is called when a Locust start before any task is scheduled """
self.login()
def on_stop(self):
""" on_stop is called when the TaskSet is stopping """
self.logout()
def login(self):
self.client.post("/login", {"username":"ellen_key", "password":"education"})
def logout(self):
self.client.post("/logout", {"username":"ellen_key", "password":"education"})
@task(2)
def index(self):
self.client.get("/")
@task(1)
def profile(self):
self.client.get("/profile")
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 5000
max_wait = 9000
```
---
# Extendre locust
- Events Hooks
Podem subscriure'ns a diferents esdeveniments durant un test: *request success*,
*request failure*, ...
- Altres protocols
Està molt pensat per protocol HTTP, però podem escriure qualsevol client
que implementi un altre protocol. [locust-xmlrpc](https://github.com/gisce/locust-xmlrpc)
- Web
La web està feta amb [Flask](http://flask.pocoo.org/) per tant es pot extendre fent:
```python
from locust import web
@web.app.route("/added_page")
def my_added_page():
return "Another page"
```
---
class: center, middle
# Preguntes?
# 🙈 🙉 🙊
---
class: center, middle
# Moltes gràcies!
</textarea>
<script src="https://remarkjs.com/downloads/remark-latest.min.js">
</script>
<script>
var slideshow = remark.create({
highlightStyle: 'darcula',
highlightLanguage: 'remark',
highlightLines: true,
slideNumberFormat: '%current%/%total%',
ratio: '4:3'
});
</script>
</body>
</html>