-
Notifications
You must be signed in to change notification settings - Fork 129
/
Copy pathtests-unitarios.html
192 lines (165 loc) · 7.44 KB
/
tests-unitarios.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
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Desarrollo ágil: Organización de los tests unitarios</title>
<link rel="stylesheet" href="dist/reset.css">
<link rel="stylesheet" href="dist/reveal.css">
<link rel="stylesheet" href="dist/extra.css">
<link rel="stylesheet" href="dist/agil.css" id="theme">
<!-- Theme used for syntax highlighted code -->
<link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme">
</head>
<body>
<div class="reveal">
<div class="slides">
<section><h2>Desarrollo ágil</h2>
<h1>Tests unitarios</h1>
<h3><a href="https://jj.github.io/curso-tdd/temas/tests-unitarios-organización"><code>jj.github.io/curso-tdd/temas/tests-unitarios</code></a></h3>
</section>
<section><h2>✓ TODO</h2>
<h2 class="fragment">□ ¿Los milestones
internos son productos mínimamente viables? </h2>
<h2 class="fragment">□ ¿Se han integrado
tareas en el gestor?</h2>
</section>
<section><h1>Recordatorio: Se comprueban
<strong>comportamientos</strong></h1>
<h2 class="fragment">Reflejados en las
historias de usuario</h2>
<aside class="notes">Sin las HUs es un caos. Si es "no
sé quién me dijo" que, acaban apareciendo las costuras por
algún lado". No se hacen productos coherentes, ni productos
que el equipo pueda sacar adelante</aside>
</section>
<section><h1>Los tests se ejecutan desde
<em>frameworks</em> de test</h1>
<aside class="notes">En muchos casos son
indistinguibles de la biblioteca de
aserciones, pero en muchos lenguajes, como
JavaScript, están aparte.</aside>
</section>
<section><h1>Principios F.I.R.S.T</h1>
<h2 class="fragment">Fast, independent, repeatable,
self-validating, timely</h2>
<h2 class="fragment">Red/green/refactor</h2>
<h1 class="fragment">Lo importante son los
tests</h1>
<aside class="notes">Es decir, lo de hacerlos primero no
hace falta que se lleve a cabo. Y lo de "timely" y "fast"
muchas veces no depende del marco o de los tests en sí, sino
del framework</aside>
</section>
<section><h1>Tests en Elixir (con
<code>mix</code>)</h1>
<pre><code data-line-numbers="1,2|5-8|10-12">defmodule IssueTest do
use ExUnit.Case
doctest Issue
setup_all do
this_issue = %Issue{ projectname: 'Foo', id: '1'}
{:ok, issue: this_issue}
end
test "Initial issue state",context do
assert context[:issue].state == :Open
end
end</code></pre>
</section>
<section><h1><em>Arrange</em>, <em>act</em>,
<em>assert</em></h1>
<aside class="notes">Corresponde a cada uno de los
tests, a lo que se va a hacer en cada paso.</aside>
</section>
<section><h1>TypeScript con <code>jest</code></h1>
<pre><code data-line-numbers="1|2,4-6|7-11">import { Issue, State } from '../Project/Issue';
var data: Issue;
beforeAll(() => {
data = new Issue("Foo",1);
});
test("all", () => {
expect( data.show_state() ).toBe( State.Open );
data.close();
expect( data.show_state() ).toBe( State.Closed );
}); </code></pre>
<aside class="notes">Arrange sería el
beforeAll; es similar al setup del que hemos hablado antes (y desde luego
parecidísimo a una fixture), lo que
ocurre es que jest permite que se hagan precondiciones antes de
cualquier test, y también antes y después de cada una de las
instrucciones de test que se
ejecuten</aside>
</section>
<section><h1>Go es su propio marco de test</h1>
<pre><code data-line-numbers="9,16">package HitosIV
import (
"testing"
"reflect"
)
func TestHitos (t *testing.T){
t.Log("Test Id");
if CuantosHitos() <= 0 {
t.Error("No milestones")
}
}
func TestTodosHitos (t *testing.T){
t.Log("Test Todos");
these_milestones := Hitos()
if reflect.TypeOf(these_milestones).String() == "Data" {
t.Error("No milestones here")
}
}</code></pre>
<aside class="notes">En realidad el segundo se
puede eliminar, porque estamos testeando el setup. Sirva como
ilustración, de todas formas.</aside>
</section>
<section><h1><em>Hooks</em> para tests locales</h1>
<pre><code data-line-numbers="4|6|9">my $is_head = `git rev-parse --verify HEAD`;
my $last_commit = $is_head?"HEAD":"4b825dc642cb6eb9a060e54bf8d69288fbee4904";
my @changes = `git diff-index --name-only $last_commit`;
my %policies = ( no_underscore => qr/_/ );
for my $f (@changes) {
for my $p ( keys %policies ) {
if ($f =~ /$policies{$p}/) {
die "[FORMATO]: $p ";
}
}
}</code></pre>
<aside class="notes">Para que los ficheros
sigan una serie de políticas de nombres, en Perl
en este caso. Por supuesto, se trataría de
crear esos hooks para poder pasar tests, linters o
cualquier otra cosa que hiciera falta,
localmente. Muchos van a ir más en la categoría de
código limpio o respetar estándares, pero se puede
ejecutar cualquier cosa. Y, por supuesto, forma la
base de los sistemas de CI/CD que se verán a continuación.</aside>
</section>
<section><h1>✓ TODO hito 12</h1>
<h2 class="fragment">Elegir marco de test +
añadir <code>test</code> a tareas</h2>
<h3 class="fragment"> En
<code>agil.yaml</code></h3>
<pre class="fragment"><code data-line-numbers="1|2|3">testing:
runner: make
framework: prove </code></pre>
</section>
</div>
</div>
<script src="dist/reveal.js"></script>
<script src="plugin/notes/notes.js"></script>
<script src="plugin/markdown/markdown.js"></script>
<script src="plugin/highlight/highlight.js"></script>
<script>
// More info about initialization & config:
// - https://revealjs.com/initialization/
// - https://revealjs.com/config/
Reveal.initialize({
hash: true,
width: "95%",
slideNumber: true,
// Learn about plugins: https://revealjs.com/plugins/
plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ]
});
</script>
</body>
</html>